REA*_*EE 7 regex tokenize lexer
我不确定如何为词法分析器标记源代码.现在,我只能想到使用正则表达式将字符串解析为具有给定规则的数组(标识符,符号,如+, - 等).
例如,
begin x:=1;y:=2;
Run Code Online (Sandbox Code Playgroud)
然后我想标记单词,变量(在这种情况下为x,y)和每个符号(:,=,;).
使用正则表达式是生成令牌的传统方式.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