我正在学习编译器构建课程,目前的任务是为我们正在实现的语言编写词法分析器。 我无法弄清楚如何满足词法分析器必须识别连接标记的要求。 也就是说,令牌没有被空格分隔。 例如:字符串39if
应该被识别为数字39
和关键字if
。 同时,词法分析器在遇到无效输入时也必须exit(1)
。
我的代码的简化版本:
%{
#include <stdio.h>
%}
%option main warn debug
%%
if |
then |
else printf("keyword: %s\n", yytext);
[[:digit:]]+ printf("number: %s\n", yytext);
[[:alpha:]][[:alnum:]]* printf("identifier: %s\n", yytext);
[[:space:]]+ // skip whitespace
[[:^space:]]+ { printf("ERROR: %s\n", yytext); exit(1); }
%%
当我运行此(或我的完整版本),并将输入39if
传递给它时,错误规则匹配,输出为ERROR: 39if
,当我希望它为:
number: 39
keyword: if
(就像我输入39 if
作为输入一样。)
通过手册 ,我有一个预感,原因是错误规则匹配比数字和关键字规则更长的输入,而flex会更喜欢它。 那就是说,我不知道如何解决这种情况。 编写一个拒绝所有非错误输入的显式正则表达似乎是不可行的,我不知道如何为了处理词法错误而编写“全能”规则。
更新:我想我可以制定全能规则. { exit(1); }
. { exit(1); }
. { exit(1); }
但我想获得一些更好的调试输出比“我糊涂了第1行”。