繁体   English   中英

Bison:语法错误处理,意外和未定义<token>

[英]Bison: Syntax Error processing, unexpected and undefined<token>

例如,我想在 yyerror func 中处理未定义和意外的令牌错误(或者如果可能的话,可能由另一个 func 处理),我从 Bison 收到一条错误消息

... 
LAC: checking lookahead EXECSQL: S4
Error: popping nterm component_list ()
Stack now 0
Cleanup: discarding lookahead token $undefined ()
Stack now 0
  ERRSTAT = "%X0000002C"

但我想打印尚未建立的令牌和行号。 是否可以在 Bison 中实现它以及如何实现?

yylex返回一个没有出现在任何解析器规则中的标记号时,会报告特殊标记$undefined 大多数时候,这是词法分析器回退规则的结果:

.        { return yytext[0]; }

但是,如果您在解析器文件中声明一个标记,并且词法分析器返回该标记,但该标记实际上从未在任何规则中使用,也会发生这种情况。

未使用的标记没有名称,因为 Bison 包含在您的解析器中的名称数组不包含未使用的标记,因此无法查找最初的标记名称。 但是,您通常可以从变量yychar获取令牌编号。 如果该数字大于 0 且小于 256,则该标记可能是单字符标记,您可以使用它来打印附加错误消息。 但是,没有简单的方法可以修改由 Bison 的冗长错误消息生成的错误消息; 如果您正在使用该功能,您仍会看到无效令牌消息。

为了打印行号,你只需要在词法扫描器中启用行号计数,使用

%option yylineno

在您的 Flex ( .l ) 文件中。 然后你可以在yyerror打印yylineno的值。 (如果您使用的是“纯”(可重入)扫描仪,则yylineno将位于scanner_t对象中。在该对象是额外解析器参数的正常用例中,它也将在yyerror可用。)

我知道上面的内容有点令人困惑,因为有很多不同的代码生成选项,它们的行为略有不同。 您没有指定正在使用的特定选项,因此答案有点笼统。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM