Как использовать объявленную переменную c ++ внутри грамматики бизонов

Я пытаюсь сохранить количество ошибок в переменной, называемой «несоответствия», в которой я объявляю в первой части файла зубров.

В моей грамматике бизонов я установил значение этой переменной.

Затем в 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;

}

Что я должен сделать, чтобы переменная ‘несоответствия’ могла использоваться во всех частях файла зубра?

1

Решение

Я думаю, что вы хотите вывести переменную после запуска парсера, вот так

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

return 1;
}
2

Другие решения

Если вы хотите посчитать синтаксис ошибки, очевидным местом для вставки обновления счетчика является yyerror.

Кроме того, вы должны не использование

%{
int counter;
%}

так как вы получите столько копий «counter», сколько у вас есть файлов, включая ваш заголовок. Если вы отображаете «счетчик» из другого файла, то неудивительно, что вы отображаете 0, так как вы отображаете другой переменная с именем counter.

При условии, что вы используете Bison (и достаточно недавно), вы бы предпочли сделать что-то вроде этого:

%code provides
{
extern int counter;

}
%code
{
int counter;
}

В качестве альтернативы используйте %{...%} объявить это (т.е. с extern) и определить его (т. е. без extern) после второй %%,

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector