Yacc Problema: rendere disponibili i dati nel prossimo non Terminal
Domanda
Vorrei fare alcune variabili che generano in b disponibile in c:
a : b c { ...some code...}
Un semplice esempio:
b : X { int result = 0; }
| Y { int result = 1; }
in modo da poter, in seguito in c dire:
c : D { printf(result + 1); }
| E { printf(result + 2); }
C'è qualche possibilità di farlo? Qualsiasi aiuto sarebbe molto apprezzato!
Soluzione
result
dovrebbe essere una variabile globale. È possibile farlo includendo
%{
int result;
%}
nella parte superiore del file YACC. Naturalmente, si dovrebbe sostituire anche int result = 0
e int result = 1
rispettivamente con result = 0
e result = 1
.
Altri suggerimenti
Si può fare come suggerito Can, però in genere non è una buona idea usare variabili globali nelle regole di sintassi. Dichiarare un tipo per b
e c
in modo che le regole di simile a questa:
%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);};
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow