如何识别输入字符串中的多个词法错误(使用flex)?

时间:2011-03-15 21:27:01

标签: compiler-construction flex-lexer lexical-analysis

我正在使用flex为自定义语言生成词法分析器。我遇到的问题是,一旦我发现一个错误的令牌......我无法分辨其他令牌是否跟随这个令牌。 e.g。

int v1,v2;
v1=10;v2=20;
v1=v2+1v;
print(v1);
~return;

此处,令牌流将是id,<,>,id,&lt ;;> ......该语言指定每个令牌由空格分隔。因此,在1之后看到v会产生错误,扫描仪必须打印该错误。在那之后,有更多的合法令牌和另一个非法令牌(〜返回)。如何处理剩余的合法令牌并打印第二个错误。 我使用flex作为扫描仪生成器。当我发现lexeme的正则表达式都不匹配时,我调用了一个打印相应消息的错误例程。

如何在调用此例程后恢复处理?

2 个答案:

答案 0 :(得分:2)

如果语法有重要意义,请将空格放入语法中。如果不是,因为它似乎不在这里,只是忽略规则。在需要分离令牌的情况下,空格仅在语法上是重要的,例如,在int a;

例如,COBOL有一个规则,即除了PICTURE字符串外,句点后面必须跟一个空格。实施规则比忽略它更难,所以我忽略了它。它通过了FIPS认证,并且在大约十年内没有人注意到编译器正在生产中使用。

NB处理非法字符的最佳方法是解析器错误。这样,解析器就可以应用其错误恢复策略。在词汇层面,你可以打印并忽略它们。

在lex / flex中,这只相当于最终规则为:

. return yytext[0];

答案 1 :(得分:1)

这是一个黑客,但这是我能想到的。 The Flex manual 说你可以访问YY_BUFFER_STATE

可能能够使用文件中的当前位置,从YY_BUFFER_STATE中的成员yy_input_file获取,与yyrestart(File * f)一起在错误点之后继续解析。

同样,似乎必须有更好的解决方案。