Проблема с Якком:Сделать данные доступными в следующем нетерминале
Вопрос
Я хочу сделать некоторые переменные, которые я генерирую в b, доступными в c:
a : b c { ...some code...}
Простой пример:
b : X { int result = 0; }
| Y { int result = 1; }
поэтому я могу позже в c сказать:
c : D { printf(result + 1); }
| E { printf(result + 2); }
Есть ли шанс это сделать?Любая помощь будет очень признательна!
Решение
result
должна быть глобальной переменной.Вы можете сделать это, включив
%{
int result;
%}
в верхней части вашего файла YACC.Конечно, вам также следует заменить int result = 0
и int result = 1
с result = 0
и result = 1
соответственно.
Другие советы
Вы можете сделать так, как предложил Джан, однако, как правило, использование глобальных переменных в правилах синтаксиса не является хорошей идеей.Объявите тип для b
и c
поэтому ваши правила выглядят так:
%union {
int result;
};
%type <result> a b
%start a
%%
b : X {$$ = 0;} | Y {$$ = 1;} ;
c : D {$$ = 1;} | E {$$ = 2;} ;
a : b c {printf("%d", $1 + $2);};
Не связан с StackOverflow