好的,所以我想我的问题很明显。
我目前正在Bison中构建一个解析器,我想让错误报告更好一些。
目前,我已设置%define parse.error verbose
(实际上会提供syntax error, unexpected ***********************, expecting ********************
等消息。
我想要的只是在错误消息中添加更多信息,例如行号(在输入/文件/等中)
我当前的yyerror
(没什么......不寻常......哈哈):
void yyerror(const char *str)
{
fprintf(stderr,"\x1B[35mInterpreter : \x1B[37m%s\n",str);
}
P.S。
%locations
指令,它很可能非常接近我需要的东西 - 但是,我仍然没有找到完整的工作示例而且我是不知道如何使用它。答案 0 :(得分:5)
所以,我来这里是一步一步的解决方案:
%locations
指令(在%}
和第一个%%
之间)#include "mygrammar.tab.h"
),位于顶部%option yylineno
选项(在%}
和第一个%%
之间)现在,在我们的yyerror
函数中(可能会在我们的词法分析器文件中),我们可以自由地使用它... yylineno
(=正在处理的文件中的当前行) :
void yyerror(const char *str)
{
fprintf(stderr,"Error | Line: %d\n%s\n",yylineno,str);
}
是的。就那么简单! : - )
答案 1 :(得分:1)
对我有用的是在extern int yylineno
文件中添加.ypp
:
/* parser.ypp */
%{
extern int yylineno;
%}
/* scanner.lex */
...
%option yylineno
答案 2 :(得分:0)
Bison附带了许多示例以演示其功能,请参阅计算机上的/usr/local/share/doc/bison/examples
(前缀/usr/local
取决于您的配置。
您可能会对这些示例特别感兴趣:
error
令牌进行错误恢复。yyexpected_tokens
。