我试图在一个名为'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'?
答案 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;
}