2016-04-25 3 views
0

Ich bin verwirrt zwischen Syntax Directed Translation und Parser mit Bison geschrieben. (Die Hauptverwirrung besteht darin, ob der in Bison geschriebene Parser bereits aus syntaxgesteuertem Übersetzer besteht.) Ich umformuliere den obigen Satz in Klammern als (Wie implementiert Bison Syntax Directed Translation, indem er für Eg $$ = $ 1 + $ 3 anfügt)Fragen über Syntax gerichtete Übersetzung und Bison Parser

Diese link sagt, dass

der C-Code in einer Aktion der semantischen Werte der Komponenten abgestimmt durch die Regel mit dem Konstrukt $ n beziehen kann, die für den Wert der n-ten Komponente steht. Der semantische Wert für die zu konstruierende Gruppierung ist $$. (Bison übersetzt beide dieser Konstrukte in Feldelement Referenzen, wenn es kopiert die Aktionen in den Parser-Datei.)

Und auch in Kapitel 5 (Syntax Directed Analysis) der book sagt

Grammatik + semantische Regeln = Syntax Directed Translation

PRODUCTION   SEMANTIC RULE 
→1 +   {. = 1. ┤| . |′+′} 

Wenn im folgenden Ausschnitt von Übersetzungsregeln für einen einfachen Parser aus dem Buch suchst Flex and Bison

%% 
E: F default $$ = $1 
     | E ADD F { $$ = $1 + $3; } 
     | E SUB F { $$ = $1 - $3; } 
    ; 
%% 

Ist .code equavelent zu $$ ich so verwirrt bin. Ist syntaxgesteuerte Analyse dasselbe wie semantische Analyse? Je mehr ich lese, desto verwirrter bin ich. Jemand bitte hilf mir das zu klären.

+0

Mögliche Duplikate von [Was bedeutet syntaxgesteuerte Übersetzung?] (Http://stackoverflow.com/questions/15984605/what-does-syntax-directed-translation-mean) –

Antwort

0

Ihr Verständnis scheint korrekt zu sein, ist aber verwirrt durch die Tatsache, dass Ihr Beispiel aus dem Dragon Buch und Beispiel-Parser zwei verschiedene Dinge tun - das Dragon Buch übersetzt den Ausdruck in Code, während der einfache Parser den Ausdruck bewertet , nicht übersetzen (also ist dies wirklich Syntax-orientierte Auswertung, nicht Syntax gerichtete Übersetzung).

In den im Dragon-Buch beschriebenen semantischen Regeln können Symbole mehrere Attribute haben, die sowohl synthetisiert als auch vererbt werden. Das ist, was das .code Suffix bedeutet - es ist ein Attribut der Symbole, auf die es angewendet wird. Bison auf der anderen Seite ermöglicht jedem Symbol, ein einzelnes synthetisiertes Attribut zu haben - nicht mehr und keine geerbten Attribute. Wenn Sie mehrere attributes möchten, können Sie sie zusammen in eine struct sammeln und diese als Ihr Attribut verwenden (erfordert eine sorgfältige Verwaltung). Wenn Sie vererbte Attribute möchten, können Sie $0 und noch vorsichtigere Verwaltung verwenden, oder Sie können Globals verwenden, um den gleichen Effekt zu erhalten.

Der Bison-Schnipsel, die zu Ihrem Drachen Buch Beispiel Schnipseln entsprechen würden wäre so etwas wie:

E : E ADD F { $$ = AppendCode($1, $3, PLUS); } 

das einzelne Bison-Attribut für das .code Attribut und den Anfügevorgang für den Code zu tun als eine Funktion erzeugt wird .