Я пытаюсь сохранить количество ошибок в переменной, называемой «несоответствия», в которой я объявляю в первой части файла зубров.
В моей грамматике бизонов я установил значение этой переменной.
Затем в 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;
}
Что я должен сделать, чтобы переменная ‘несоответствия’ могла использоваться во всех частях файла зубра?
Я думаю, что вы хотите вывести переменную после запуска парсера, вот так
int main()
{
yyparse();
cout << mismatches;
return 1;
}
Если вы хотите посчитать синтаксис ошибки, очевидным местом для вставки обновления счетчика является yyerror.
Кроме того, вы должны не использование
%{
int counter;
%}
так как вы получите столько копий «counter», сколько у вас есть файлов, включая ваш заголовок. Если вы отображаете «счетчик» из другого файла, то неудивительно, что вы отображаете 0, так как вы отображаете другой переменная с именем counter.
При условии, что вы используете Bison (и достаточно недавно), вы бы предпочли сделать что-то вроде этого:
%code provides
{
extern int counter;
}
%code
{
int counter;
}
В качестве альтернативы используйте %{...%}
объявить это (т.е. с extern
) и определить его (т. е. без extern
) после второй %%
,