【发布时间】:2011-09-21 23:15:54
【问题描述】:
我正在使用 bison+flex 来解析文件。出错时调用 yyerror()。如何获取违反规则的行号或字符串,并打印错误消息?
【问题讨论】:
标签: c++ c bison flex-lexer
我正在使用 bison+flex 来解析文件。出错时调用 yyerror()。如何获取违反规则的行号或字符串,并打印错误消息?
【问题讨论】:
标签: c++ c bison flex-lexer
行号很简单:yylineno 是行号。在 .l 文件的顶部指定 %option yylineno。
嗯,几乎很容易。前瞻有时会使行号减一。与其说“错误发生在第 #xxx 行”,不如说错误发生在第 #xxx 行附近。
至于其余的,由您决定。您将不得不捕获不太有效的语法并调用适当的警告或错误处理程序。有关详细信息,请参阅 O'Reilly “flex & bison”一书;它有一整章关于错误消息。在这个问答网站上复制一整章有点太多了。
【讨论】:
yylineno 为您提供正在处理的 lineno
您还可以让用户知道 yytext 在 flex 端出现错误的文本:
0|([1-9]{DIG}*) {
String msg("some error with number: "); msg.append(yytext);
yyerror(msg.c_str());
}
yytext 只包含匹配规则的文本。
如果你想给出整行,你必须自己做,打开文件寻找行号 yylineno 并打印它,这样做的好地方是提供你自己的 yyerror 实现功能。
【讨论】: