Grundlagen der Programmierung 2 (Comp-D) Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 31. Mai 2007
Operationen auf Grammatiken Ziel: Normalisierungen, Vereinfachungen Elimination bestimmter Grammatik-Konstrukte Erzeugen eines Parsers Optimierung / Verbesserung des Parsers Transformation G 1 G 2 mit L(G 1 ) = L(G 2 ) Grundlagen der Programmierung 2 (Comp-D) - 1 -
Operationen auf Grammatiken Sei G 1 G 2 mit L(G 1 ) = L(G 2 ) Erhaltung der Semantik? I.a. Es soll gelten: Parsebaum 1 (w) Parsebaum 2 (w) opsemantik 1 (w) = opsemantik 2 (w) Das erfordert: Semantik-Abbildung von G 1 nach G 2 Grundlagen der Programmierung 2 (Comp-D) - 2 -
Elimination der Epsilon-Produktionen Epsilon-Elimination: G 1 G 2 Ziel: In G 2 sollen keine Regeln der Form A ::= ε vorkommen Eigenschaften: L(G 1 ) \ {ε} = L(G 2 ) Bottom-Up-Parsing kann effizienter werden Grammatik (Anzahl Regeln) kann exponentiell wachsen. Grundlagen der Programmierung 2 (Comp-D) - 3 -
Elimination von Links-Rekursionen Bei rekursiv absteigenden Parsern: Linksrekursion in der Grammatik bewirkt eine Endlosschleife Bespiel für direkte Links-Rekursion: A ::= Aw Parserfunktion: parsea ein = parsea ein... parsew rest Grundlagen der Programmierung 2 (Comp-D) - 4 -
Links-Rekursionen Beispielgrammatik Expr ::= Expr + Term Term Term ::= 0... 9 Der rekursiv absteigende Parser dazu terminiert nicht Abhilfe: Umbau der Grammatik bei gleicher erzeugter Sprache Grundlagen der Programmierung 2 (Comp-D) - 5 -
Links-Rekursionen Definition Eine Grammatik G ist linksrekursiv, wenn es eine Folge von Nichtterminalen A 1,..., A n gibt und eine Folge von Regeln der Grammatik der Form A 1 ::= A 2 w 1, A 2 ::= A 3 w 2,..., A n ::= A 1 w n. Bei linksrekursiven G. terminiert der rekursive absteigende Parser für manche Eingaben nicht (Links-)Rekursion ist durchaus sinnvoll, aber inkompatibel mit der Methode des rekursiven Abstiegs. Grundlagen der Programmierung 2 (Comp-D) - 6 -
Elimination der Links-Rekursionen Beispiel A ::= Aα β sind die Regeln zu Nichtterminal A, β startet nicht mit A, und αβ ε. Grammatiktransformation: Erzeuge neues Nichtterminal B Ersetze obige Regeln durch: A ::= β βb B ::= α αb In der neuen Grammatik sind A, B nicht linksrekursiv. Grundlagen der Programmierung 2 (Comp-D) - 7 -
Elimination von Linksrekursion Begründung für die Korrektheit die formale Sprache zu A bleibt erhalten: Vorher: A ::= Aα β die formale Sprache zu A entspricht β(α). Nachher: A ::= β βb B ::= α αb formale Sprache zu B: entspricht (α) +. formale Sprache zu A: entspricht β(α). Grundlagen der Programmierung 2 (Comp-D) - 8 -
Elimination von Linksrekursion: Syntaxbäume Beispiel Syntaxbäume vorher und nachher: β R R α α β RA α RB RB α ε Grundlagen der Programmierung 2 (Comp-D) - 9 -
L.R.- Elimination Semantik-Transformation? Möglichkeit A: Parsebaum 2 Parsebaum 1 Rücktransformation der Parsebäume Möglichkeit B: Beobachtung: Regel entspricht assoziativem Operator mit neutralem Element: : erlaube Umklammerung und betrachte ε als neutrales Element (β α) α β (α (α ε)) Grundlagen der Programmierung 2 (Comp-D) - 10 -
Beispiel: L.R.-Elimination Expr ::= Expr Term Term Term ::= 0... 9 Nach Elimination der Linksrekursion: Expr ::= Term ExprB Term ExprB ::= Term Term ExprB Term ::= 0... 9 Vorher: 1 2 3 wird als ((1 2) 3) geklammert Nachher: als (1 (2 3)). Falsch! Abhilfe: interpretiere als 1 + ( 2) + ( 3) Grundlagen der Programmierung 2 (Comp-D) - 11 -
Beispiel: L.R.-Elimination indirekte Links-Rekursion: A ::= Sa b S ::= Bc Ad e B ::= f...... rekursiver absteigender Parser: Schleife bei bd Erkennung bei fc Grundlagen der Programmierung 2 (Comp-D) - 12 -
Linksrekusion: Zuammenfassung Es gilt: Ein Grammatik ist links-rekursiv, wenn es für ein Nichtterminal A und einen String α eine Herleitung A + Aα gibt. Jede Linksrekursivität kann durch Transformation der Grammatik beseitigt werden unter Beibehaltung der erzeugten formalen Sprache. Aber: andere Herleitungsbäume, Änderungen der Semantik-Funktion Grundlagen der Programmierung 2 (Comp-D) - 13 -
Beseitigung von Mehrdeutigkeiten Klassisches Beispiel: dangling else Stmt ::= if Expr then Stmt else Stmt if Expr then Stmt other Diese Grammatik ist mehrdeutig: if E 1 then if E 2 then S 1 else S 2 hat zwei Parsebäume ifthenelse ifthen ifthen E 1 S 2 E 1 ifthenelse E 2 S 1 E 2 S 1 S 2 Grundlagen der Programmierung 2 (Comp-D) - 14 -
Beseitigung von Mehrdeutigkeiten Diese Mehrdeutigkeiten kann man als Fehler beim Hinschreiben der Grammatik ansehen. Abhilfen: Ändere die Grammatik: gleiche erzeugte Sprache, aber keine Mehrdeutigkeit mehr Aber: nicht automatisch: Eingriff notwendig Bevorzuge bestimmte Parsebäume Keine Änderung der Grammatik Aber: Grammatik und Parser passen nicht mehr zusammen Grundlagen der Programmierung 2 (Comp-D) - 15 -
dangling else Semantik: (Prinzip): else gehört jeweils zum letzten freien then Neue Grammatik: Halbes-IF, Ganzes-IF S ::= HIF GIF HIF ::= if Expr then S GIF ::= if Expr then GIF else S other Grundlagen der Programmierung 2 (Comp-D) - 16 -
Links-Faktorisierung Problematik bei rekursiv absteigenden Parsern: Gleiche Anfänge von rechten Seiten von Regeln Optimierung: Zusammenfassen der Anfänge der Regelalternativen A ::= αβ 1 αβ 2 wird umgewandelt in: A ::= αb B ::= β 1 β 2 Kann exponentielle Verbesserung der Effizienz bedeuten. Grundlagen der Programmierung 2 (Comp-D) - 17 -
Linksfaktorisierung: Beispiel H ::= if Expr then H if Expr then G else H kann man umwandeln in Ifethen ::= if Expr then H2 ::= H G else H H ::= Ifethen H2 Grundlagen der Programmierung 2 (Comp-D) - 18 -
Linksfaktorisierung: Bemerkungen optimiert rekursiv-absteigende Parser, da unnötiges Zurücksetzen verhindert wird. Semantik: kann leicht angepasst werden, Parsebäumen sind struktur-ähnlich Sinnvoll: Zusammenfassen gleicher Anfänge rechter Seiten von Regeln. Ausklammern auch über mehrere Regeln Grundlagen der Programmierung 2 (Comp-D) - 19 -
Linksfaktorisierung: Beispiel S ::= HIF GIF HIF ::= if Expr then S GIF ::= if Expr then GIF else S wird zu: S ::= IET IET ::= if Expr then IET2 IET2 ::= HIF2 GIF2 HIF2 ::= S GIF2 ::= GIF else S GIF ::= if Expr then GIF else S Die formalen Sprachen dazu sind gleich Anzahl der Nichtterminale hat sich etwa verdoppelt. Grundlagen der Programmierung 2 (Comp-D) - 20 -