好吧,我想我的问题是不言自明的。
我目前正在Bison中构建一个解析器,我想把错误报告做得更好一些。
目前,我已经设置了 %define parse.error verbose
(它实际上给出了这样的信息 syntax error, unexpected ***********************, expecting ********************
.
我只想在错误信息中添加更多的信息,例如:行号(在inputfileetc中)。
我现在 yyerror
(好吧,没有什么......不寻常的......lol) 。
void yyerror(const char *str)
{
fprintf(stderr,"\x1B[35mInterpreter : \x1B[37m%s\n",str);
}
P.S.
%locations
指令,这很可能是 很 接近我所需要的东西--然而,我仍然没有找到完整的工作实例,我也不知道该如何使用。所以,我这里有一个 分步走 :
%locations
语法文件中的指令(在 %}
和第一个 %%
)#include "mygrammar.tab.h"
),在文件的顶部%option yylineno
选项(介于 %}
和第一个 %%
)而现在,在我们的 yyerror
函数(它应该在我们的词典文件中),我们可以自由地使用这个... yylineno
(=当前文件中被处理的行) :
void yyerror(const char *str)
{
fprintf(stderr,"Error | Line: %d\n%s\n",yylineno,str);
}
是的,就这么简单!就这么简单! :-)
我的工作是添加 extern int yylineno
在 .ypp
文件。
/* parser.ypp */
%{
extern int yylineno;
%}
/* scanner.lex */
...
%option yylineno
野牛号有许多例子来展示它的特点,见: /usr/local/share/doc/bison/examples
在您的机器上(其中前缀为 /usr/local
取决于您的配置。
这些例子可能会让你感兴趣。