You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Die Definition des ASTs wurde stark von den Ansätzen aus der Vorlesung inspiriert. Im folgenden sollen v.a. anders getroffene Entscheidungen begründet werden. Zusätzlich soll kurz erklärt werden, wie das Diagramm genau zu lesen ist. Das ist nötig, weil die Programmiersprache, die zur Erstellung des Compilers genutzt wurde, nicht objekt-orientiert ist und eine Übersetzung von UML-Diagramm zur Definition im Code somit leicht anders als bei Java Programmen ist.
3
+
Die Definition des ASTs wurde stark von den Ansätzen aus der Vorlesung inspiriert. Im Folgenden sollen v.a. anders
4
+
getroffene Entscheidungen begründet werden. Zusätzlich soll kurz erklärt werden, wie das Diagramm genau zu lesen ist.
5
+
Das ist nötig, weil die Programmiersprache, die zur Erstellung des Compilers genutzt wurde, nicht objekt-orientiert ist
6
+
und eine Übersetzung von UML-Diagramm zur Definition im Code somit leicht anders als bei Java Programmen ist.
4
7
5
8
## Erklärung des Diagramms
6
9
7
-
Einige Klassen des Diagramms haben einen blauen Rand. Das zeigt an, dass diese Elemente noch nicht beim Parsen erstellt werden, sondern erst beim Typcheck hinzugefügt werden. Speziell werden alle Statements, Expression und Statemnt-Expressions in TypedStmt, TypedExpr bzw. TypedStmtExpr gepackt. Somit kann Typ-Information hinzugefügt werden, die beim Parsing noch nicht vorhanden war. Auch werden alle LocalOrFieldVar Objekte bei der Typisierung in LocalVar bzw. FieldVar Objekte transformiert. Der Grund dahinter liegt darin, dass der Typchecker sowieso herausfinden muss, ob es sich bei der Variable um eine lokale Variable oder ein Attribut der Klasse handelt. Da die Codegenerierung diese Informationen ebenfalls benötigt, werden die dann beim Typchecker direkt in den AST geliefert.
10
+
Einige Klassen des Diagramms haben einen blauen Rand.
11
+
Das zeigt an, dass diese Elemente noch nicht beim Parsen erstellt werden, sondern erst beim Typcheck hinzugefügt werden.
12
+
Speziell werden alle Statements, Expression und Statement-Expressions in TypedStmt, TypedExpr bzw. TypedStmtExpr gepackt.
13
+
Somit kann Typ-Information hinzugefügt werden, die beim Parsing noch nicht vorhanden war. Auch werden alle `LocalOrFieldVar`
14
+
Objekte bei der Typisierung in LocalVar bzw. FieldVar Objekte transformiert. Der Grund dahinter liegt darin, dass der
15
+
Typchecker sowieso herausfinden muss, ob es sich bei der Variable um eine lokale Variable oder ein Attribut der Klasse
16
+
handelt. Da die Codegenerierung diese Informationen ebenfalls benötigt, werden die dann beim Typchecker direkt in den
17
+
AST geliefert.
8
18
9
-
Im Quellcode werden viele der "Klassen" des Diagramms als Enumerations dargestellt. Das liegt daran, dass die gewählte Programmiersprache - [Rust](https://www.rust-lang.org/) - sehr mächtige Enumerations zur Verfügung stellt. Bei Rust kann jeder Option aus einem Enum eine eigene Menge an Parametern gegeben werden. Somit können alle Attribute der Klasse als Parameter des Enums abgebildet werden. Speziell wurde das bei der Definition von `Stmt`, `Expr` und `StmtExpr` genutzt. Da alle diese Elemente nicht wirklich von eine Überklasse erben, sondern eigentlich Optionen eines Enums sind, wurden sie im Diagramm als einzelne Klassen in einer Box, die das Enum darstellt, abgebildet.
19
+
Im Quellcode werden viele der "Klassen" des Diagramms als Enumerations dargestellt. Das liegt daran, dass die gewählte
20
+
Programmiersprache - [Rust](https://www.rust-lang.org/) - sehr mächtige Enumerations zur Verfügung stellt.
21
+
Bei Rust kann jeder Variante aus einem Enum eine eigene Menge an Parametern gegeben werden. Somit können alle Attribute
22
+
der Klasse als Parameter des Enums abgebildet werden. Speziell wurde das bei der Definition von `Stmt`, `Expr` und
23
+
`StmtExpr` genutzt. Da alle diese Elemente nicht wirklich von eine Überklasse erben, sondern eigentlich Varianten eines
24
+
Enums sind, wurden sie im Diagramm als einzelne Klassen in einer Box, die das Enum darstellt, abgebildet.
10
25
11
26
## Erklärung unserer Entscheidungen
12
27
13
-
TBD
14
-
15
-
- FieldDecl hat optional value Attribut
16
-
- ...
28
+
- Assign nimmt eine expression für die Variable auf, da wir bei der Codegenerierung wissen müssen um welchen Typ an Variable es sich handelt, da dort dann unterschiedlicher Bytecode generiert werden muss
29
+
- FieldDecl nimmt einen optionalen Wert zur direkten Zuweisung auf
30
+
- Type wurde um Class erweitert um die Codegenerierung zu vereinfachen
Copy file name to clipboardExpand all lines: docs/Project-Doc.md
+7-5
Original file line number
Diff line number
Diff line change
@@ -6,9 +6,9 @@
6
6
- Wer hat welche Arbeit am Parser gemacht?
7
7
- Wie wurde Pest fürs Parsing eingesetzt? (sehr ähnlich zu ANTLR)
8
8
9
-
## Typchecker
9
+
## Typechecker
10
10
11
-
Geschrieben von: Maximilian Floto, Philipp Wolf
11
+
Geschrieben von: Maximilian Floto und Philipp Wolf im Pair Programming
12
12
13
13
Der Typechecker akzeptiert einen Abstract Syntax Tree (AST) und gibt einen getypten AST (TAST) zurück.
14
14
Er führt eine umfassende Analyse durch, um die Typen aller Variablen und Ausdrücke im Code zu bestimmen.
@@ -44,9 +44,11 @@ Folgende Fehler werden vom Typechecker erkannt:
44
44
45
45
## Codegenerierung
46
46
47
-
Geschrieben von: Marion Hinkel, Benedikt Brandmaier, Val Richter
48
-
- Wer hat welche Arbeit bei codegen gemacht?
49
-
- Was für Arbeit musste alles zusätzlich getan werden, weil wir nicht Java + ASM genutzt haben?
47
+
ByteCode-Umwandlung, Bugfixes, StackSize und Improvements: Val Richter
48
+
49
+
Definition DIR(Intermediate Representation), ConstantPool, LocalVarPool, Methoden zur Instruction-generierung, BugFixes, etwas ByteCode-Umwandlung und Umwandlung relativer in absolute Jumps: Marion Hinkel und Benedikt Brandmaier im Pair Programming
50
+
- Wer hat welche Arbeit bei codegen gemacht?
51
+
- Was für Arbeit musste alles zusätzlich getan werden, weil wir nicht Java + ASM genutzt haben?
- Jeweils erwähnen wie man die Teile kompiliert und laufen lassen kann. Nicht vergessen: Wie sollte die Eingabe aussehen und wie sieht die Ausgabe dann aus?
4
-
- Vielleicht sollten wir Command-Line Befehle für jeden der Teile im Binary Crate zur Verfügung stellen?
3
+
- Jeweils erwähnen wie man die Teile kompiliert und laufen lassen kann. Nicht vergessen: Wie sollte die Eingabe aussehen und wie sieht die Ausgabe dann aus?
4
+
- Vielleicht sollten wir Command-Line Befehle für jeden der Teile im Binary Crate zur Verfügung stellen?
5
+
6
+
## Vorbedingungen
7
+
[Rust installieren](https://rustup.rs/):
8
+
```bash
9
+
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
10
+
```
11
+
-[JDK 20](https://www.oracle.com/java/technologies/downloads/)(Wird in Tests für die Validierung des Codegens benötigt)
12
+
13
+
# Ausführen
14
+
Um eine .java in eine .class-datei zu kompilieren:
15
+
```bash
16
+
cargo run -- <input_file>
17
+
```
18
+
19
+
# Testen
20
+
1. Projekt bauen: `cargo build`
5
21
6
22
## Parser
7
23
24
+
2. Parser tests ausführen: `cargo test test_parser`
8
25
## Typchecker
9
26
10
-
1. Projekt bauen: `cargo build`
11
-
2. Go to lib folder: `cd lib`
12
-
3. Typechecker tests ausführen: `cargo test test_typechecker`
27
+
2. Typechecker tests ausführen: `cargo test test_typechecker`
13
28
14
29
Spezifischen Test ausführen: `cargo test <test_name>::test_typechecker`
15
30
16
31
## Codegenerierung
17
32
33
+
2. Codegenerierung tests ausführen: `cargo test test_codegen`
0 commit comments