【问题标题】:bison/flex: print erroneous linebison/flex:打印错误的行
【发布时间】:2011-09-21 23:15:54
【问题描述】:

我正在使用 bison+flex 来解析文件。出错时调用 yyerror()。如何获取违反规则的行号或字符串,并打印错误消息?

【问题讨论】:

    标签: c++ c bison flex-lexer


    【解决方案1】:

    行号很简单:yylineno 是行号。在 .l 文件的顶部指定 %option yylineno

    嗯,几乎很容易。前瞻有时会使行号减一。与其说“错误发生在第 #xxx 行”,不如说错误发生在第 #xxx 行附近。

    至于其余的,由您决定。您将不得不捕获不太有效的语法并调用适当的警告或错误处理程序。有关详细信息,请参阅 O'Reilly “flex & bison”一书;它有一整章关于错误消息。在这个问答网站上复制一整章有点太多了。

    【讨论】:

    • 感谢您的快速回复。 “至于其余的,由你决定” :) 好吧,这就是我的问题的重点 - 如何捕捉违规行?
    • @user497208:对你最后一个问题的迟来的回答:你(无意中)要我写一本书,或者一本书的一章。写一本书,甚至一本书的一章或一节,有点超出了互联网问答网站(如 Stack Overflow)的范围。我给出了详细介绍该主题的一本书的名称。阅读它!
    【解决方案2】:

    yylineno 为您提供正在处理的 lineno

    您还可以让用户知道 yytext 在 flex 端出现错误的文本:

    0|([1-9]{DIG}*)    {
                        String msg("some error with number: "); msg.append(yytext);
                        yyerror(msg.c_str());
                       }
    

    yytext 只包含匹配规则的文本。

    如果你想给出整行,你必须自己做,打开文件寻找行号 yylineno 并打印它,这样做的好地方是提供你自己的 yyerror 实现功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      相关资源
      最近更新 更多