Проблема с Якком:Сделать данные доступными в следующем нетерминале

StackOverflow https://stackoverflow.com/questions/393041

  •  23-08-2019
  •  | 
  •  

Вопрос

Я хочу сделать некоторые переменные, которые я генерирую в 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);};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top