[ Inhalt ] [ Index ]

Next: Der abstrakte Programmbaum Up: Codeerzeugung Previous: Codeerzeugung

Konkrete vs. abstrakte Syntax

Wir betrachten als Beispiel die bekannte Grammatik für arithmetische Ausdrücke von OBERON-0  , so wie sie in der Ausgabedatei von bison   erscheint:

rule 35   Expression -> SimpleExpression
rule 36   Expression -> SimpleExpression Relop 
                        SimpleExpression
rule 37-42 Relop -> eqsy | neqsy | ltsy | lesy | gtsy | gesy
rule 43   SimpleExpression -> SimpleExpression Op1 Term
rule 44   SimpleExpression -> Term
rule 45   SimpleExpression -> Sign Term

rule 46-47 Sign -> addop | subop
rule 48-50 Op1 -> addop | subop | orop

rule 51   Term -> Factor Op2 Term
rule 52   Term -> Factor
rule 53-56 Op2 -> multop | divop | andop | modop
rule 57   Factor -> lpar Expression rpar
rule 58   Factor -> integer
rule 59   Factor -> ident 
rule 60   Factor -> notsy Factor

Für die weitere Übersetzung kann man viele Knoten entfernen, die nur dafür sorgen, daß Präzedenzen   eingehalten werden.

Dieser abstrakte Programmbaum     enthält jetzt nicht mehr die Informationen, die nur für die syntaktische Analyse benötigt wurden. In unserem Beispiel ergibt sich:

Expression       =  UnaryExpression | 
                    BinaryExpression |
                    Integer | Ident  

Unary Expression :: UnOp Expression

Integer          :: INTEGER
Ident            :: CHAR*

UnOp             = addsy | subsy | notsy
Selector         = (ident | Expression)*

BinaryExpression :: Expression BinOp Expression

BinOp            = neqsy | ltsy | lesy | gtsy | gesy |
                   addop | subop | andop | orop | 
                   modop | multop | divop




Next: Der abstrakte Programmbaum Up: Codeerzeugung Previous: Codeerzeugung

Prof. Dr. Reinhard Völler