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