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 2009 Aufgabenblatt Nr. 6 Abgabe: Mittwoch 27. Mai 2009 vor! der Vorlesung Aufgabe 1 (50 Punkte) Die Programmiersprache SimpleTurtle zum Bewegen einer Schildkröte sei durch folgende Grammatik definiert, wobei das Nichtterminal Ganzzahl ganze Zahlen erzeuge und Kommando, LoderS, Laufen und Springen weitere Nichtterminale sind. Das Nichtterminal Kommando ist das Startsymbol. Kommando ::= LOderS | LOderS;Kommando LOderS ::= Laufen | Springen Laufen ::= | | | (links:Ganzzahl) (rechts:Ganzzahl) (vor:Ganzzahl) (zurueck:Ganzzahl) Springen ::= (zu:Ganzzahl,Ganzzahl) a) Implementieren Sie mithilfe der in der Vorlesung vorgestellten funktionalen Parserkombinatoren einen Parser, der als Ergebnis genau dann True liefert, wenn es sich bei der Eingabe um ein gültiges SimpleTurtle-Programm handelt. (25 Punkte) b) Der Zustand einer Schildkröte sei durch den folgenden Datentypen in Haskell modelliert: data Turtle = Turtle Int -- X-Position Int -- Y-Position Die Semantik der Kommandos der Turtlesprache ist folgendermaßen festgelegt: – (links:x): Die Schildkröte läuft x Schritte nach links. – (rechts:x): Die Schildkröte läuft x Schritte nach rechts. – (vor:x): Die Schildkröte läuft x Schritte nach oben. – (zurueck:x): Die Schildkröte läuft x Schritte nach unten. – c1 ;c2 : Die Schildkröte führt zunächst c1 und anschließend c2 aus. – (zu:x,y): Die Schildkröte springt auf Position (x, y). Passen Sie Ihren Parser aus Aufgabenteil a) so an, dass die Ausgabe die Endposition der Schildkröte als Zustand vom Typ Turtle repräsentiert, wobei die Startposition stets (0,0) sei. (25 Punkte) 1 Aufgabe 2 (20 Punkte) Polymorphe n-äre Bäume mit Markierungen an allen Knoten können in Haskell durch den folgenden Datentypen repräsentiert werden: data NBaum a = Blatt a | Knoten a [NBaum a] deriving(Show) a) Geben Sie den folgenden Baum in Form des obigen Datentyps in Haskell an. (10 Punkte) ff 67 XXXXXXXX fffff XXXXX f f f f XXXXX ffff f XXXXX f f f XXXXX fff f f f f XXXXX f f f f sf , R 48 D 14 B 10 R n|n| DDDRRR BB DD z z n n z z R n R D B DD z z n | R n D B R z z | n R D B DD z RRR nn ||| DD BB z zz n D! n z z R RR( " }z ~| }z vnnn 256 42 97 25 −12 21 76 122 423 32 b) Implementieren Sie eine Funktion nmap, die als Argumente eine Funktion und einen n-ären Baum erwartet und die Funktion auf alle Knotenbeschriftungen des Baumes anwendet und den veränderten Baum als Ergebnis liefert. (10 Punkte) Aufgabe 3 (30 Punkte) Führen Sie die einzelne Schritte eines Shift-Reduce-Parsers für die Operatorgrammatik E ::= E + E | E ∗ E | E − E | E! | Z Z ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 auf der Eingabe 2! ∗ 6 + 3! ∗ 7 − 4 durch. Die Prioritäten seien wie üblich: ! bindet stärker als ∗ was wiederum stärker als + und − bindet. Die Operatoren ∗, + und − seien links-assoziativ. Erstellen Sie eine Tabelle der Form Stack Eingabe Aktion (Shift oder Reduce) 2