【问题标题】:Bison: Syntax Error processing, unexpected and undefined<token>Bison:语法错误处理,意外和未定义<token>
【发布时间】:2021-11-17 04:33:15
【问题描述】:

我想在 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 中实现它以及如何实现?

【问题讨论】:

    标签: error-handling compiler-errors bison


    【解决方案1】:

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

    .        { return yytext[0]; }
    

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

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

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

    %option yylineno
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 2010-11-28
      相关资源
      最近更新 更多