11

我不确定我将如何标记词法分析器的来源。目前,我只能考虑使用正则表达式将字符串解析为具有给定规则(标识符、+、- 等符号)的数组。

例如,

begin x:=1;y:=2;

然后我想标记单词,变量(在这种情况下为x,y)和每个符号(:,=,;)。

4

2 回答 2

10

使用正则表达式是实现词法分析器的常用方法。如果您不想使用它们,那么无论如何您最终都会自己实现一些正则表达式部分。

虽然在性能方面,如果你自己做会更有效率,但这不是必须的。

于 2013-02-07T22:02:00.827 回答
8

使用正则表达式是生成令牌的传统方式。lex 和 yacc(或 flex 和 bison)是传统的编译器创建对,其中 lex 除了标记符号并将它们传递给 YACC 之外什么都不做

http://en.wikipedia.org/wiki/Lex_%28software%29

YACC 是一个处理符号的基于堆栈的状态机(下推自动机)。

我认为正则表达式处理是解析任何复杂程度的符号的方法。正如 Oak 所提到的,您最终将编写自己的(可能较差的)正则表达式解析器。唯一的例外是它非常简单,甚至您发布的示例也开始超过“非常简单”。

在 lex 语法中:

:=                   return ASSIGN_TOKEN_OR_WHATEVER;
begin                return BEGIN_TOKEN;
[0-9]+               return NUMBER;
[a-zA-Z][a-zA-Z0-9]* return WORD;

字符序列可选地与标记一起传递。

本身就是标记的单个字符[例如“;” ) 未经修改即可通过。它不是唯一的方法,但我发现它工作得很好。

看看: http: //www.faqs.org/docs/Linux-HOWTO/Lex-YACC-HOWTO.html

于 2013-02-07T22:14:15.137 回答