Prof. Dr. Manfred Schmidt-Schauß Künstliche Intelligenz/Softwaretechnologie Fachbereich Informatik und Mathematik/ Institut für Informatik Goethe-Universität Frankfurt am Main Grundlagen der Programmierung 2 Sommersemester 2011 Aufgabenblatt Nr. 6 Abgabe: Mittwoch 25. Mai 2011 vor! der Vorlesung Aufgabe 1 (35 Punkte) Eine Sprache für arithmetische Ausdrücke sei durch folgende kontextfreie Grammatik gegeben, wobei das Nichtterminal Int beliebige positive Ganzzahlen erzeuge. Expr ::= Expr + Expr | Expr - Expr | Expr * Expr | Expr / Expr | (Expr) | Int a) Implementieren Sie in Haskell eine Funktion lexer :: String -> [Token], die einen String erwartet und diesen der lexikalischen Analyse unterzieht, dabei Leerzeichen und Zeilenumbrüche entfernt, und eine Liste von Token (vom Typen Token) als Ergebnis liefert. Der Datentyp für Token sei in Haskell definiert als data Token = TokenPlus | TokenMinus | TokenMal | TokenGeteilt | TokenKlammerAuf | TokenKlammerZu | TokenInt Int deriving (Eq,Show) ------- + * / ( ) Sollten im String Zeichen enthalten sein, die nicht der Sprache entsprechen, so soll ein Fehler vom Lexer erzeugt werden. Hinweise: Zum Erzeugen von Fehlern können Sie die vordefinierte Funktion error :: String -> a verwenden und zum Konvertieren von Strings in Zahlen können Sie die vordefinierte Funktion read verwenden. (25 Punkte) b) Ist die obige kontextfreie Grammatik für arithmetische Ausdrücke eindeutig oder mehrdeutig? Begründen Sie ihre Antwort. Diskutieren Sie die Probleme, die sich durch mehrdeutige Grammatiken ergeben. (10 Punkte) Aufgabe 2 (45 Punkte) Eine textuelle Darstellung binärer Bäume mit Zahlen als Knotenmarkierungen wird durch folgende kontextfreie Grammatik mit Startsymbol Baum definiert: Baum Knoten Blatt Zahl Ziffer ::= ::= ::= ::= ::= Blatt | Knoten <Zahl Baum Baum> <Zahl> Ziffer | Ziffer Zahl 0|1|2|3|4|5|6|7|8|9 wobei gilt: 1 • Nichtterminale sind Baum, Knoten, Blatt, Zahl und Ziffer. • Terminale sind 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, < und > • Das Startsymbol ist Baum. Z.B. ist <4<2<1><3>><60<50><70>>> gerade der Baum 1 o 4 OOOO ooo OO' o o wo 2 ?? 60 ? ? ? 3 50 70 a) Benutzen Sie die rekursiven Parserkombinatoren aus der Vorlesung, um einen rekursivabsteigenden Parser für obige Grammatik zu erstellen, indem Sie je einen Kombinator pro Nichtterminal implementieren. Die Ausgabe des Parsers soll der Syntaxbaum vom Typ Baum Integer sein, wobei der Datentyp Baum in Haskell definiert sei als: data Baum a = Blatt a | Knoten a (Baum a) (Baum a) deriving(Eq,Show) Hinweise: Die Datei CombParser.hs mit der Implementierung der Parserkombinatoren ist auf der PRG-2 Webseite http://www.informatik.uni-frankfurt.de/~prg2/SS2011/ verfügbar. Für das Nichtterminal Zahl können Sie einen Parser implementieren, der direkt die Funktion natural verwendet, und somit auf einen Parser für das Nichtterminal Ziffer verzichten. (30 Punkte) b) Verbessern Sie den Parser aus der vorherigen Teilaufgabe, so dass Leerzeichen und Zeilenumbrüche vom Parser entfernt werden und nicht zum Fehlschlagen des Parsens führen. (5 Punkte) c) Implementieren Sie in Haskell eine Funktion vom Typ Baum Integer -> Integer, die als Eingabe einen binären Baum mit Integer-Markierungen erwartet und die Summe aller Knotenund Blattbeschriftungen berechnet. (10 Punkte) Aufgabe 3 (20 Punkte) Gegeben sei folgende kontextfreie Grammatik G = (N, T, P, σ) mit = {A, B, C, D} = {a, b, c, d} = { A → BB, B → aCb, C → c, D → dDd, σ = A N T P A B C D → → → → BA, A → D, ab, cC, } a) Geben Sie eine Linksherleitung für das Wort ababacccbdddd an. (5 Punkte) b) Geben Sie einen Herleitungsbaum für das Wort ababacccbdddd an. (7 Punkte) c) Geben Sie eine Rechtsherleitung für das Wort abacbaccbdddd an. (8 Punkte) 2