Universität Karlsruhe (TH) Lehrstuhl für Programmierparadigmen Sprachtechnologie und Compiler WS 2008/2009 Dozent: Prof. Dr.-Ing. G. Snelting Übungsleiter: Matthias Braun Lösung zu Übungsblatt 2 http://pp.info.uni-karlsruhe.de/ [email protected] [email protected] Ausgabe: 30.10.2008 Besprechung: 5.11.2008 Aufgabe 1: Praxis: Flex Unter http://pp.info.uni-karlsruhe.de/lehre/WS200809/compiler/uebung/minicalc.zip finden Sie ein C-Programm zum Berechnen von einfachen mathematischen Ausdrücken. Auf der Homepage zur Übung 1 finden sich weitere Informationen zur Installation von flex. 1.1 Scanner Der enthaltene Scanner wurde in flex geschrieben, ist allerdings unvollständig. Erweitern Sie diesen um folgende Tokentypen: • T PLUS: das ’+’ Zeichen • T MINUS: das ’-’ Zeichen • T STAR: das ’*’ Zeichen • T SLASH: das ’/’ Zeichen • T LBRACE: das ’(’ Zeichen • T RBRACE: das ’)’ Zeichen • T NUMBER: Eine Zahl. Diese beginnt mit einer Ziffernfolge. Danach kann ein Punkt und optional weitere Ziffern folgen. Alternativ darf die Zahl nur mit einem Punkt beginnen, wenn danach mindestens eine Ziffer folgt. Enthält die Zahl einen Punkt, so darf der Buchstabe e oder E angehängt werden, gefolgt von einem optionalen + oder - und weiteren Ziffern. Zusätzlich soll bei T NUMBER Tokens der Wert der Zahl im Token vermerkt werden. Hinweise: • In flex enthält die Variable yytext den erkannten String. • Die Funktion scanf ermöglicht es einen String in eine Gleitpunktzahl zu konvertieren: sscanf( string , ”%f”, &variable); • Der parser Code enthält eine Debughilfe. Lösung: http://pp.info.uni-karlsruhe.de/lehre/WS200809/compiler/uebung/minicalc_solution. zip 1 http://pp.info.uni-karlsruhe.de/lehre/WS200809/compiler/uebung Aufgabe 2: Kontextfreie Grammatik 1 2.1 Einfache Grammatiken 1 Betrachten Sie die folgende kontextfreie Grammatik und den String aa+a*: S →S S +|S S ∗|a • Geben Sei eine Linksableitung für den String an. Lösung: S → S S ∗ → S S + S ∗ → aS + S ∗ → aa+ S ∗ → aa+a∗ • Geben Sie eine Rechtsableitung für den String an. Lösung: S → S S ∗ → S a∗ → S S + a∗ → S a+ a∗ → aa+a∗ • Geben Sie einen Parse-Baum für den String an. Lösung: S S S S a a S + ∗ a • Ist die Grammatik mehrdeutig oder nicht? Begründen Sie Ihre Antwort. Lösung: Die Grammatik ist nicht mehrdeutig. • Beschreiben Sie die von dieser Grammatik generierte Sprache. Lösung: Die Grammatik beschreibt eine Postfix-Notation von Ausdrücken mit einer + und einer - Operation. 2.2 Einfache Grammatiken 2 Wiederholen Sie die vorige Aufgabe mit S →S (S )S | und dem String (()()). 2 Lösung: Linksableitung: S →S (S )S →(S )S →(S (S )S S )S →((S )S S )S →(()S S )S →(()S )S → (()S (S )S )S →(()(S )S )S →(()()S )S →(()())S →(()()) Rechtsableitung: S →S (S )S →S (S )→S (S (S )S )→S (S (S ))→S (S ())→S (S (S )S ())→ S (S (S )())→S (S ()())→S (()())→(()()) Parsebaum: S ( S S ( S ( ) S ) S S ) S S S Die Grammatik ist nicht eindeutig, Beispiel für einen alternativen Parsebaum des Strings: S ( S S ) S ( ) S S S S ( S ) S Die von der Grammatik generiert Sprache ist die Menge aller korrekten Klammerungen. 2.3 Entwerfen von Grammatiken Entwerfen Sie Grammatiken für: • Die Menge aller Strings aus 0 und 1 mit derselben Anzahl von 0 und 1 Lösung: S →S 0S 1S |S 1S 0S | • Die Menge aller Strings aus 0 und 1 mit einer ungleichen Anzahl von 0 und 1 Lösung: S → G Z + G Z ∗ G | G O+ G O∗ G G → G 0G 1G |G 1G 0G | Z+ → 0 Z∗ Z∗ → 0 Z∗ | O+ → 1 O∗ O∗ → 1 O∗ | • Die Menge aller Strings aus 0 und 1 in der 011 nicht als Teilstring vorkommt 3 Lösung: Als endlicher Automat würde das so aussehen: 1 0 start Z0 0 Z1 1 1 Z2 F 0 Daraus lässt sich leicht eine Grammatik konstruieren: S → | 1S | 0Z1 Z1 → | 0Z1 | 1Z2 Z2 → | 0Z1 4 Aufgabe 3: Kontextfreie Grammatik 2 Gegeben folgende Grammatik: Satz → Subjekt Praedikat . Subjekt → Nomen Attribut Nomen → Pronomen | Artikel Adjektive Substantiv Praedikat → Verb Adverben Adjektiv | Verb Objekte Adverben Attribut Adjektive → Adjektive Adjektiv | Objekte Objekt Adverben Attribut Artikel Verb Adverb → Objekt | Objekt Objekt → Nomen Attribut → Adverben Adverb | → | Praeposition Substantiv → der|die|das|des|dem|den|ein|eine|eines|einem|dieser|kein|PossesivPronomen| → bin|ist|hat|gehe|traf |fliegen → naemlich|vielleicht|hier|damals|morgen|gerne|leider|links|hinterher Substantiv → Junge|Bruder|Schloss|Jaeger|Leben|Blau|Gelb|Fliegen|CD|Satz|Verb Adjektiv Pronomen → schnell|fliegende|teure|schoen|neue → ich|du|er|sie|es|PossesivPronomen PossesivPronomen Praeposition → mein|dein|sein|seinem → in|an|mit 3.1 Ableitungen Geben Sie eine Ableitung für folgende Sätze an: 1. das Leben ist naemlich schön. Lösung: Satz → Subjekt Praedikat . → Nomen Attribut Praedikat . → Nomen Praedikat . → Artikel Adjektive Substantiv Praedikat . → das Leben Praedikat . → das Leben Verb Adverben Adjektiv . → das Leben ist Adverben Adverb schoen . → das Leben ist naemlich schoen . 2. Blau ist das neue Gelb. Lösung: Satz → Subjekt Praedikat . → Nomen Attribut Praedikat . → Nomen Praedikat . → Artikel Adjektive Substantiv Praedikat . → Substantiv Praedikat . → Blau Praedikat . → Blau Verb Objekte Adverben Attribut. → Blau ist Objekte Adverben Attribut. → Blau ist Objekt Adverben Attribut. → Blau ist Nomen Attribut Adverben Attribut. → Blau ist Nomen Adverben Attribut. → Blau ist Artikel Adjektive Substantiv Adverben Attribut. → Blau ist das Adjektive Substantiv Adverben Attribut. → Blau ist das Adjektive Adjektiv Substantiv Adverben Attribut. → Blau ist das Adjektiv Substantiv Adverben Attribut. → Blau ist das neue Substantiv Adverben Attribut. → Blau ist das neue Gelb Adverben Attribut. → Blau ist das neue Gelb Attribut. → Blau ist das neue Gelb . 3. schnell fliegende Fliegen fliegen Fliegen hinterher. 5 Lösung: Satz → Subjekt Praedikat . → Nomen Attribut Praedikat . → Nomen Praedikat . → Artikel Adjektive Substantiv Praedikat . → Adjektive Substantiv Praedikat . → Adjektive Adjektiv Substantiv Praedikat . → Adjektive Adjektiv Adjektiv Substantiv Praedikat . → Adjektive Adjektive Adjektiv Substantiv Praedikat . → Adjektive Adjektiv Substantiv Praedikat . → schnell Adjektiv Substantiv Praedikat . → schnell fliegende Substantiv Praedikat . → schnell fliegende Fliegen Praedikat . → schnell fliegende Fliegen Verb Objekte Adverben Attribut . → schnell fliegende Fliegen fliegen Objekte Adverben Attribut . → schnell fliegende Fliegen fliegen Objekt Adverben Attribut . → schnell fliegende Fliegen fliegen Nomen Attribut Adverben Attribut . → schnell fliegende Fliegen fliegen Artikel Adjektive Substantiv Attribut Adverben Attribut . → schnell fliegende Fliegen fliegen Artikel Adjektive Substantiv Attribut Adverben Attribut . → schnell fliegende Fliegen fliegen Substantiv Attribut Adverben Attribut . → schnell fliegende Fliegen fliegen Fliegen Attribut Adverben Attribut . → schnell fliegende Fliegen fliegen Fliegen Adverben Attribut . → schnell fliegende Fliegen fliegen Fliegen Adverben Adverb Attribut . → schnell fliegende Fliegen fliegen Fliegen Adverb Attribut . → schnell fliegende Fliegen fliegen Fliegen hinterher Attribut . → schnell fliegende Fliegen fliegen Fliegen hinterher . 4. der Junge bringt seinem Bruder die teure CD. Lösung: Satz → Subjekt Praedikat . → Nomen Attribut Praedikat . → Nomen Praedikat . → Artikel Adjektive Substantiv Praedikat . → der Adjektive Substantiv Praedikat . → der Substantiv Praedikat . → der Junge Praedikat . → der Junge Verb Objekte Adverben Attribut . → der Junge bringt Objekte Adverben Attribut . → der Junge bringt Objekt Objekt Adverben Attribut . → der Junge bringt Nomen Attribut Objekt Adverben Attribut . → der Junge bringt Artikel Adjektive Substantiv Attribut Objekt Adverben Attribut . → der Junge bringt PossesivPronomen Adjektive Substantiv Attribut Objekt Adverben Attribut . → der Junge bringt seinem Adjektive Substantiv Attribut Objekt Adverben Attribut . → der Junge bringt seinem Adjektive Substantiv Attribut Objekt Adverben Attribut . → der Junge bringt seinem Substantiv Attribut Objekt Adverben Attribut . → der Junge bringt seinem Bruder Attribut Objekt Adverben Attribut . → der Junge bringt seinem Bruder Objekt Adverben Attribut . → der Junge bringt seinem Bruder Nomen Adverben Attribut . → der Junge bringt seinem Bruder Artikel Adjektive Substantiv Adverben Attribut . → der Junge bringt seinem Bruder die Adjektive Substantiv Adverben Attribut . → der Junge bringt seinem Bruder die Adjektive Adjektiv Substantiv Adverben Attribut . → der Junge bringt seinem Bruder die Adjektiv Substantiv Adverben Attribut . → der Junge bringt seinem Bruder die teure Substantiv Adverben Attribut . → der Junge bringt seinem Bruder die teure CD Adverben Attribut . → der Junge bringt seinem Bruder die teure CD Attribut . → der Junge bringt seinem Bruder die teure CD . 5. dieser Satz kein Verb. Lösung: Keine Ableitung möglich ⇒ Satz gehört nicht zur Sprache. 3.2 Mehrdeutigkeit Ist die Grammatik eindeutig? Geben Sie ein Gegenbeispiel oder eine Begründung für die Eindeutigkeit an! 6 Lösung: Man kann mehrdeutige Sätze konstruieren. Zum Beispiel: ich traf den Jaeger mit seinem Gewehr. Dieser Satz ist (auch im Deutschen) syntaktisch mehrdeutig. den Jaeger mit seinem Gewehr kann beim Ableiten als einzelnes Objekt interpretiert werden. Alternativ kann man den Jaeger als Objekt interpretieren und traf . . . mit seinem Gewehr als Verb mit zugehörigem Attribut. 7 Aufgabe 4: Grammar Engineering 4.1 Elimination der Linksrekursion Es folgt eine Grammatik für reguläre Ausdrücke über die Symbole a und b: rexpr → rexpr + rterm | rterm rterm → rterm rfactor | rfactor rfactor rprimary → rfactor ∗ | rprimary → a|b • Führen Sie eine Linksfaktorisierung dieser Grammatik durch. Lösung: Eine Linksfaktorisierung ändert an der gegebenen Grammatik nichts. • Macht die Linksfaktorisierung sie für Top-Down-Parsing geeignet? Lösung: Nein. Die Grammatiken enthält Linksrekursionen und ist daher für Top-Down-Parsing ungeeignet. • Eliminieren Sie anschließend die Linksrekursion aus der ursprünglichen Grammatik. Lösung: Nutze Regeln aus der Vorlesung: A → A α | β lässt sich umformen zu: A → βA0 und A0 → αA0 | Daraus ergibt sich: rexpr rexpr 0 → rterm rexpr 0 → + rexpr 0 | rterm → rfactor rterm 0 rterm 0 → rfactor rterm 0 | rfactor → rprimary rfactor 0 rfactor 0 → rprimary ∗ rfactor 0 | → a|b • Eignet sich die resultierende Grammatik für Top-Down-Parsing. Lösung: Ja. 4.2 Dangling-Else Die folgende Grammatik soll das aus der Vorlesung bekannte Problem des Dangling-Else” beseitigen: ” stmt → if expr then stmt | matchedStmt matchedStmt → if expr then matchedStmt else stmt | other Zeigen Sie, dass sie immer noch mehrdeutig ist. 8 Für den Satz if expr then if expr then other else if expr then other else other kann man 2 Parsebäume konstruieren: stmt expr if stmt then matchedStmt expr if then matchedStmt else stmt other matchedStmt expr if then matchedStmt else stmt other matchedStmt other stmt matchedStmt expr if if then matchedStmt expr else stmt thenmatchedStmt else other if expr then matchedStmt stmt matchedStmt other 9 stmt other