Warum muss ich $<nVal>4
explizit im folgenden Grammatik-Snippet verwenden?Bison Grammar% Typ und% Token
Ich dachte, die %type <nVal> expr
Linie würde die Notwendigkeit entfernen, so dass ich $4
einfach setzen kann?
Ist es nicht möglich, eine andere Definition für expr
zu verwenden, damit ich das kann?
%union
{
int nVal;
char *pszVal;
}
%token <nVal> tkNUMBER
%token <pszVal> tkIDENT
%type <nVal> expr
%%
for_statement : tkFOR
tkIDENT { printf("I:%s\n", $2); }
tkEQUALS
expr { printf("A:%d\n", $<nVal>4); } // Why not just $4?
tkTO
expr { printf("B:%d\n", $<nVal>6); } // Why not just $6?
step-statement
list
next-statement;
expr : tkNUMBER { $$ = $1; }
;
aktualisieren rici Antwort folgen. Das funktioniert jetzt einen Genuss:
for_statement : tkFOR
tkIDENT { printf("I:%s\n", $2); }
tkEQUALS
expr { printf("A:%d\n", $5 /* $<nVal>5 */); }
tkTO
expr { printf("A:%d\n", $8 /* $<nVal>8 */); }
step-statement
list
next-statement;
Danke - Sie sind völlig richtig. – SparkyNZ
Ich bekomme es - eine "Mid Rule Action" ist die geschweiften Klammer "Blobs", die in der Mitte der Regel erscheinen, anstatt am Ende erscheinen. Wenn ich also am Ende eine Regel hätte, hätten alle meine ursprünglichen Nummern funktioniert. Bei Aktionen mit mittlerer Regel muss ich die Blobs der mittleren Regel in die Nummerierung aufnehmen. – SparkyNZ