Bison:错误消息中包含的行号

Dr.*_*eon 2 c++ yacc lex bison flex-lexer

好的,所以我想我的问题是不言而喻的。

我目前正在Bison中构建一个解析器,并且我想使错误报告更好一些。

目前,我已设置%define parse.error verbose(实际上会发出类似的消息syntax error, unexpected ***********************, expecting ********************

我只想在错误消息中添加一些更多信息,例如行号(在输入/文件/等位置)

我目前yyerror(没什么...不寻常...大声笑):

void yyerror(const char *str)
{
    fprintf(stderr,"\x1B[35mInterpreter : \x1B[37m%s\n",str);
}
Run Code Online (Sandbox Code Playgroud)

聚苯乙烯

  • 我浏览了最新的Bison文档,但是我似乎很迷路...
  • 我也研究了该%locations指令,该指令很可能与我需要的指令非常接近-但是,我仍然没有找到完整的工作示例,并且不确定如何使用该指令。

Dr.*_*eon 6

因此,这里有一个逐步解决方案

  • 我们将%locations指令添加到语法文件中(在%}第一个之间%%
  • 我们确保我们的词法分析器文件#include "mygrammar.tab.h"顶部包含解析器的包含文件(例如)
  • 我们将%option yylineno选项添加到lexer文件中(在%}第一个之间%%

现在,在我们的yyerror函数中(应该在我们的lexer文件中),我们可以自由使用此... yylineno (=正在处理的文件中的当前行)

void yyerror(const char *str)
{
    fprintf(stderr,"Error | Line: %d\n%s\n",yylineno,str);
}
Run Code Online (Sandbox Code Playgroud)

是的 就那么简单!:-)

  • 可能值得一提的是,“yylineo”是由“flex”提供的。即,如果“yyerror”在其他地方实现,则需要外部声明。@Chris Dodd:“选项野牛位置”听起来不错,但对我来说不起作用。如果添加的话,它会在词法分析器的第一条规则处给我一个错误:“yylval”是一个指针;你的意思是使用'->'`吗?我正在使用 bison `%union` fwiw... (flex 2.6.4/bison 3.0.4) (3认同)
  • `%locations`(与lexer文件中的`%option bison-locations'结合使用)使您可以访问`yylloc`,它同时提供行和列信息,但与`yylineno'完全独立。 (2认同)
  • 您还必须在 bison 文件中的“%}”和“%%”之间添加“extern int yylineno;” (2认同)