我正在学习编译器构造课程,我目前的任务是为我们正在实现的语言编写词法分析器。我不知道如何满足词法分析器必须识别连接标记的要求。也就是说,没有用空格分隔的标记。例如:字符串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); }
%%
当我运行它(或我的完整版本)并将其传递给 input39if
时,错误规则匹配并且输出为ERROR: 39if
,当我希望它是:
number: 39
keyword: if
(即,就像我39 if
作为输入输入一样。)
根据手册,我有一种预感,原因是错误规则匹配的可能输入比数字和关键字规则更长,而 flex 会更喜欢它。也就是说,我不知道如何解决这种情况。编写一个将拒绝所有非错误输入的显式正则表达式似乎是不可行的,而且我不知道如何编写“catch-all”规则来处理词法分析器错误。
更新:我想我可以制定包罗万象的规则,. { exit(1); }
但我想获得一些比“我在第 1 行感到困惑”更好的调试输出。