Проблема Yacc: сделать данные доступными в следующем нетерминале - PullRequest
0 голосов
/ 25 декабря 2008

Я хочу сделать некоторые переменные, сгенерированные в b, доступными в c:

a   :   b c { ...some code...}

Простой пример:

b :  X  { int result = 0; } 
  |  Y  { int result = 1; }

так что я могу позже сказать:

c : D   { printf(result + 1); }
  | E   { printf(result + 2);  }

Есть ли шанс сделать это? Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 25 декабря 2008

result должна быть глобальной переменной. Вы можете сделать это, включив

%{
    int result;
%}

вверху вашего файла YACC. Конечно, вы также должны заменить int result = 0 и int result = 1 на result = 0 и result = 1 соответственно.

0 голосов
/ 25 декабря 2008

Вы можете сделать так, как предлагает Can, однако, как правило, не рекомендуется использовать глобальные переменные в правилах синтаксиса. Объявите тип для 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);};
...