06.10.2013 Aufrufe

Sprachtechnologie und Compiler

Sprachtechnologie und Compiler

Sprachtechnologie und Compiler

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

1 Attributierte Grammatiken<br />

2 Zyklische AG<br />

3 Codeerzeugung mit AGs<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 1 / 28


Beispiel: Taschenrechner mit Attributierter Grammatik<br />

Produktion Semantische Regeln<br />

1) L → En L.val = E.val<br />

2) E → E1 + T E.val = E1.val + T .val<br />

3) E → T E.val = T .val<br />

4) T → T1 ∗ F T .val = T1.val ∗ F .val<br />

5) T → F T .val = F .val<br />

6) F → (E) F .val = E.val<br />

7) F → digit F .val = digit.lexval<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 2 / 28


Zirkuläre Abhängigkeit<br />

Produktion Semantische Regeln<br />

A → B A.s = B.i<br />

B.i = A.s<br />

A<br />

B<br />

A.s<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 3 / 28<br />

B.i


Attributierter Parsebaum für 3 * 5 + 4n<br />

T .val = 3<br />

F .val = 3<br />

digit.lexval = 3<br />

E.val = 15<br />

T .val = 15<br />

+ F .val = 5<br />

E.val = 19<br />

digit.lexval = 3<br />

L.val = 19<br />

n<br />

+ T .val = 4<br />

F .val = 4<br />

digit.lexval = 4<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 4 / 28


Grammatik mit Attributierung<br />

Produktion Semantische Regeln<br />

1) T → FT ′ T ′ .inh = F .val<br />

T .val = T ′ .syn<br />

2) T ′ → ∗ FT ′ 1 T ′ 1 .inh = T ′ .inh ∗ F .val<br />

T ′ .syn = T ′ 1 .syn<br />

3) T ′ → ɛ T ′ .syn = T ′ .inh<br />

4) F → digit F .val = digit.lexval<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 5 / 28


Abhängigkeitsgraph für attributierten Parsebaum<br />

F<br />

digit<br />

3 val<br />

1 lexval<br />

T<br />

9 val<br />

inh 5<br />

T ′<br />

∗ F<br />

Parse-Baum für digit * digit.<br />

digit<br />

8 syn<br />

4 val<br />

2 lexval<br />

T ′ inh 6 7 syn<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 6 / 28<br />

ɛ


Grammatik mit Attributierung für Typdeklarationen<br />

Produktion Semantische Regeln<br />

1) D → T L L.inh = T .type<br />

2) T → int T .type = integer<br />

3) T → float T .type = float<br />

4) L → L1 , id L1.inh = L.inh; addType(id.entry, L.inh)<br />

5) L → id addType(id.entry, L.inh)<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 7 / 28


Abhängigkeitsgraph für attributierten Parsebaum<br />

T<br />

float<br />

D<br />

4 type inh 5 T 6 entry<br />

inh 9 L 10 entry<br />

id1<br />

inh 7 L 8 entry<br />

1 entry<br />

, id2<br />

Parse-Baum für float id1, id2, id3.<br />

, id3<br />

2 entry<br />

3 entry<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 8 / 28


AST-Aufbau mit AGs<br />

Produktion Semantische Regeln<br />

1) E → E1 + T E.node = new Node(+, E1.node, T .node)<br />

2) E → E1 − T E.node = new Node(−, E1.node, T .node)<br />

3) E → T E.node = T .node<br />

4) T → (E) T .node = E.node<br />

5) T → id T .node = new Leaf(id, id.entry)<br />

6) T → num T .node = new Leaf(num, num.val)<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 9 / 28


Beispiel AST-Aufbau<br />

E.node<br />

T .node<br />

id<br />

Definition von a<br />

E.node<br />

E.node<br />

− T .node<br />

−<br />

+ T .node<br />

num<br />

+<br />

id num 4<br />

id<br />

id<br />

Definition von c<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 10 / 28


Beispiel AST-Aufbau<br />

E.node<br />

T .node<br />

id<br />

Definition von a<br />

E.node<br />

E.node<br />

− T .node<br />

−<br />

+ T .node<br />

num<br />

+<br />

id num 4<br />

id<br />

id<br />

Definition von c<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 10 / 28


Attributierte Grammatik für Arraytypen<br />

Produktion Semantische Regeln<br />

T → B C T .t = C.t<br />

C.b = B.t<br />

B → int B.t = integer<br />

B → float B.t = float<br />

C → [ num ] C1 C.t = array(num.val, C1.t)<br />

C1.b = C.b<br />

C → ɛ C.t = C.b<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 11 / 28


