Yacc Problem: Stellen verfügbar Daten in der nächsten Non-Terminal
Frage
Ich möchte einige Variablen mache ich in b in c verfügbar erzeugen:
a : b c { ...some code...}
Ein einfaches Beispiel:
b : X { int result = 0; }
| Y { int result = 1; }
so kann ich später in c sagen:
c : D { printf(result + 1); }
| E { printf(result + 2); }
Gibt es eine Chance, das zu tun? Jede Hilfe wäre wirklich dankbar!
Lösung
result
sollte eine globale Variable sein. Sie können dies tun, indem
%{
int result;
%}
an der Spitze Ihrer YACC Datei. Natürlich sollten Sie auch jeweils int result = 0
und int result = 1
mit result = 0
und result = 1
ersetzen.
Andere Tipps
Sie können tun, wie Can vorgeschlagen, aber in der Regel ist es keine gute Idee Globals in Syntaxregeln zu verwenden. Deklarieren Sie einen Typ für b
und c
so Ihre Regeln wie folgt aussehen:
%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);};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow