2017-05-10 2 views
0

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; 

Antwort

2

Warum ist es, dass ich $<nVal>4 explizit in den folgenden Grammatik-Schnipseln zu benutzen?

Eigentlich sollten Sie $5 verwenden, wenn Sie auf die expr verweisen möchten. $4 ist die tkEQUALS, die keinen deklarierten Typ hat, so dass jede Verwendung explizit eingegeben werden muss. $3 ist die vorherige Midrule-Aktion, die keinen Wert hat, da $$ in dieser Aktion nicht zugewiesen ist.

Mit der gleichen Logik ist die zweite expr$8; $6 ist die zweite Midrule-Aktion, die auch keinen Wert (und keinen Typ) hat.

Siehe Bison manual:

Die Aktion Mitte der Regel selbst als eine der Komponenten der Regel zählt. Dies macht einen Unterschied, wenn später in derselben Regel eine weitere Aktion stattfindet (und normalerweise gibt es eine andere am Ende): Sie müssen die Aktionen zusammen mit den Symbolen zählen, wenn Sie die n in $n berechnen.

+0

Danke - Sie sind völlig richtig. – SparkyNZ

+0

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