Grundlagen der Programmierung 2 Aufgabenblatt Nr. 6 Aufgabe 1

Werbung
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)
Herunterladen