在野牛的yyerror-如何获得更多信息?

时间:2013-12-11 19:13:44

标签: bison flex-lexer

我有H.W任务,我需要使用Bison和flex。

我需要在Bison文件中编写一个yyerror函数,它会在屏幕上写入有问题的行号(来自输入文件),并且需要告诉Bison停止的令牌(来自堆栈它正在建设)

有一种简单的方法吗?

我尝试使用lex文件中的yylineno但是出错了。 解决方案的每个搜索选项都空手而归:(

3 个答案:

答案 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_oneoption_two中实施错误,以便捕获特定错误。