使用正则表达式为词法分析器标记字符串是不是一个坏主意?

REA*_*EE 7 regex tokenize lexer

我不确定如何为词法分析器标记源代码.现在,我只能想到使用正则表达式将字符串解析为具有给定规则的数组(标识符,符号,如+, - 等).

例如,

begin x:=1;y:=2;
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*ton 6

使用正则表达式是生成令牌的传统方式.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;
Run Code Online (Sandbox Code Playgroud)

字符序列可选地与令牌一起传递.

单独的字符本身就是令牌[例如";" )未经修改地传递.它不是唯一的方法,但我发现它工作得很好.

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


Oak*_*Oak 5

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

尽管就性能而言,如果您自己进行操作可能会更有效率,但这不是必须的。