如何在bison语法中使用声明的c ++变量

时间:2012-10-10 16:04:17

标签: c++ bison

我试图在一个名为'mismatches'的变量中保留一个错误计数,我在bison文件的第一部分中声明。

在我的野牛语法中,我为该变量设置了一个值。

然后在bison文件的第3部分中,在main()函数中我输出它的值,它是0。

我的野牛文件的一个非常修改/减少的版本:

%{
extern "C" FILE *yyin;
extern int yylineno;
extern int yynerrs;

int yylex();

// Declare 'mismatches'
int mismatches;

%}

%error-verbose


%%

expression:
          expression ADDOP term
          {
                     cout << "Parser is now here. Going to set `mismatches` to 6";
                     mismatches = 6;
          }
          | term
          ;

%%

int  main()
{         
          // Outputs 0
          cout << mismatches;

          yyparse();

          return 1;

}

我该怎么办才能在变异文件的所有部分使用变量'mismatches'?

2 个答案:

答案 0 :(得分:3)

如果您想计算语法错误,则插入计数器更新的明显位置是yyerror。

此外,您应该使用

%{
int counter;
%}

因为您将获得与包含标题在内的文件一样多的“计数器”副本。如果您从另一个文件显示“counter”,那么显示0就不足为奇了,因为您显示了名为counter的另一个变量。

如果你使用Bison(并且足够近),你宁愿做这样的事情:

%code provides
{
  extern int counter;

}
%code
{
  int counter;
}

或者,使用%{...%}声明它(即使用extern),然后在第二个{{之后}定义它(即没有extern 1}}。

答案 1 :(得分:2)

我认为你想在运行解析器之后输出变量,就像这样

int  main()
{         
      yyparse();
      cout << mismatches;

      return 1;
}