Taschenrechner Implementierung<br />

L → E n { print(E.val); }<br />

E → E1 + T { E.val = E1.val + T .val; }<br />

E → T { E.val = T .val; }<br />

T → T1 ∗ F { T .val = T1.val ∗ F .val; }<br />

T → F { T .val = F .val; }<br />

F → (E) { F .val = E.val; }<br />

F → digit { F .val = digit.lexval; }<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 12 / 28


Parserstack mit synthetisierten Attributen<br />

. . . X Y Z Zustand/Grammatiksymbol<br />

. . . X .x Y .y Z.z Synthetisierte Attribute<br />

Stack-Spitze<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 13 / 28


Beispiel Schriftsatz<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 14 / 28


Attributierte Grammatik für den Schriftsatz<br />

Produktion Semantische Regeln<br />

1) S → B B.ps = 10<br />

2) B → B1 B2 B1.ps = B.ps<br />

B2.ps = B.ps<br />

B.ht = max B1.ht, B2.ht<br />

B.dp = max B1.dp, B2.dp<br />

3) B → B1 sub B2 B1.ps = B.ps<br />

B2.ps = 0.7 ∗ B.ps<br />

B.ht = max(B1.ht, B2.ht − 0.25 ∗ B.ps)<br />

B.dp = max(B1.dp, B2.dp + 0.25 ∗ B.ps)<br />

4) B → ( B1 ) B1.ps = B.ps<br />

B.ht = B1.ht<br />

B.dp = B1.dp<br />

5) B → text B.ht = getHt(B.ps, text.lexval)<br />

B.dp = getDp(B.ps, text.lexval)<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 15 / 28


1 Attributierte Grammatiken<br />

2 Zyklische AG<br />

3 Codeerzeugung mit AGs<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 16 / 28


Erläuterung zur AG Blockschachtelung<br />

siehe Folien Semantik Seite 12<br />

Deklarationen<br />

Block<br />

umg aus Deklarationen umg ein umg aus Deklaration<br />

.<br />

umg aus<br />

umg<br />

umg ein<br />

umg<br />

Anweisungen<br />

umg ein<br />

bezeichner symbol typ deftab variable symbol<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 17 / 28


Reparieren der zirkulären Abhängigkeit<br />

rule block ::= deklarationen ; anweisungen .<br />

attribution<br />

anweisungen.umg := deklarationen.umg aus;<br />

deklarationen.umg aus := append(block.umg,deklarationen.umg ein)<br />

rule deklarationen ::= deklarationen ’;’ deklaration.<br />

attribution<br />

deklarationen[1].umg ein := append(deklarationen[2].umg ein,<br />

deklaration.umg ein);<br />

deklarationen[2].umg aus := deklarationen[1].umg aus;<br />

deklaration.umg aus := deklarationen[1].umg aus<br />

rule deklaration ::= bezeichner ’:’ typ ’:=’ variable ’;’.<br />

attribution<br />

typ.deftab := deklaration.umg aus.search(typ.symbol);<br />

variable.deftab:=<br />

deklaration.umg aus.search(variable.symbol);<br />

deklaration.umg ein :=<br />

new Umg(bezeichner.symbol,typ.deftab,...);<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 18 / 28


Reparieren der zirkulären Abhängigkeit<br />

rule block ::= deklarationen ; anweisungen .<br />

attribution<br />

anweisungen.umg := append(block.umg, declarationen.umg ein)<br />

deklarationen.umg aus := block.umg<br />

rule deklarationen ::= deklarationen ’;’ deklaration.<br />

attribution<br />

deklarationen[1].umg ein := append(deklarationen[2].umg ein,<br />

deklaration.umg ein);<br />

deklarationen[2].umg aus := deklarationen[1].umg aus;<br />

deklaration.umg aus := deklarationen[1].umg aus<br />

rule deklaration ::= bezeichner ’:’ typ ’:=’ variable ’;’.<br />

attribution<br />

typ.deftab := deklaration.umg aus.search(typ.symbol);<br />

variable.deftab:=<br />

deklaration.umg aus.search(variable.symbol);<br />

deklaration.umg ein :=<br />

new Umg(bezeichner.symbol,typ.deftab,...);<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 18 / 28


Reparierte AG<br />

Deklarationen<br />

Block<br />

umg aus Deklarationen umg ein umg aus Deklaration<br />

.<br />

umg aus<br />

umg<br />

umg ein<br />

umg<br />

Anweisungen<br />

umg ein<br />

bezeichner symbol typ deftab variable symbol<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 19 / 28


1 Attributierte Grammatiken<br />

2 Zyklische AG<br />

