Prof. Dr. Manfred Schmidt-Schauß Künstliche Intelligenz/Softwaretechnologie Fachbereich Informatik und Mathematik/ Institut für Informatik Johann Wolfgang Goethe-Universität Frankfurt am Main Grundlagen der Programmierung 2 Sommersemester 2007 Aufgabenblatt Nr. 6 Abgabe: Mittwoch 30. Mai 2007 vor! der Vorlesung Aufgabe 1 (45 Punkte) Folgende kontextfreie Grammatik erzeugt eine textuelle Darstellung von n-ären Bäumen mit Zahlen als Knotenmarkierungen. NBaum Blatt Kinder Kind Zahl Ziffer ::= ::= ::= ::= ::= ::= Blatt | <Zahl@Kinder> Zahl Kind | Kind@Kinder NBaum | (NBaum) Ziffer | Ziffer Zahl 0|1|2|3|4|5|6|7|8|9 2 o 1 OOOO OOO ooo wooo ' 3 ?? 4 5 ? 7 8 6 Hierbei gilt • Nichtterminale sind NBaum, Blatt, Kinder, Kind, Zahl und Ziffer. • Terminale sind 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, <, >, (,) und @. • Das Startsymbol ist NBaum. Die Darstellung der n-ären Bäume ist so, dass Blätter durch Zahlen dargestellt sind und ein Knoten mit Markierung z und Kindern k1 , . . . kn durch <z@k1 @k2 @ . . . @kn > repräsentiert wird. Z.B. stellt <1@<2@<3@4@5@6>>@<7@8>> den neben der Grammatik abgebildeten Baum dar. Da Kinder durch die Produktion Kind → (NBaum) auch geklammert werden dürfen, repräsentiert beispielsweise <1@(<2@(<3@(4)@(5)@(6)>)>)@(<7@(8)>)> den gleichen Baum. a) Geben Sie eine Linksherleitung für den Ausdruck <1@<2@(3)@4>@<5@6>> an. (10 Punkte) b) Geben Sie eine Rechtsherleitung für den Baum <1@<2@3@4>@10> an. (10 Punkte) c) Es sei der folgende polymorphe Datentyp für n-äre Bäume mit Knotenmarkierungen in Haskell gegeben: data NBaum a = NBlatt a | NKnoten a [NBaum a] deriving Show Ein Knoten hat als erstes Argument seine Knotenmarkierung und als zweites Argument eine Liste seiner Kinder. Benutzen Sie die rekursiven Parserkombinatoren aus der Vorlesung (Quellcode ist auf der Webseite verfügbar), um einen rekursiv-absteigenden Parser für obige Grammatik zu erstellen, indem Sie je einen Kombinator pro Nichtterminal implementieren. Die Ausgabe des Parsers soll der Syntaxbaum vom Typ NBaum Integer sein. (25 Punkte) 1 Aufgabe 2 (55 Punkte) Eine textuelle Darstellung binärer Bäume mit Zahlen als Knotenmarkierungen wird durch folgende kontextfreie Grammatik mit Startsymbol BBaum definiert: BBaum Blatt Zahl Ziffer ::= ::= ::= ::= Blatt | [Zahl#BBaum,BBaum] Zahl Ziffer | Ziffer Zahl 0|1|2|3|4|5|6|7|8|9 wobei gilt: • Nichtterminale sind BBaum, Blatt, Zahl und Ziffer. • Terminale sind 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, [, ] # und , • Das Startsymbol ist BBaum. Z.B. ist [50#[10#20,30],[1#2,3]] gerade der Baum 20 50 OOO ooo OOO wooo ' 10 ? 1 ?? ? ? 30 2 3 a) Zeichnen Sie einen Herleitungsbaum für das Wort [5#25,[8#12,3]]. (10 Punkte) b) Implementieren Sie eine Funktion toNBaum :: String -> String, die einen binären Baum in Stringdarstellung entsprechend obiger Grammatik erhält und diesen in einen nären Baum in Stringdarstellung entsprechend der Grammatik aus Aufgabe 1 konvertiert. Hierbei soll nur ein Scan-Durchlauf durch die Eingabe erfolgen. (20 Punkte) c) Erweitern Sie die Funktion toNBaum derart, dass Leerzeichen, Zeilenumbrüche und Tabulatoren während des Scan-Vorgangs entfernt werden und bei der Konvertierung nicht beachtet werden. (5 Punkte) d) Nehmen Sie nun an, dass die Eingabe Kommentare enthalten darf, wobei Kommentare mit zwei Slash-Zeichen // eingeleitet werden, und bis zum Zeilenende wirken. Modifizieren Sie Ihre Implementierung aus Aufgabenteil c), so dass Kommentare während des Konvertierens ignoriert werden. (10 Punkte) e) Benutzen Sie den Parser aus Aufgabe 1 um binäre Bäume in Stringdarstellung als näre Bäume vom Typ NBaum Integer zu parsen. D.h. implementieren Sie eine Funktion parseBBaum :: String -> NBaum Integer. Beispielsweise soll der Aufruf parseBBaum "[50#[10#20,30],[1#2,3]]" den Baum NKnoten 50 [NKnoten 10 [NBlatt 20,NBlatt 30],NKnoten 1 [NBlatt 2,NBlatt 3]] als Ergebnis liefern. Welchen Baum erhalten Sie bei der Eingabe [13 // # 26 #\t#//\t,29]\n//t54,\n ,27,96\n]//[12#14,16]? 2 (10 Punkte)