如何在BISY语法中使用声明的C++变量
我试图在名为“mismatches”的变量中保留一个错误计数,我在bison文件的第一部分中声明了该变量 在我的bison语法中,我为那个变量设置了一个值 然后在bison文件的第三部分,在main函数中我计算了它的值,它是0 我的bison文件的一个非常修改/精简的版本:如何在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
%{
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时碰巧遇到了这个问题。