导致错误的 Bison 打印字符

Bison print character which caused an error

我正在使用 Bison 和 Flex 开发一个简单的编译器。我的语法只接受字符串 [a-z]+。如果输入是 a0,我想显示一条错误消息,类似于 'unrecognized character 0'。目前,所有非语法的东西最终都被 . 截获。所以字符串 a0 导致语法错误。我确实将 Bison parse.error 设置为详细但它给了我对用户无用的标记。有没有一种方法可以显示我想要的内容,即向用户显示输入到底有什么问题?

这在词法分析器中比在解析器中更容易做到。如果你的词法分析器(.l 文件)以这样的规则结尾:

.    { yyerror("ignoring unrecognized character '%c' in input", *yytext); }

然后将简单地跳过伪造字符(并打印消息)。或者,您可以 return 它们作为解析器的(单个)标记

.    { return *yytext; }

然后,如果您在 bison 代码中设置 %define parser.error verbose,您将收到语法错误,显示意外标记以及预期的标记。