33
Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Embed Size (px)

Citation preview

Page 1: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Autor:Aho et al.

Syntaktische Analyse

Folie: 1

Kapitel 4Syntaktische Analyse:

LR Parsing

Page 2: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Was ist Parsing

2

Parser

CFG G

TokenString s

s L(G)

No YesErrorMessage

Parsebaumfür S in G

E numE E+EE (E)

Page 3: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Top-Down/Bottom-up Parsing

• Top-down:– Man fängt mit dem “Startsymbol” an– Man versucht den String abzuleiten

• Bottom-up:– Man fängt mit dem String an– Man versucht das Startsymbol

zu erzeugen– Produktionen werden von rechts

nach links angewandt

Ex Nat | (Ex) | Ex + Ex | Ex * Ex

Nat + NatEx + NatEx + ExEx

Page 4: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

LR(k) Bottom-up Parsing

• Links-nach-Rechts Parsing• Rechtsableitung• k Token Lookahead

Warum Rechtsableitung ??

Page 5: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Bottom-Up Parsing

• Nat + Nat * Nat• Ex + Nat * Nat• Ex + Ex * Nat• Ex + Ex * Ex• Ex + Ex• Ex

Ex

Ex Ex

Ex

+Nat *Nat Nat

Ex

Ex Nat | (Ex) | Ex + Ex | Ex * Ex

Parse:Nat + Nat * Nat

Reached start symbol success !

Corresponds to a right-mosttop-down derivation !

Page 6: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Warum LR-Parser?

• Praktisch alle Programmiersprachenkonstrukte können erkannt werden

• Mächtiger als LL– Weniger Umschreibung von Grammatiken– Kompaktere, elegantere Grammatiken

• Aber: mehr Aufwand um einen LR-Parser zu generieren.

Folie: 6

Page 7: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Handle

Folie: 7

Teilstring, Rumpf einer Produktion,Reduktion: Schritt in umgek. Rechtsableitung

Page 8: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Handle II

Folie: 8

w: nur Terminalsymbole

Page 9: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Shift-Reduce Parsing

Folie: 9

Verschieben von Eingabe auf Stack (shift)Reduzieren auf dem Kopf vom Stack (reduce)AkzeptierenFehler erkennen

Page 10: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Beispiel 1

Folie: 10

Page 11: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

• Warum ist der Handle immer oben auf dem Stack (und nicht in der Mitte) ?

Folie: 11

In beiden Fällen: shift um Handle oben auf Stack zu bringen

Page 12: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Shift-Reduce Parsing STACK INPUT FILE ACTION Nat + Nat * Nat shift

Nat + Nat * Nat reduce

Ex + Nat * Nat shift

Ex + Nat * Nat shift

Ex +Nat * Nat reduce

Ex +Ex * Nat shift

Ex +Ex* Nat shift

Ex +Ex*Nat reduce

Ex +Ex*Ex reduce

Ex +Ex reduce

Ex SUCCESS

Ex Nat | (Ex) | Ex + Ex | Ex * Ex

Idee vom LR(1) parsing:Vorhersage der Aktion auf Basis: - Status vom Stack - nächstes Token der Eingabe

Shift reduce Konflikt

Page 13: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Algorithmen für dasShift-Reduce Parsing

• LR(0), SLR, LR(k), LALR(k)– LR(k) mächtiger als LL(k)

• Kompliziert• aber es gibt Parsergeneratoren:

– Yacc [C],CUP, SableCC [Java] LALR(1) Parser

• In der Vorlesung:nur ein Beispiel– Intuition bekommen

Page 14: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Item

• LR(0)-Item (kurz Item):– eine Produktion mit einem Punkt im Rumpf– Intuitiv:

• potenziell anwendbare Regel• was links vom Punkt steht haben wir schon

gesehen; wir erwarten noch was rechts vom Punkt steht

• Für A → XYZ:

Folie: 14

Page 15: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Closure (Hülle) von Item-Mengen

Folie: 15

Page 16: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Ein Beispiel für Closure

• I = {[E’→.E]}• Closure(I):

Page 17: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Funktion GOTO

• GOTO(I,X):– Hülle aller Items [A→αX.β] so dass

[A→α.Xβ] I∈

• Wird für Übergänge in einem Automaten verwendet

Folie: 17

Page 18: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Ein Beispiel für Goto

• I = {[E’→E.], [E→E.+T]}• GOTO(I,+):

Page 19: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Kanonische Sammlung vonLR(0)-Item-Mengen

Folie: 19

Page 20: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Ein Beispiel für Items

Page 21: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Autor:Aho et al.

Syntaktische Analyse

Folie: 21

T

Page 22: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Verwendung des LR(0) Automaten:SLR-Parsing

• Startzustand: Closure({[S’→.S]})• Nächstes Eingabesymbol: a

– Falls Übergang für a existiert: shift– Falls [A→α.] in Item-Menge und

a in Follow(A):**• reduce mit Regel A→α• Zustand vom Stapel nehmen, Goto A anwenden

– Falls a=$ und [S’->S.] in Item-Menge: akzeptieren

– Sonst: Fehlermeldung

Folie: 22

**: Unterschied zwischen LR(0) und SLR

Page 23: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Folie: 23

1 2

4

5 6

3

s6 =shift nach Zustand 6r6 = reduce mit Regel 6

Page 24: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Folie: 24

id*id

Page 25: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Folie: 25

id*id+id

Page 26: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Einschränkungen von SLR

Folie: 26

I2 bei =: - shift nach I6

- reduce R → L

Grammatik eindeutig

Page 27: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

LR(1)-Items

• [A→α.β, a] wobei a der Lookahead ist

• [A→α., a] bedeutet dass eine Reduktion nur möglich ist wenn das nächste Eingabesymbol a ist

• LALR(k): “komprimierte” Fassung von LR(k)

Folie: 27

Page 28: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Overview

Page 29: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Mehrdeutige Grammatiken:Shift-Reduce Konflikte

• if a then if b then s1 else s2– if a then { if b then s1 else s2 } or– if a then {if b then s1} else s2

• if E then if E then S else s2if E then if E then S else s2if E then S else s2

S if E then S else S| if E then S | ...

shift

reduceEine Lösung: shift als “Default”

Page 30: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Yacc

Folie: 30

Page 31: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Autor:Aho et al.

Syntaktische Analyse

Folie: 31

Page 32: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Für die Klausur

• Bottom-up Shift/Reduce Parsing• Prinzip des SLR Parsing• Benutzen eines (LA)LR

Parsergenerators

• Nicht notwendig:– Unterschied zwischen LR,LALR,SLR

Page 33: Kapitel 4 Compiler Autor: Aho et al. Syntaktische Analyse Folie: 1 Kapitel 4 Syntaktische Analyse: LR Parsing

Kapitel 4

Compiler

Syntaktische Analyse

Autor:Aho et al.

Was haben wir gelernt

• Lexer– Reguläre Ausdrücke, NFA, DFA– lex

• Parser– kontextfreie Grammatiken– LL(1) Rekursiv-absteigendes Parsing– Shift-Reduce Bottom-up Parsing, SLR

• Was kommt:– SableCC Lexer+Parser Generierung– Semantische Analyse

Folie: 33