我正在使用flex为自定义语言生成词法分析器。我遇到的问题是,一旦我发现一个错误的令牌......我无法分辨其他令牌是否跟随这个令牌。 e.g。
int v1,v2;
v1=10;v2=20;
v1=v2+1v;
print(v1);
~return;
此处,令牌流将是id,<,>,id,&lt ;;> ......该语言指定每个令牌由空格分隔。因此,在1之后看到v会产生错误,扫描仪必须打印该错误。在那之后,有更多的合法令牌和另一个非法令牌(〜返回)。如何处理剩余的合法令牌并打印第二个错误。 我使用flex作为扫描仪生成器。当我发现lexeme的正则表达式都不匹配时,我调用了一个打印相应消息的错误例程。
如何在调用此例程后恢复处理?
答案 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)一起在错误点之后继续解析。
同样,似乎必须有更好的解决方案。