1

我试图在名为“mismatches”的变量中保留错误计数,我在野牛文件的第一部分中声明了该变量。

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

然后在野牛文件的第三部分,在 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'?

4

2 回答 2

3

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

此外,您不应该使用

%{
int counter;
%}

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

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

%code provides
{
  extern int counter;

}
%code
{
  int counter;
}

或者,使用%{...%}来声明它(即,with ),并在第二个之后extern定义它(即,不带extern)。%%

于 2012-10-11T07:19:39.397 回答
2

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

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

      return 1;
}
于 2012-10-10T19:23:09.207 回答