Syntaxanalyse Bottom-Up und LR(0) Daniel Matthey
Agenda Basics Bottom-Up-Parsing Compileraufbau Grammatiken Ableitungen Beispiel Parse-Baum Mehrdeutigkeit Bottom-Up-Parsing Shift-Reduce-Parser inkl. Beispiel LR(0)-Syntaxanalyse Items Die Funktionen CLOSURE(I) und GOTO(I,X) Der LR(0)-Automat inkl. Beispiel Parsertabellen Beispiel
Agenda Basics Bottom-Up-Parsing Compileraufbau Grammatiken Ableitungen Beispiel Parse-Baum Mehrdeutigkeit Bottom-Up-Parsing Shift-Reduce-Parser inkl. Beispiel LR(0)-Syntaxanalyse Items Die Funktionen CLOSURE(I) und GOTO(I,X) Der LR(0)-Automat inkl. Beispiel Parsertabellen Beispiel
Zwischencode-Generator Compileraufbau Lexikalische Analyse Syntaxanalyse Semantische Analyse Zwischencode-Generator Code-Optimierer Code-Generator
Agenda Basics Bottom-Up-Parsing Compileraufbau Grammatiken Ableitungen Beispiel Parse-Baum Mehrdeutigkeit Bottom-Up-Parsing Shift-Reduce-Parser inkl. Beispiel LR(0)-Syntaxanalyse Items Die Funktionen CLOSURE(I) und GOTO(I,X) Der LR(0)-Automat inkl. Beispiel Parsertabellen Beispiel
Grammatik Besteht aus: Terminalen Nichtterminalen Produktionen und einem Startsymbol
Grammatik Beispiel: E E + E E E * E E ( E ) E id
Agenda Basics Bottom-Up-Parsing Compileraufbau Grammatiken Ableitungen Beispiel Parse-Baum Mehrdeutigkeit Bottom-Up-Parsing Shift-Reduce-Parser inkl. Beispiel LR(0)-Syntaxanalyse Items Die Funktionen CLOSURE(I) und GOTO(I,X) Der LR(0)-Automat inkl. Beispiel Parsertabellen Beispiel
Ableitungen E → E + E → E + id → id + id E → E + E → id + E → id + id
Agenda Basics Bottom-Up-Parsing Compileraufbau Grammatiken Ableitungen Beispiel Parse-Baum Mehrdeutigkeit Bottom-Up-Parsing Shift-Reduce-Parser inkl. Beispiel LR(0)-Syntaxanalyse Items Die Funktionen CLOSURE(I) und GOTO(I,X) Der LR(0)-Automat inkl. Beispiel Parsertabellen Beispiel
Parse-Baum für id + id E E E + E E E * E E ( E ) E id
Parse-Baum für id + id E E + E E E + E E E * E E ( E ) E id
Parse-Baum für id + id E E + E id E E + E E E * E E ( E ) E id
Parse-Baum für id + id E E + E id id E E + E E E * E E ( E )
Agenda Basics Bottom-Up-Parsing Compileraufbau Grammatiken Ableitungen Beispiel Parse-Baum Mehrdeutigkeit Bottom-Up-Parsing Shift-Reduce-Parser inkl. Beispiel LR(0)-Syntaxanalyse Items Die Funktionen CLOSURE(I) und GOTO(I,X) Der LR(0)-Automat inkl. Beispiel Parsertabellen Beispiel
Mehrdeutigkeit Beispiel: id * id + id E E E E E E id id + id id id +
Agenda Basics Bottom-Up-Parsing Compileraufbau Grammatiken Ableitungen Beispiel Parse-Baum Mehrdeutigkeit Bottom-Up-Parsing Shift-Reduce-Parser inkl. Beispiel LR(0)-Syntaxanalyse Items Die Funktionen CLOSURE(I) und GOTO(I,X) Der LR(0)-Automat inkl. Beispiel Parsertabellen Beispiel
Bottom-Up-Parsing id + id E E + E E E * E E ( E ) E id
Bottom-Up-Parsing E id + id E E + E E E * E E ( E ) E id
Bottom-Up-Parsing E E id + id E E + E E E * E E ( E ) E id
Bottom-Up-Parsing E E E id + id E E + E E E * E E ( E ) E id
Agenda Basics Bottom-Up-Parsing Compileraufbau Grammatiken Ableitungen Beispiel Parse-Baum Mehrdeutigkeit Bottom-Up-Parsing Shift-Reduce-Parser inkl. Beispiel LR(0)-Syntaxanalyse Items Die Funktionen CLOSURE(I) und GOTO(I,X) Der LR(0)-Automat inkl. Beispiel Parsertabellen Beispiel
Shift-Reduce-Parser Neue Grammatik: E E + T | T T T * F | F F ( E ) | id Rechtsableitung zu id * id: E → T → T * F → T * id → F * id → id * id
Shift-Reduce-Parser Parsen von id * id E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser Parsen von id * id Stack Eingabe Aktion $ Verschieben(shift) E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser Parsen von id * id Stack Eingabe Aktion $ Verschieben(shift) $ id * id $ Reduzieren(reduce) durch F → id E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser Parsen von id * id Stack Eingabe Aktion $ Verschieben(shift) $ id * id $ Reduzieren(reduce) durch F → id $ F Reduzieren durch T → F E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser Parsen von id * id Stack Eingabe Aktion $ Verschieben(shift) $ id * id $ Reduzieren(reduce) durch F → id $ F Reduzieren durch T → F $ T Verschieben E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser Parsen von id * id Stack Eingabe Aktion $ Verschieben(shift) $ id * id $ Reduzieren(reduce) durch F → id $ F Reduzieren durch T → F $ T Verschieben $ T * id $ E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser Parsen von id * id Stack Eingabe Aktion $ Verschieben(shift) $ id * id $ Reduzieren(reduce) durch F → id $ F Reduzieren durch T → F $ T Verschieben $ T * id $ $ T * id Reduzieren durch F → id E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser Parsen von id * id Stack Eingabe Aktion $ Verschieben(shift) $ id * id $ Reduzieren(reduce) durch F → id $ F Reduzieren durch T → F $ T Verschieben $ T * id $ $ T * id Reduzieren durch F → id $ T * F Reduzieren durch T → T * F E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser Parsen von id * id Stack Eingabe Aktion $ Verschieben(shift) $ id * id $ Reduzieren(reduce) durch F → id $ F Reduzieren durch T → F $ T Verschieben $ T * id $ $ T * id Reduzieren durch F → id $ T * F Reduzieren durch T → T * F Reduzieren durch E → T E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser Parsen von id * id Stack Eingabe Aktion $ Verschieben(shift) $ id * id $ Reduzieren(reduce) durch F → id $ F Reduzieren durch T → F $ T Verschieben $ T * id $ $ T * id Reduzieren durch F → id $ T * F Reduzieren durch T → T * F Reduzieren durch E → T $ E Akzeptieren Angelehnt an DragonBook S.286 E E + T | T T T * F | F F ( E ) | id
Agenda Basics Bottom-Up-Parsing Compileraufbau Grammatiken Ableitungen Beispiel Parse-Baum Mehrdeutigkeit Bottom-Up-Parsing Shift-Reduce-Parser inkl. Beispiel LR(0)-Syntaxanalyse Items Die Funktionen CLOSURE(I) und GOTO(I,X) Der LR(0)-Automat inkl. Beispiel Parsertabellen Beispiel
LR(0)-Syntaxanalyse LL(k) und LR(k)-Sprachen: erste Buchstabe steht für die Eingabe zweiter Buchstabe steht für umgekehrte Ableitung k wird Lookahead genannt
Agenda Basics Bottom-Up-Parsing Compileraufbau Grammatiken Ableitungen Beispiel Parse-Baum Mehrdeutigkeit Bottom-Up-Parsing Shift-Reduce-Parser inkl. Beispiel LR(0)-Syntaxanalyse Items Die Funktionen CLOSURE(I) und GOTO(I,X) Der LR(0)-Automat inkl. Beispiel Parsertabellen Beispiel
Items Statt Grammatiksymbole auf dem Stack nun Zustände, die aus einer Menge von Items bestehen Folgende Items, für die Entscheidungsunterstützung, enthält die Produktion T T * F: T .T * F T T .* F T T * .F T T * F. Wir sehen 3 verschiedene Fälle
Agenda Basics Bottom-Up-Parsing Compileraufbau Grammatiken Ableitungen Beispiel Parse-Baum Mehrdeutigkeit Bottom-Up-Parsing Shift-Reduce-Parser inkl. Beispiel LR(0)-Syntaxanalyse Items Die Funktionen CLOSURE(I) und GOTO(I,X) Der LR(0)-Automat inkl. Beispiel Parsertabellen Beispiel
CLOSURE(I) Bildet eine Hülle von einer Menge von Items durch: Füge I zu CLOSURE(I) hinzu Gibt es ein Item A a.Bb in CLOSURE(I) und eine Produktion B x, so füge B .x zu CLOSURE(I) hinzu
GOTO(I,X) Spezifiziert einen Folgezustand innerhalb eines LR(0)-Automaten anhand der gegebenen Informationen I: Item Menge und X: Grammatiksymbol
Agenda Basics Bottom-Up-Parsing Compileraufbau Grammatiken Ableitungen Beispiel Parse-Baum Mehrdeutigkeit Bottom-Up-Parsing Shift-Reduce-Parser inkl. Beispiel LR(0)-Syntaxanalyse Items Die Funktionen CLOSURE(I) und GOTO(I,X) Der LR(0)-Automat inkl. Beispiel Parsertabellen Beispiel
LR(0)-Automat Zunächst Erweiterung der Grammatik zu: E‘ E E E + E E id
Der LR(0)-Automat E E + T | T T T * F | F F ( E ) | id DragonBook S.294 E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser mit Hilfe des LR(0)-Automaten Parsen von id * id Zeile Stack Symbole Eingabe Aktion (1) $ id * id $ Verschieben zu 5 GOTO(0,id) gibt uns Zustand 5 an E E + T | T T T * F | F F ( E ) | id
Der LR(0)-Automat E E + T | T T T * F | F F ( E ) | id DragonBook S.294 E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser mit Hilfe des LR(0)-Automaten Parsen von id * id Zeile Stack Symbole Eingabe Aktion (1) $ id * id $ Verschieben zu 5 (2) 05 $ id * id $ Reduzieren durch F → id Gibt es keinen Folgezustand, weiß der Parser, dass er reduzieren soll. Bei einer Reduktion wird zunächst der Produktionsrumpf vom Stack entfernt und der Produktionskopf verschoben. Zustand 5 0 3 E E + T | T T T * F | F F ( E ) | id
Der LR(0)-Automat E E + T | T T T * F | F F ( E ) | id DragonBook S.294 E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser mit Hilfe des LR(0)-Automaten Parsen von id * id Zeile Stack Symbole Eingabe Aktion (1) $ id * id $ Verschieben zu 5 (2) 05 $ id * id $ Reduzieren durch F → id (3) 03 $ F Reduzieren durch T → F E E + T | T T T * F | F F ( E ) | id
Der LR(0)-Automat E E + T | T T T * F | F F ( E ) | id DragonBook S.294 E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser mit Hilfe des LR(0)-Automaten Parsen von id * id Zeile Stack Symbole Eingabe Aktion (1) $ id * id $ Verschieben zu 5 (2) 05 $ id * id $ Reduzieren durch F → id (3) 03 $ F Reduzieren durch T → F (4) 02 $ T Verschieben zu 7 E E + T | T T T * F | F F ( E ) | id
Der LR(0)-Automat E E + T | T T T * F | F F ( E ) | id DragonBook S.294 E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser mit Hilfe des LR(0)-Automaten Parsen von id * id Zeile Stack Symbole Eingabe Aktion (1) $ id * id $ Verschieben zu 5 (2) 05 $ id * id $ Reduzieren durch F → id (3) 03 $ F Reduzieren durch T → F (4) 02 $ T Verschieben zu 7 (5) 027 $ T * id $ E E + T | T T T * F | F F ( E ) | id
Der LR(0)-Automat E E + T | T T T * F | F F ( E ) | id DragonBook S.294 E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser mit Hilfe des LR(0)-Automaten Parsen von id * id Zeile Stack Symbole Eingabe Aktion (1) $ id * id $ Verschieben zu 5 (2) 05 $ id * id $ Reduzieren durch F → id (3) 03 $ F Reduzieren durch T → F (4) 02 $ T Verschieben zu 7 (5) 027 $ T * id $ (6) 0275 $ T * id E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser mit Hilfe des LR(0)-Automaten Parsen von id * id Zeile Stack Symbole Eingabe Aktion (1) $ id * id $ Verschieben zu 5 (2) 05 $ id * id $ Reduzieren durch F → id (3) 03 $ F Reduzieren durch T → F (4) 02 $ T Verschieben zu 7 (5) 027 $ T * id $ (6) 0275 $ T * id (7) 02710 $ T * F Reduzieren durch T → T * F E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser mit Hilfe des LR(0)-Automaten Parsen von id * id Zeile Stack Symbole Eingabe Aktion (1) $ id * id $ Verschieben zu 5 (2) 05 $ id * id $ Reduzieren durch F → id (3) 03 $ F Reduzieren durch T → F (4) 02 $ T Verschieben zu 7 (5) 027 $ T * id $ (6) 0275 $ T * id (7) 02710 $ T * F Reduzieren durch T → T * F (8) Reduzieren durch E → T E E + T | T T T * F | F F ( E ) | id
Shift-Reduce-Parser mit Hilfe des LR(0)-Automaten Parsen von id * id Zeile Stack Symbole Eingabe Aktion (1) $ id * id $ Verschieben zu 5 (2) 05 $ id * id $ Reduzieren durch F → id (3) 03 $ F Reduzieren durch T → F (4) 02 $ T Verschieben zu 7 (5) 027 $ T * id $ (6) 0275 $ T * id (7) 02710 $ T * F Reduzieren durch T → T * F (8) Reduzieren durch E → T (9) 01 $ E Akzeptieren DragonBook S.298 E E + T | T T T * F | F F ( E ) | id
Agenda Basics Bottom-Up-Parsing Compileraufbau Grammatiken Ableitungen Beispiel Parse-Baum Mehrdeutigkeit Bottom-Up-Parsing Shift-Reduce-Parser inkl. Beispiel LR(0)-Syntaxanalyse Items Die Funktionen CLOSURE(I) und GOTO(I,X) Der LR(0)-Automat inkl. Beispiel Parsertabellen Beispiel
Parsertabellen Jeder Parser besteht aus: Eingabe Ausgabe Stack Treiberprogramm Parsertabelle mit zwei Teilen (ACTION und GOTO)
ACTION(i,a) Gibt dem Parser konkrete Entscheidungen an: Eingabe von Zustand i und Terminal a Ergebnisse können sein: shift j reduce accept error
Agenda Basics Bottom-Up-Parsing Compileraufbau Grammatiken Ableitungen Beispiel Parse-Baum Mehrdeutigkeit Bottom-Up-Parsing Shift-Reduce-Parser inkl. Beispiel LR(0)-Syntaxanalyse Items Die Funktionen CLOSURE(I) und GOTO(I,X) Der LR(0)-Automat inkl. Beispiel Parsertabellen Beispiel
Parsertabellen Zustand ACTION GOTO - id + * ( ) $ E T F s5 s4 1 2 3 s6 s5 s4 1 2 3 s6 acc r2 s7 r4 8 4 5 r6 9 6 10 7 s11 r1 r3 11 r5 DragonBook S.303 E E + T | T T T * F | F F ( E ) | id
LR-Parser mit Hilfe der Parsertabelle Parsen von id * id Stack Symbole Eingabe Aktion (1) id * id + id $ Verschieben zu 5 E E + T | T T T * F | F F ( E ) | id
Parsertabellen Zustand ACTION GOTO - id + * ( ) $ E T F s5 s4 1 2 3 s6 s5 s4 1 2 3 s6 acc r2 s7 r4 8 4 5 r6 9 6 10 7 s11 r1 r3 11 r5 E E + T | T T T * F | F F ( E ) | id
LR-Parser mit Hilfe der Parsertabelle Parsen von id * id Stack Symbole Eingabe Aktion (1) id * id + id $ Verschieben zu 5 (2) 05 id * id + id $ Reduzieren durch F → id E E + T | T T T * F | F F ( E ) | id
Parsertabellen Zustand ACTION GOTO - id + * ( ) $ E T F s5 s4 1 2 3 s6 s5 s4 1 2 3 s6 acc r2 s7 r4 8 4 5 r6 9 6 10 7 s11 r1 r3 11 r5 E E + T | T T T * F | F F ( E ) | id
LR-Parser mit Hilfe der Parsertabelle Parsen von id * id Stack Symbole Eingabe Aktion (1) id * id + id $ Verschieben zu 5 (2) 05 id * id + id $ Reduzieren durch F → id (3) 03 F Reduzieren durch T → F E E + T | T T T * F | F F ( E ) | id
Parsertabellen Zustand ACTION GOTO - id + * ( ) $ E T F s5 s4 1 2 3 s6 s5 s4 1 2 3 s6 acc r2 s7 r4 8 4 5 r6 9 6 10 7 s11 r1 r3 11 r5 E E + T | T T T * F | F F ( E ) | id
LR-Parser mit Hilfe der Parsertabelle Parsen von id * id Stack Symbole Eingabe Aktion (1) id * id + id $ Verschieben zu 5 (2) 05 id * id + id $ Reduzieren durch F → id (3) 03 F Reduzieren durch T → F (4) 02 T Verschieben zu 7 E E + T | T T T * F | F F ( E ) | id
Parsertabellen Zustand ACTION GOTO - id + * ( ) $ E T F s5 s4 1 2 3 s6 s5 s4 1 2 3 s6 acc r2 s7 r4 8 4 5 r6 9 6 10 7 s11 r1 r3 11 r5 E E + T | T T T * F | F F ( E ) | id
LR-Parser mit Hilfe der Parsertabelle Parsen von id * id Stack Symbole Eingabe Aktion (1) id * id + id $ Verschieben zu 5 (2) 05 id * id + id $ Reduzieren durch F → id (3) 03 F Reduzieren durch T → F (4) 02 T Verschieben zu 7 (5) 027 T * id + id $ Weitere Tabellen E E + T | T T T * F | F F ( E ) | id
Parsertabellen Zustand ACTION GOTO - id + * ( ) $ E T F s5 s4 1 2 3 s6 s5 s4 1 2 3 s6 acc r2 s7 r4 8 4 5 r6 9 6 10 7 s11 r1 r3 11 r5 E E + T | T T T * F | F F ( E ) | id
LR-Parser mit Hilfe der Parsertabelle Parsen von id * id Stack Symbole Eingabe Aktion (1) id * id + id $ Verschieben zu 5 (2) 05 id * id + id $ Reduzieren durch F → id (3) 03 F Reduzieren durch T → F (4) 02 T Verschieben zu 7 (5) 027 T * id + id $ (6) 0275 T * id + id $ E E + T | T T T * F | F F ( E ) | id
LR-Parser mit Hilfe der Parsertabelle Parsen von id * id Stack Symbole Eingabe Aktion (1) id * id + id $ Verschieben zu 5 (2) 05 id * id + id $ Reduzieren durch F → id (3) 03 F Reduzieren durch T → F (4) 02 T Verschieben zu 7 (5) 027 T * id + id $ (6) 0275 T * id + id $ (7) 02710 T * F Reduzieren durch T → T * F E E + T | T T T * F | F F ( E ) | id
LR-Parser mit Hilfe der Parsertabelle Parsen von id * id Stack Symbole Eingabe Aktion (1) id * id + id $ Verschieben zu 5 (2) 05 id * id + id $ Reduzieren durch F → id (3) 03 F Reduzieren durch T → F (4) 02 T Verschieben zu 7 (5) 027 T * id + id $ (6) 0275 T * id + id $ (7) 02710 T * F Reduzieren durch T → T * F (8) Reduzieren durch E → T (9) 01 E Verschieben (10) 016 E + id $ (11) 0165 E + id $ (12) 0163 E + F (13) 0169 E + T Reduzieren durch E → E + T (14) Akzeptieren E E + T | T T T * F | F F ( E ) | id
Parse-Baum Reduktionsschritte: F id T F T T * F E T E E + T
Fragen?