@@ -19,57 +19,71 @@ für eine Eingabe eines Programms mit S-Expressions den entsprechenden AST erzeu
1919Korrigieren Sie die Codebasis von Blatt 04, falls notwendig. Ergänzen Sie sodann
2020einen Tree-Walking-Interpreter und eine REPL für die Lisp-artige Sprache.
2121
22- Es ist empfehlenswert, den Interpreter dreistufig zu realisieren:
23-
24- 1 . Einlesen aus einer Datei mit Lisp-Code und Parsen der Inhalte
25- 2 . Aufbauen der Symboltabelle und Durchführung der semantischen Analyse
26- 3 . Ablaufen des Parse-Tree/AST und Auswerten der Ausdrücke (Interpretation)
22+ Es ist empfehlenswert, den Interpreter mehrstufig zu realisieren:
23+
24+ 1 . Einlesen von Lisp-Code, Parsen der Inhalte und Erzeugen des AST
25+ 2 . Ablaufen des AST und dabei
26+ - Durchführung der semantischen Analyse
27+ - Auswerten der Ausdrücke (Interpretation)
28+
29+ * Hinweis* : Wir wollen eine * REPL* ("Read-Eval-Print"-Loop) realisieren und in einer
30+ Schleife Lisp-Code von der Konsole einlesen, parsen und interpretieren und das
31+ Ergebnis wieder ausgeben. Sie erzeugen also für jede Eingabe immer wieder neu einen
32+ AST. Wenn wir die semantische Analyse als eigenen Pass zwischen Parsing und
33+ Interpretation realisieren würden, müssten wir immer sämtlichen bisher verarbeiteten
34+ Code mitführen, allerdings nur die gültigen Eingaben. Da dies recht komplex werden
35+ kann, realisieren wir auf diesem Blatt die semantische Analyse "* on-the-fly* " auf
36+ den Environments im Interpreter.
2737
2838# Sprachdefinition
2939
3040Siehe [ Blatt 04] ( sheet04.md ) .
3141
3242# Aufgaben
3343
34- ## A6.1: Semantische Analyse (2P)
35-
36- 1 . Erstellen Sie zunächst einige Programme in der Zielsprache. Diese sollten von
37- einfachsten Ausdrücken bis hin zu komplexeren Programmen reichen. Definieren Sie
38- beispielsweise eine Funktion, die rekursiv die Länge einer Liste berechnet.
44+ ## A6.1: AST und Syntactic Sugar (1P)
3945
40- Definieren Sie neben gültigen Programmen auch solche, die in der semantischen
41- Analyse zurückgewiesen werden sollten. Welche Fehlerkategorien könnte es hier
42- geben?
43-
44- 2 . Führen Sie die semantische Analyse durch: Sind alle Symbole bekannt, passen die
45- Scopes?
46+ Lösen Sie die als "* syntactic sugar* " bezeichneten Ausdrücke auf und transformieren
47+ Sie den AST entsprechend: ` (+ 1 2 3 4) ` soll zu ` (+ (+ (+ 1 2) 3) 4) ` umgeformt
48+ werden. Analog für die anderen Operatoren der Sprache (Vergleiche, Arithmetik).
4649
47- ## A6.2: Tree-Walking-Interpreter (3P )
50+ ## A6.2: Tree-Walking-Interpreter (4P )
4851
4952Bauen Sie einen Tree-Walking-Interpreter in Ihr Projekt ein.
5053
5154Realisieren Sie die eingebauten Funktionen ` print ` und ` str ` dabei als * native*
52- Funktionen. Realisieren Sie ` list ` , ` nth ` , ` head ` und ` tail ` sowie ` def ` , ` let ` ,
53- ` defn ` , ` do ` und die Operatoren und die Kontrollstrukturen geeignet.
54-
55- Lösen Sie die als "* syntactic sugar* " bezeichneten Ausdrücke auf und transformieren
56- Sie den AST entsprechend: ` (+ 1 2 3 4) ` soll zu ` (+ (+ (+ 1 2) 3) 4) ` umgeformt
57- werden. Analog für die anderen Operatoren der Sprache (Vergleiche, Arithmetik).
55+ Funktionen.
5856
59- Achten Sie auf die Datentypen. Die Typen von Variablen etc. sind erst zur Laufzeit
60- bekannt und müssen dann passen .
57+ Realisieren Sie ` list ` , ` nth ` , ` head ` und ` tail ` sowie ` def ` , ` let ` , ` defn ` , ` do `
58+ und die Operatoren und die Kontrollstrukturen geeignet .
6159
62- Lesen Sie den zu interpretierenden Code aus einer Datei ein.
60+ Lesen Sie den zu interpretierenden Code aus einer Text- Datei ein.
6361
6462Testen Sie Ihren Interpreter mit Ihren Beispielprogrammen.
6563
66- ## A6.3: Interaktiver Interpreter (3P)
64+ ## A6.3: Semantische Analyse (3P)
65+
66+ Führen Sie die semantische Analyse während der Interpretation durch:
67+
68+ - Symbole dürfen im selben Scope nicht mehrfach definiert werden
69+ - Referenzierte Symbole müssen sich über den aktuellen Scope (oder dessen
70+ Eltern-Scopes) auflösen lassen
71+ - Bei Funktionsaufrufen muss das als Funktionsname verwendete Symbol tatsächlich
72+ eine Funktion sein
73+ - Achten Sie auf die Datentypen der Operanden beim Ausführen der Operatoren
74+
75+ ## A6.4: Interaktiver Interpreter (1P)
6776
6877Bauen Sie eine * REPL* ein, d.h. geben Sie nach dem Start des Interpreters einen
69- Prompt aus und verarbeiten Sie die Eingaben interaktiv. Wie müssen Sie hier mit der
70- Symboltabelle umgehen?
78+ Prompt aus und verarbeiten Sie die Eingaben interaktiv.
79+
80+ Erlauben Sie das Einlesen eines Lisp-Programms aus einer Text-Datei beim Start des
81+ Interpreters. Dabei soll zunächst der eingelesene Code interpretiert werden und
82+ damit die Environments vorbelegt werden. Danach soll der Interpreter in die REPL
83+ gehen, d.h. der in der Konsole eingegebene Code wird dann im Kontext des vorher
84+ eingelesenen Programms interpretiert.
7185
72- ## A6.4 : Auswirkungen der Grammatik auf den Interpreter (2P )
86+ ## A6.5 : Auswirkungen der Grammatik auf den Interpreter (1P )
7387
7488Vergleichen Sie ihre eigene Grammatik mit den folgenden beiden Grammatiken:
7589
0 commit comments