我有H.W任务,我需要使用Bison和flex。
我需要在Bison文件中编写一个yyerror函数,它会在屏幕上写入有问题的行号(来自输入文件),并且需要告诉Bison停止的令牌(来自堆栈它正在建设)
有一种简单的方法吗?
我尝试使用lex文件中的yylineno但是出错了。 解决方案的每个搜索选项都空手而归:(
答案 0 :(得分:2)
extern int yylineno;
在Bison文件的第一部分
编辑 - 同样的方法可以帮助从lex文件中获取令牌,只需写入Bison文件: extern NODEPTR yylval;
*我的项目中的yylval被定义为NODEPTR,如果你没有改变它,你应该使用int(它的默认声明)
答案 1 :(得分:0)
您可以通过创建变量来获取行号,以跟踪行号,然后在扫描程序中增加该变量(.l文件)。
要获取您需要的令牌信息,我只需在正则表达式中添加%option debug
声明。
两者的例子可以在下面的示例sudo-code中看到。
%{
//Create variable to keep track of line number
int linenum = 0;
%}
/*
* Definitions of regular expressions
* Note: You capture newlines here...
*/
%%
%option debug
/*Token definitions*/
NEWLINE \n
...
%%
{NEWLINE} {
linenum++;
}
...
int main(void) {
...
return 0;
}
答案 2 :(得分:0)
如果您想在特定生产中捕获错误,则使用yylineno除外,您可以将错误选项添加到该生产中。例如。
someproduction:
option_one clause_1
| option_two clause_2
| error { printf("Error in some production \n"); }
;
您也可以在option_one
和option_two
中实施错误,以便捕获特定错误。