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

Flex and Bison compiler doesn't show lexical errors when he meets one syntax error

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

我遇到的问题:

所有词法错误都接二连三出现,但是当编译器遇到语法错误时:

他显示了第一个语法错误之前发生的所有词法错误。

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

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

这是我的代码:

lexical.l:


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

此外,当解析器停止解析时,它会停止向扫描器询问令牌。所以不会再读取输入,也不会发现更多的词法错误。

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

Bison手册中有一章是关于error recovery. You should definitely read it, but also read through some of the examples which show how to do simple error recovery的,还有相关的解释。 Bison手册中的有用信息真的很多。