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

Compiler construction 如何识别输入字符串中的多个词汇错误(使用flex)?,compiler-construction,flex-lexer,lexical-analysis,Compiler Construction,Flex Lexer,Lexical Analysis,我正在使用flex为自定义语言生成词法分析器。我遇到的问题是,一旦我发现一个格式不正确的代币。。。我不知道还有什么其他的代币跟在这个后面。e、 g int v1,v2; v1=10;v2=20; v1=v2+1v; print(v1); ~return; 在这里,令牌流将是id、、id、,。。。。。。该语言指定每个标记用空格分隔。因此,在1之后看到v应该会产生错误,扫描仪必须打印该错误。之后,有更多的合法代币和另一个非法代币(~return)。如何处理其余的合法令牌并打印第二个错误。 我使用f

我正在使用flex为自定义语言生成词法分析器。我遇到的问题是,一旦我发现一个格式不正确的代币。。。我不知道还有什么其他的代币跟在这个后面。e、 g

int v1,v2;
v1=10;v2=20;
v1=v2+1v;
print(v1);
~return;
在这里,令牌流将是id、、id、,。。。。。。该语言指定每个标记用空格分隔。因此,在1之后看到v应该会产生错误,扫描仪必须打印该错误。之后,有更多的合法代币和另一个非法代币(~return)。如何处理其余的合法令牌并打印第二个错误。 我使用flex作为扫描仪生成器。当我发现词素的正则表达式都不匹配时,我调用一个错误例程来打印相应的消息


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

这是一个难题,但这是我能想到的全部。 说你有权访问

您可能能够使用文件中的当前位置(从yy_BUFFER_状态下的成员yy_input_文件中获取),并结合yyrestart(file*f)在错误点之后恢复解析


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

如果语法上有意义,就在语法中加上空格。如果不是,因为它似乎不在这里,忽略规则。只有当需要分隔标记时,空格才具有语法意义,例如在
inta中

例如,COBOL有一条规则,除了在图片字符串中,句点后面必须跟一个空格。执行规则比忽略它更难,所以我忽略了它。它通过了FIPS认证,在过去的十年中,没有人注意到编译器已经投入生产使用

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

在lex/flex中,这相当于有一条最终规则,内容如下:

. return yytext[0];

好问题。。。我会查看生成的lexer,看看是否有任何变量可以跟踪扫描仪的位置或在指定位置开始扫描的方法。。。