2008-12-25 19 views
0

Je veux faire des variables que je générons en b disponible dans c:Yacc Problème: Rendre les données disponibles dans la prochaine Non Terminal

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

Un exemple simple:

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

si je peux, par la suite sur in c dire:

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

Y at-il une chance de faire cela? Toute aide serait vraiment appréciée!

+0

Voir aussi: http://stackoverflow.com/questions/393104/yacc-code-after-each-non-terminal –

Répondre

1

result doit être une variable globale. Vous pouvez le faire en incluant

%{ 
    int result; 
%} 

en haut de votre fichier YACC. Bien sûr, vous devez également remplacer int result = 0 et int result = 1 avec result = 0 et result = 1 respectivement.

0

Vous pouvez faire ce que vous pouvez suggérer, mais en général ce n'est pas une bonne idée d'utiliser des globales dans les règles de syntaxe. Déclarer un type pour b et c afin que vos règles ressemblent à ceci:

%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);};