Skip to content

Commit 375f4ef

Browse files
committed
homework: rework interpreter and improve description of semantic analysis (B06)
1 parent 3720c87 commit 375f4ef

1 file changed

Lines changed: 44 additions & 30 deletions

File tree

homework/sheet06.md

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -19,57 +19,71 @@ für eine Eingabe eines Programms mit S-Expressions den entsprechenden AST erzeu
1919
Korrigieren Sie die Codebasis von Blatt 04, falls notwendig. Ergänzen Sie sodann
2020
einen 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

3040
Siehe [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

4952
Bauen Sie einen Tree-Walking-Interpreter in Ihr Projekt ein.
5053

5154
Realisieren 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

6462
Testen 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

6877
Bauen 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

7488
Vergleichen Sie ihre eigene Grammatik mit den folgenden beiden Grammatiken:
7589

0 commit comments

Comments
 (0)