Aufgabe 2 - Goethe

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 2012
Aufgabenblatt Nr. 7
Abgabe: Mittwoch 30. Mai 2012 vor! der Vorlesung
Aufgabe 1 (35 Punkte)
Gegeben sei folgende kontextfreie Grammatik G = (N, T, P, σ) mit
N
= {R, S}
T
= {|, +, =}
= { R
R
S
S
σ = S
P
→
→
→
→
|R|,
=,
|S|,
|+|R||}
a) Berechnen Sie alle Worte aus T ∗ , die durch höchstens vier Linksherleitungsschritte mithilfe von
G erzeugt werden können.
(25 Punkte)
b) Beschreiben Sie natürlichsprachlich, welche Sprache G erzeugt.
(10 Punkte)
Aufgabe 2 (65 Punkte)
Syntaxbäume für arithmetische Ausdrücke seien durch den folgenden Haskell-Datentypen dargestellt:
data ArExp = ArExp :+: ArExp | ArExp :-: ArExp | ArExp :*: ArExp | Zahl Int
deriving(Show,Eq)
Hier sind :+:, :-: und :*: zweistellige Infix-Konstruktoren.
Außerdem sei der Befehlssatz einer Stackmaschine S durch folgenden Datentypen dargestellt:
data StackCmd = Pop | Push Int | PushK Int | Negate | Add | Mult
deriving(Show,Eq)
Die Semantik der Befehle sei folgendermaßen definiert:
• push i: Legt das i-te Stackelement von oben in Kopie oben auf den Stack. Das oberste Element
ist das 0-te Stackelement.
• pushK k: Legt die Konstante k oben auf den Stack.
• pop: Nimmt das oberste Element vom Stack.
1
• add: Addiert die obersten beiden Elemente des Stacks: Wenn a, b, ... oben auf dem Stack liegen,
liegt danach b + a, ... auf dem Stack.
• mult: Multipliziert die obersten beiden Elemente des Stacks: Wenn a, b, ... oben auf dem Stack
liegen, liegt danach b · a, ... auf dem Stack.
• neg: Negiert das oberste Element des Stack.
Ein Stack wird durch eine Liste von Integern repräsentiert (d.h. der Stack ist vom Typ [Int]).
a) Geben Sie den Ausdruck ((3+4)*(6-7))+12 als Wert des Datentyps ArExp an.
(7 Punkte)
b) Welcher Ausdruck wird durch das folgenden Stackmaschinenprogramm beschreiben?
[PushK 17,PushK 10,Negate,Add,PushK 3,Add,PushK 2,PushK 3,Add,Mult]
Führen Sie das Stackmaschinenprogramm per Hand aus, indem Sie folgenden Tabelle ausfüllen:
Programm
[PushK 17, PushK 10,Negate,Add,PushK 3,Add,PushK 2,PushK 3,Add,Mult]
[PushK 10,Negate,Add,PushK 3,Add,PushK 2,PushK 3,Add,Mult]
...
Stack
[ ]
[17]
...
(13 Punkte)
c) Implementieren Sie in Haskell einen Code-Erzeuger (codeErzeuger :: ArExp -> [StackCmd]),
der als Eingabe einen Syntaxbaum des Typs ArExp erhält, und als Ausgabe die Liste von Befehlen
des Typs StackCmd erzeugt. Welches Programm wird für den Ausdruck aus Aufgabenteil a)
erzeugt?
(20 Punkte)
d) Implementieren Sie in Haskell eine Funktion exec :: StackCmd -> [Int] -> [Int], die einen
Befehl auf einem Stack ausführt und anschließend den resultierenden Stack als Ergebnis liefert.
(15 Punkte)
e) Implementieren Sie in Haskell eine Funktion runPrg:: [StackCmd] -> [Int], die Stackmaschinenprogramme auf einem anfänglich leeren Stack ausführt und den resultieren Stack als Ergebnis
liefert. Lassen Sie das von Ihnen in Aufgabenteil c) erzeugte Programm mittels runPrg ausführen.
(10 Punkte)
2
Herunterladen