如何在BISY语法中使用声明的C++变量

如何在BISY语法中使用声明的C++变量,c++,bison,C++,Bison,我试图在名为“mismatches”的变量中保留一个错误计数,我在bison文件的第一部分中声明了该变量 在我的bison语法中,我为那个变量设置了一个值 然后在bison文件的第三部分,在main函数中我计算了它的值,它是0 我的bison文件的一个非常修改/精简的版本: %{ extern "C" FILE *yyin; extern int yylineno; extern int yynerrs; int yylex(); // Declare 'mismatches' int mi

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

在我的bison语法中,我为那个变量设置了一个值

然后在bison文件的第三部分,在main函数中我计算了它的值,它是0

我的bison文件的一个非常修改/精简的版本:

%{
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;

}

我应该怎么做才能在bison文件的所有部分中使用变量“mismatches”?

我认为您希望在运行解析器后输出变量,如下所示

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

      return 1;
}

我认为您希望在运行解析器后输出变量,如下所示

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

      return 1;
}
如果要计算语法错误,插入计数器更新的一个明显位置是yyerror

此外,您不应该使用

因为你们将得到尽可能多的副本计数器,因为你们有文件,包括你们的头。若您显示来自另一个文件的计数器,那个么显示0就不足为奇了,因为您显示的是另一个名为counter的变量

如果您使用Bison和recent,您更愿意这样做:

%code provides
{
  extern int counter;

}
%code
{
  int counter;
}
或者,使用%{…%}声明它,即使用extern,并定义它,即在第二个%%之后不使用extern。

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

此外,您不应该使用

因为你们将得到尽可能多的副本计数器,因为你们有文件,包括你们的头。若您显示来自另一个文件的计数器,那个么显示0就不足为奇了,因为您显示的是另一个名为counter的变量

如果您使用Bison和recent,您更愿意这样做:

%code provides
{
  extern int counter;

}
%code
{
  int counter;
}

或者,使用%{…%}声明它,即使用extern,并定义它,即在第二个%%之后不使用extern。

它已经存在。查看生成的文件,%{和%}之间的完整块按原样复制到生成的文件中,它也应该在生成的文件的早期,否则包含头文件可能会有问题。事实上,我确实看到了它。据我所见,它应该按预期工作。但是它的值是0。即使我没有给它赋值,也只有整数不匹配;并尝试不使用全局变量,因为它们是隐式初始化的。例如,C++的创建者Bjarne Stroutrup引用了一个引用。对于您的问题,您肯定执行解析器规则吗?是的。非常翔实的引语,谢谢。问题是我用的是cout,它已经是了。查看生成的文件,%{和%}之间的完整块按原样复制到生成的文件中,它也应该在生成的文件的早期,否则包含头文件可能会有问题。事实上,我确实看到了它。据我所见,它应该按预期工作。但是它的值是0。即使我没有给它赋值,也只有整数不匹配;并尝试不使用全局变量,因为它们是隐式初始化的。例如,C++的创建者Bjarne Stroutrup引用了一个引用。对于您的问题,您肯定执行解析器规则吗?是的。非常翔实的引语,谢谢。问题是我在使用cout时碰巧遇到了这个问题。