Flex 和 Bison 编译器在遇到一个语法错误时不会显示词汇错误



我正在使用Flex和Bison编写编译器,我编写了yyerror(char*(和一些printf((消息来显示词法和语法错误。我通过在我的文件"中添加一些错误来测试我的代码;programm.txt";以便显示应该显示的错误。(例如:int x = 89754545是一个将显示的词法错误,因为我将长度限制定义为整数(长度最大=5((

我遇到的问题:

所有的词法错误都会一个接一个地出现,但当编译器遇到语法错误时:

他展示了出现在第一个语法错误之前的所有词汇错误。

他展示了他遇到的第一个语法错误。

然后他停止编译,而不显示其他错误,无论是词汇错误还是语法错误。

这是我的代码:

词法.l:


除非在语法中添加错误恢复产品,否则bison在遇到语法错误时将停止解析。所以它不会再遇到任何错误。它只是返回一个错误值(1(。

此外,当解析器停止解析时,它将停止向扫描器请求令牌。因此,不会有更多的输入被读取,也不会发现更多的词汇错误。

错误恢复并不容易。您可能应该首先让lexer和解析器处理正确的输入。一旦您了解了语法和词汇扫描在实践中的工作原理,您可能会更容易添加信息性错误消息。从简短、专注的程序(和语法(开始几乎总是更容易,而不是生成数百行你不完全理解其交互的代码。

Bison手册中有一章是关于错误恢复的。你一定要读一读,但也要通读一些例子,这些例子展示了如何进行简单的错误恢复,以及相关的解释。野牛手册中确实有很多有用的信息。

最新更新