3 Codeerzeugung mit AGs<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 20 / 28


LAG(1)-Attributierte Grammatiken<br />

Eine Attributierte Grammatik gehört zur Klasse der LAG(1) wenn<br />

jedes Attribut entweder:<br />

synthetisiert ist<br />

ererbt ist, mit folgenden Einschränkungen:<br />

Sei A → X1 X2 . . . Xn die Produktion mit dem ererbten<br />

Attribut Xi.a. Die Berechnungsregeln für Xi dürfen nur<br />

folgende Attribute verwenden:<br />

Attribute des Kopfes A der Produktion<br />

Attribute der Symbole X1, X2, . . . , Xi−1<br />

Attribute von Xi, aber nur so, dass im Abhängigkeitsgraphen<br />

der Attribute von Xi keine Zyklen entstehen.<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 21 / 28


ekursiver Abstieg mit direkter Codeerzeugung<br />

void parse statement(label next) {<br />

label l1, l2;<br />

if (token == T while) {<br />

next token();<br />

if (token == ’(’) next token(); else error(...);<br />

l1 = new();<br />

l2 = new();<br />

print(”label”, l1);<br />

parse condition(next, l2);<br />

if (token == ’)’) next token(); else error(...);<br />

print(”label”, l2);<br />

parse statement(l1);<br />

} else {<br />

/∗ other statements ∗/<br />

}<br />

}<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 22 / 28


Attributierte Grammatik für while-Anweisungen<br />

S → while ( C ) S1<br />

L1 = new();<br />

L2 = new();<br />

S1.next = L1;<br />

C.false = S.next;<br />

C.true = L2;<br />

S.code = label||L1||C.code||label||L2||S.code<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 23 / 28


Expandierung von S entsprechend der while-Produktion<br />

Stack-Spitze<br />

while ( Action<br />

L1 = new();<br />

L2 = new();<br />

stack[top − 1].false = snext;<br />

stack[top − 1].true = L2;<br />

stack[top − 3].al1 = L1;<br />

stack[top − 3].al2 = L2;<br />

print( ′ label ′ , L1);<br />

snext = x<br />

L1<br />

L2<br />

C<br />

false = ?<br />

true = ?<br />

) Action<br />

al1 = ?<br />

al2 = ?<br />

stack[top − 1] = al1;<br />

print( ′ label ′ , al2);<br />

S1<br />

next = ?<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 24 / 28


Konstruieren der synthetisierten Attribute<br />

Stack-Spitze<br />

while ( Action<br />

L1 = new();<br />

L2 = new();<br />

stack[top − 1].true = L2;<br />

stack[top − 4].next = L1;<br />

stack[top − 5].l1 = L1;<br />

stack[top − 5].l2 = L2;<br />

L1 = ?<br />

L2 = ?<br />

C<br />

false = ?<br />

true = ?<br />

Syn.C.code<br />

code = ?<br />

stack[top − 3].Ccode = code;<br />

) S1<br />

next = ?<br />

Syn.S1.code<br />

code = ?<br />

Ccode = ?<br />

l1 = ?<br />

l2 = ?<br />

stack[top − 1].code =<br />

′ label ′ ||l1||Ccode<br />

|| ′ label ′ ||l2||code;<br />

Syn.S.code<br />

code = ?<br />

data<br />

actions<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 25 / 28


Erweiterte Produktionen mit Dummy-Nonterminals zur<br />

Attributberechnung<br />

S → while ( M C ) B S1<br />

M → ɛ<br />

N → ɛ<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 26 / 28


LR-Parserstack nach der Reduktion von ɛ zu M<br />

?<br />

S.next<br />

Stack-Spitze<br />

while ( M<br />

C.true<br />

C.false<br />

L1<br />

L2<br />

Code, der während der<br />

Reduktion von ɛ zu M<br />

ausgeführt wird:<br />

L = new();<br />

L = new();<br />

C.true = L2;<br />

C.false =<br />

stack[top − 3].next<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 27 / 28


LR-Parserstack mit Attributberechnung<br />

?<br />

S.next<br />

while ( M<br />

C.true<br />

C.false<br />

L1<br />

L2<br />

C<br />

C.code<br />

) N<br />

S1.next<br />

Stack-Spitze<br />

S1<br />

S1.code<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 28 / 28


Ausgeführte Aktionen<br />

tempCode = label||stack[top − 4].L1||stack[top − 3].code||<br />

top = top − 5;<br />

stack[top].code = tempCode;<br />

label||stack[top − 4].L2||stack[top].code;<br />

Zusatzfolien Semantische Analyse Wintersemester 2008/09 29 / 28

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!