@@ -6,37 +6,150 @@ title: "Blatt 08: Mini-Projekt C++-Interpreter"
66
77# Aufgabe
88
9- Entwickeln Sie in Ihrem 3er-Team gemeinsam einen Interpreter für C++.
9+ Sie entwickeln in Ihrem 3er-Team eine kleine, C++‑ähnliche Sprache und
10+ implementieren Lexer, Parser, semantische Analyse, Interpreter und eine einfache
11+ REPL.
12+
13+ Der Fokus liegt auf Variablen und C++-Referenzen, auf Funktionen, auf Klassen,
14+ Einfach‑Vererbung und dem Unterschied zwischen statischem und dynamischem Dispatch
15+ (nicht‑virtual vs. virtual) - ohne Pointer/Heap und ohne Casts. Die Sprache ist eine
16+ Teilmenge von C++ und soll (abgesehen von den REPL‑Erweiterungen) mit einem
17+ C++‑Compiler kompilierbar sein. Präprozessor‑Zeilen (` #include ... ` ) dürfen in
18+ Dateien vorkommen; Ihr Interpreter soll sie ignorieren bzw. als Kommentare
19+ behandeln.
1020
1121Sie * können* ANTLR zur Erstellung Ihres Lexers und Parsers einsetzen, Sie können
12- aber auch gern einen selbst implementierten LL-Parser mit * recursive descent*
13- einsetzen.
22+ aber auch gern einen selbst implementierten LL-Parser einsetzen.
1423
1524Definieren Sie zunächst eine passende Grammatik und den AST, bevor Sie Lexer und
1625Parser umsetzen. Achten Sie auf eine angemessene semantische Analyse, achten Sie
1726dabei auf die in der Vorlesung besprochene C++-Semantik. Der Interpreter selbst soll
1827ein einfacher Tree-walking Interpreter wie in der Vorlesung besprochen sein.
1928
20- ## Initialisierung
29+ ## Betrachtete Sprache: Sub-Dialekt von C++
30+
31+ ### Sprachkern
32+
33+ Unterstützen Sie mindestens folgende C++-Konzepte:
34+
35+ - Basisdatentypen: ` bool ` , ` int ` , ` char ` ; zusätzlich Klassentypen; ` void ` für
36+ Funktionen ohne Rückgabewert
37+ - Variablen und Zuweisungen:
38+ - Deklaration ` T x; ` und Initialisierung ` T x = expr; `
39+ - Einfache Zuweisung ` = `
40+ - Arrays (eindimensional, minimal):
41+ - Nur ` T[] ` für primitive Typen
42+ - Operationen: Deklaration, Index‑Zugriff/‑Zuweisung
43+ - Ausdrücke:
44+ - Arithmetik: ` + ` , ` - ` , ` * ` , ` / ` , ` % ` (nur für ` int ` )
45+ - Vergleich: ` == ` , ` != ` , ` < ` , ` <= ` , ` > ` , ` >= ` (` int ` , ` char ` ; ` bool ` nur ` == `
46+ und ` != ` )
47+ - Logik: ` && ` und ` || ` (mit Short‑Circuit), ` ! `
48+ - Klammern ` (...) `
49+ - Funktionsaufrufe ` f(args) `
50+ - Feld-/Methodenzugriff: ` obj.f ` , ` obj.m(args) `
51+ - Kontrollfluss:
52+ - ` if ` -` then ` -` else ` , ` while ` , Block ` { ... } `
53+ - ` return `
54+ - Funktionen:
55+ - Definition, Deklaration und Aufruf
56+ - Überladung (Overloading) nur per exakt passender Signatur (Name + Anzahl +
57+ exakte Typen inkl. ` ref ` ‑Markierung)
58+ - C++‑Referenzen "light":
59+ - Deklaration Variable: ` T& x; ` bzw. Parameter ` T& p `
60+ - Initialisierung ist obligatorisch und nur mit LValues (Variablen,
61+ Feldzugriffen, Array‑Index) erlaubt
62+ - Zuweisung an eine ` ref ` ‑Variable schreibt in das referenzierte Ziel
63+ - Klassen, Einfach-Vererbung, Polymorphie:
64+ - ` class A { public: /* Felder + Methoden */ } ` mit Attributen und Methoden
65+ - Konstruktoren; aber keine Destruktoren und keine Initialisierungslisten
66+ - Methoden können als ` virtual ` deklariert werden
67+ - Variablen vom Klassentyp sind Werte (feldweise Kopie)
68+ - ` class D : public B { public: /* Felder + Methoden */ } ` : Vererbung mit nur
69+ einer Basisklasse
70+ - Zuweisung ` Base b = d; ` (mit ` class D : public B { ... } ` und ` D d; ` ) führt
71+ zum Slicing
72+ - Polymorphe Nutzung erfolgt ausschließlich über Referenzen:
73+ ` B& b = d; b.m(); ` ruft die überschriebene Methode in ` D ` auf (wenn ` D::m() `
74+ als ` virtual ` deklariert ist)
75+ - ` *this ` in Methoden hat Typ ` C& ` ; ` *this ` ist nur als RValue lesbar (z.B.
76+ ` return *this; ` ); Zuweisung an ` *this ` gibt es nicht
77+ - Eingebaute Funktionen: ` print_bool ` , ` print_int ` , ` print_char ` (Ausgabe eines
78+ Werts des jeweiligen Typs)
79+ - Programmorganisation: ein einzelnes Source‑File, keine Includes/Präprozessor
80+
81+ * Hinweis* : Polymorphie in dieser Sprache folgt C++‑Prinzipien (Slicing bei
82+ Wertkopie, dynamischer Dispatch über Referenzen), nicht Java‑Semantik.
83+
84+ ### Semantik‑/Typregeln
85+
86+ - Keine Mehrfachdefinitionen in demselben Scope (Variablen/Funktionen/Klassen)
87+ - Sichtbarkeit: Verwendungen müssen im aktuellen Scope sichtbar (auflösbar) sein
88+ - Variablen sind nicht aufrufbar; Funktionen sind nicht zuweisbar (keine Funktion
89+ als LValue)
90+ - Rückgaberegel: In non‑` void ` ‑Funktionen existiert auf allen Pfaden mindestens
91+ ein ` return `
92+ - Keine impliziten Typkonversionen, keine Casts
93+ - Overload‑Auflösung: exakter Match Name und Arität und identische Typen inkl.
94+ ` ref ` ‑Markierung; bei Mehrdeutigkeit Fehler
95+ - Funktionen/Methoden: Argumentanzahl muss zur Parameterliste passen
96+ - LValues: benannte Variablen ` a ` , ` obj.f ` (Feldzugriff), ` a[i] ` ; alles andere
97+ sind RValues
98+ - Referenzen
99+ - Parameter und lokale Referenzvariablen müssen mit LValues initialisiert
100+ werden
101+ - Keine Neubindung
102+ - Keine Referenzen als Felder/Globals oder Arrays
103+ - Keine ` ref ` ‑Rückgaben (Rückgabe nur als Kopie)
104+ - Klassen/Methoden: Nicht‑virtuelle Methoden binden statisch; virtuelle dynamisch
105+ - Fehlerbehandlung:
106+ - Lexer-, Parser-, Typ-Fehler beenden die Analyse mit klarer Meldung
107+ - Laufzeitfehler (z.B. Division durch 0, Zugriff auf nicht initialisierte
108+ Variable) sind sauber zu melden
109+ - REPL (** abweichend** von C++): Neue Funktionen/Klassen dürfen in der REPL
110+ definiert werden; sie werden in den globalen Scope aufgenommen und stehen danach
111+ zur Verfügung.
112+
113+ ### Nicht Teil des Umfangs
114+
115+ Weitere mit C++ verbundene Konzepte wie beispielsweise Präprozessor, Header-Files,
116+ Pointer, Templates, Sichtbarkeiten in Klassen, Trennung Deklaration/Implementierung
117+ bei Klassen (Trennung .h und .cpp) brauchen Sie nicht umsetzen.
118+
119+ Darunter fallen auch (nicht vollständig):
120+
121+ - Pointer/Adressen: ` & ` (Adressoperator), ` * ` (Dereferenzierung, außer für ` this `
122+ bzw. ` *this ` ), ` -> ` /` new ` /` delete ` , Speicherverwaltung
123+ - Casts, Inkrement/Decrement, Compound‑Assignments, Mehrfachvererbung, Templates,
124+ ` static ` , ` const ` , ` friend ` , Namespaces
125+ - Sichtbarkeiten (außer ` public ` )
126+ - Mehrdimensionale Arrays
127+ - Kein ` break/continue ` in Schleifen
128+
129+ ## REPL-Modell
130+
131+ ### Initialisierung
21132
22133Der Interpreter soll beim Start eine optional angegebene Datei mit C++-Code einlesen
23- und verarbeiten können.
134+ und verarbeiten können. Dabei soll die ` main() ` im eingelesenen Code bis vor die
135+ schließende Klammer bzw. das beendende ` return ` ausgeführt werden und der
136+ Aktivierungsrahmen von ` main() ` "offen" gehalten werden.
24137
25- ## REPL
138+ ### REPL
26139
27140Danach soll dem User eine REPL angeboten werden, die einen Prompt in der Konsole
28141ausgibt und in der weitere C++-Statements eingegeben werden können, die dann im
29- Kontext des bisher verarbeiteten Codes interpretiert werden. Nach der Interpretation
30- soll es jeweils eine Ausgabe des letzten Ergebnisses (oder Fehlers) auf der Konsole
31- geben, und dann soll ein neuer Prompt ausgegeben und auf die nächste User-Eingabe
32- gewartet werden.
142+ Kontext des bisher verarbeiteten Codes interpretiert werden.
33143
34- Implementieren Sie eine spezielle Eingabe, mit der die REPL beendet werden kann.
144+ Abweichend von C++ können in der REPL neue Klassen und Funktionen definiert und
145+ genutzt werden. Diese landen im aktuellen Scope.
35146
36- * Hinweis* : Das Konzept einer speziellen Funktion ("` main() ` ") als Einstieg in die
37- Ausführung des interpretierten C++-Programms funktioniert im Zusammenhang mit der
38- REPL nicht wirklich. Interpretieren Sie die eingegebenen Statements entsprechend
39- fortlaufend.
147+ Nach der Interpretation soll es jeweils eine Ausgabe des letzten Ergebnisses (oder
148+ Fehlers) auf der Konsole geben, und dann soll ein neuer Prompt ausgegeben und auf
149+ die nächste User-Eingabe gewartet werden.
150+
151+ Implementieren Sie eine spezielle Eingabe, mit der die laufende ` main() ` -Funktion
152+ und damit die REPL beendet werden kann.
40153
41154* Hinweis* : Achten Sie darauf, dass Ihr Interpreter die Eingabe nicht zu früh beendet
42155und zu früh mit der Interpretation beginnt! Oft ist ein Zeilenumbruch das korrekte
@@ -47,40 +160,16 @@ der User weiss, dass die aktuelle Eingabe noch läuft.
47160
48161## Tests
49162
50- Entwickeln Sie in Ergänzung zu den Vorgaben im
163+ Im
51164[ Starter-Projekt] ( https://github.com/Compiler-CampusMinden/student-support-code-template/tree/master/src/main/resources/cpp )
52- weitere verschiedene Eingabebeispiele in unterschiedlicher Komplexität, mit denen
53- Sie Ihren Interpreter testen können.
54-
55- ## Sprachumfang
56-
57- Sie sollen mindestens folgende C++-Konzepte unterstützen:
58-
59- - Basisdatentypen: ` bool ` , ` int ` , ` char `
60- - Variablen
61- - Arrays
62- - C++-Referenzen
63- - Zuweisungen und Expressions
64- - Kontrollfluss: ` if ` -` then ` -` else ` , ` while ` -Schleifen
65- - Funktionen (Definition, Deklaration, Aufrufe)
66- - Klassen (mit Attributen und Methoden), Initialisierungslisten
67- - Einfach-Vererbung
68- - Polymorphie (dynamisch, statisch)
69- - Eingebaute Funktionen: ` print_bool ` , ` print_int ` , ` print_char ` (Ausgabe eines
70- Werts des jeweiligen Typs auf der Konsole)
71-
72- Beachten Sie bei der Umsetzung, dass Polymorphie in C++ etwas anders funktioniert
73- als in Java.
165+ finden Sie einige Positiv- und Negativ-Tests. Für die Positivtests ist die erwartete
166+ Antwort des Interpreters angegeben, bei der Interpretation der Negativtests sollte
167+ es eine entsprechende Fehlermeldung (Lexer, Parser, semantische Analyse,
168+ Interpreter) geben.
74169
75- Andere mit C++ verbundene Konzepte wie beispielsweise Präprozessor, Header-Files,
76- Pointer, Templates, Sichtbarkeiten in Klassen, Trennung Deklaration/Implementierung
77- bei Klassen (Trennung .h und .cpp) brauchen Sie nicht umsetzen.
170+ Betrachten Sie die Testfälle als ausführbare Ergänzung der obigen Spezifikation.
78171
79- Sie finden im
80- [ Starter-Projekt] ( https://github.com/Compiler-CampusMinden/student-support-code-template/tree/master/src/main/resources/cpp )
81- einige Beispiele, die mindestens umgesetzt werden sollten und die Sie zum Testen
82- Ihres Interpreters nutzen können. Beachten Sie, dass diese Sammlung nicht
83- vollständig ist, und dass Sie selbst weitere Testbeispiele definieren sollen.
172+ Entwickeln Sie weitere aussagekräftige Tests, die die Vorgaben ergänzen.
84173
85174# Projektvorstellung: Walk-Through statt Präsentation
86175
@@ -92,10 +181,11 @@ Jedes Team hat dafür **15 Minuten** Zeit.
92181Gehen Sie dabei am Code durch Ihr Projekt und diskutieren Sie relevante Teile,
93182mindestens aber:
94183
95- - Grammatik
96- - AST
97- - Semantische Analyse
98- - Interpreter
184+ - Spezifikation: kurze Sprachbeschreibung mit allen getroffenen
185+ Designentscheidungen
186+ - Implementierung: ANTLR‑Grammatik, AST, Scopes/Symboltabellen, semantische
187+ Checks, Interpreter mit dynamischem Dispatch, REPL
188+ - Kurze Anleitung: Wie bauen/ausführen, wie REPL nutzen.
99189
100190Demonstrieren Sie die Funktionsfähigkeit mit Ihren C++-Codebeispielen.
101191
0 commit comments