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
Copy file name to clipboardExpand all lines: README.md
+16-20
Original file line number
Diff line number
Diff line change
@@ -4,14 +4,14 @@ A MiniJava Compiler written in Rust.
4
4
5
5
## MiniJava
6
6
7
-
MiniJava is a subset of Java. It is a simple object-oriented language that supports classes, single inheritance(not
7
+
MiniJava is a subset of Java. It is a simple object-oriented language that supports classes, single inheritance(not
8
8
supported in this compiler), and strong typing.
9
9
10
10
## Build
11
11
12
12
### Requirements
13
13
14
-
-[Rust](https://rustup.rs/)
14
+
-[Rust](https://rustup.rs/)
15
15
16
16
### Build
17
17
@@ -22,29 +22,25 @@ cargo build --release
22
22
## Usage
23
23
24
24
```bash
25
-
cargo r -r -- <input_file><output_file>
25
+
cargo r -r -- <input_file>[<output_file>]
26
26
```
27
27
28
-
# Disclaimer
29
-
This compiler was done as a student project and doesn't support many language features and may contain bugs. It is not intended to be used in production.
28
+
## Documentation
30
29
31
-
However, it was a great learning experience, and we hope it can be useful to someone else.
30
+
A more detailed documentation on how to use the separate parts of the compiler is given in [User-Doc](./docs/User-Doc.md). A detailed documentation on how the project was done is given in [Project-Doc](./docs/Project-Doc.md).
32
31
33
-
## Parsing
34
-
Parsing is done using a [Pest grammar](https://pest.rs/).
32
+
## Disclaimer
35
33
36
-
## Type Checking
37
-
I do not know what to write about type checking as i am clueless
34
+
This compiler was done as a student project and doesn't support many language features and may contain bugs. It is not intended to be used in production.
38
35
39
-
## Code Generation
40
-
Code generation is done manually to generate Java Bytecode. The code generation uses two passes.
41
-
The first pass generates all instructions and the second one is used to convert relative jumps into absolute jumps.
36
+
However, it was a great learning experience, and we hope it can be useful to someone else.
- Welche Types, Strukturen und deren Kombinationen werden unterstützt?
2
+
3
+
- Welche Types, Strukturen und deren Kombinationen werden unterstützt?
3
4
4
5
## Parser
5
6
@@ -19,32 +20,33 @@ Funktionsweise des Typecheckers:
19
20
Der Typechecker iteriert über alle übergebenen Klassen und prüft auf mehrfache Klassendeklarationen. Die Felddeklarationen werden in einem neuen getypten Klassenobjekt gespeichert, in dem alle weiteren getypten Methoden und deren Statements gespeichert werden. Anschließend iteriert der Typechecker über alle Methoden und prüft auf mehrfache Methodendeklarationen und typisiert die Methodenparameter. Nachdem alle Statements typisiert wurden, wird der Rückgabetyp der Methode geprüft und die Methode im getypten Klassenobjekt gespeichert. Nach dem Überprüfen und Typisieren der Klasse wird diese in einen Vektor an getypten Klassen gespeichert. Nachdem alle Klassen getypt wurden, wird der Vektor an getypten Klassen zurückgegeben.
20
21
21
22
Folgende Funktionen werden vom Typechecker übernommen:
22
-
- Liest alle definierten Types/Strukturen
23
-
- Typisierung aller Variablen und Ausdrücke
24
-
- Checken von mehreren Klassen
25
-
- Checken der Rückgabe-Typen von Methoden
26
-
- Ersetzen von LocalOrFieldVar durch LocalVar oder FieldVar
27
23
24
+
- Liest alle definierten Types/Strukturen
25
+
- Typisierung aller Variablen und Ausdrücke
26
+
- Checken von mehreren Klassen
27
+
- Checken der Rückgabe-Typen von Methoden
28
+
- Ersetzen von LocalOrFieldVar durch LocalVar oder FieldVar
28
29
29
30
Folgende Fehler werden vom Typechecker erkannt:
30
-
- Mehrfache Deklaration einer Klasse
31
-
- Mehrfache Deklaration einer Methode
32
-
- Type-Mismatch bei Methodenrückgabe
33
-
- Type-Mismatch bei Methodenaufruf
34
-
- Type-Mismatch bei Methodenparametern
35
-
- Type-Mismatch bei FieldDecl
36
-
- Type-Mismatch bei Unary/Binary-Operationen
37
-
- Mehrfache Deklaration von FieldDecl
38
-
- Mehrfache Deklaration von LocalOrFieldVar
39
-
- Nicht deklarierte Variable
40
-
- Unbekannte Methode bei Methodenaufruf
41
-
- Verwendung einer nicht deklarierten Variable
42
-
- Panic bei TypedExpr in AST
43
-
- Bedingung von If/While-Statement ist kein Bool
31
+
32
+
- Mehrfache Deklaration einer Klasse
33
+
- Mehrfache Deklaration einer Methode
34
+
- Type-Mismatch bei Methodenrückgabe
35
+
- Type-Mismatch bei Methodenaufruf
36
+
- Type-Mismatch bei Methodenparametern
37
+
- Type-Mismatch bei FieldDecl
38
+
- Type-Mismatch bei Unary/Binary-Operationen
39
+
- Mehrfache Deklaration von FieldDecl
40
+
- Mehrfache Deklaration von LocalOrFieldVar
41
+
- Nicht deklarierte Variable
42
+
- Unbekannte Methode bei Methodenaufruf
43
+
- Verwendung einer nicht deklarierten Variable
44
+
- Panic bei TypedExpr in AST
45
+
- Bedingung von If/While-Statement ist kein Bool
44
46
45
47
## Codegenerierung
46
48
47
-
ByteCode-Umwandlung, Bugfixes, StackSize und viele Improvements: Val Richter
49
+
ByteCode-Umwandlung, Bugfixes, StackSize und viele Verbesserungen: Val Richter
48
50
49
51
Definition DIR(Duck 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
52
@@ -60,7 +62,7 @@ hatten häufig off-by-one Errors.
60
62
61
63
Zudem musste eine StackMapTable implementiert werden, da die JVM sonst unsere Klassen nicht lädt.
62
64
Das Troubleshooten von Testfehlern war auch sehr aufwending da oft javap gar nicht erst den Fehler im Klassencode ausgab
63
-
und wir mit einem Hex-Editor die Klassen von Hand analysieren mussten, da es auch kein anderes Tool gab, um solche Fehler
65
+
und wir mit einem Hex-Editor die Klassen von Hand analysieren mussten, da es auch kein anderes Tool gab, um solche Fehler
64
66
auszugeben und die Zeit fehlte ein Eigenes zu schreiben.
65
67
66
68
Da es auch keine Dokumentation gibt, die in etwa zeigt, welcher Bytecode für welche Operationen genutzt wird, mussten wir
@@ -69,15 +71,13 @@ in die wir manuell Java Code eingeben und schauten, was für Bytecode bei versch
69
71
wird, was sehr zeitaufwendig war.
70
72
71
73
Auch sehr schwierig war die Implementation einer StackMapTable, da Java diese erwartet. Diese ist eine Tabelle, die für
72
-
jede Instruktion die Typen der Elemente auf dem Stack in komprimiertem Format angibt. Diese Tabelle muss manuell
74
+
jede Instruktion die Typen der Elemente auf dem Stack in komprimiertem Format angibt. Diese Tabelle muss manuell
73
75
erstellt werden und über die Typen aller Variablen, die in den Stack geschrieben wurden Bescheid wissen.
74
76
75
77
## Testing
76
78
77
-
- Wer hat welche Arbeit beim Testing gemacht?
78
-
- Wie funktioniert das Testing genau?
79
-
80
79
Das Testen des Codegens war sehr aufwendig, er besteht aus diesen Schritten:
80
+
81
81
1. Ein handgeschriebener TAST wird geladen
82
82
2. Eine Java Klasse wird erstellt die jede Methode im TAST aufruft
83
83
3. Die java Klasse wird mit javac kompiliert und ausgeführt, wobei die Ausgabe in einer Variable gespeichert wird
@@ -90,9 +90,6 @@ Das Testen des Codegens war sehr aufwendig, er besteht aus diesen Schritten:
90
90
91
91
## AST-Definition
92
92
93
-
- Wer hat wie zur endgültigen Definition des ASTs beigetragen?
94
-
- v.a. interessant, dass während der Arbeit der einzelnen Teams, der AST iterativ verändert wurde
95
-
96
-
## Projektmanagement
93
+
Die genaue Definition des ASTs, die verwendet wurde, ist in [AST-Klassendiagramm](./AST-Klassendiagramm.png) als UML-Diagramm dargestellt. Zusätzlich lassen sich in [hier](./Notizen%20zum%20AST.md) einige Erklärungen zum Diagramm finden.
97
94
98
-
- Welche Arbeit lief von wem ins Projektmanagement?
- 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
1
## Vorbedingungen
2
+
7
3
[Rust installieren](https://rustup.rs/):
4
+
8
5
```bash
9
6
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
10
7
```
11
-
-[JDK 20](https://www.oracle.com/java/technologies/downloads/)(Wird in Tests für die Validierung des Codegens benötigt)
8
+
9
+
-[JDK 20](https://www.oracle.com/java/technologies/downloads/) (Wird in Tests für die Validierung des Codegens benötigt)
12
10
13
11
# Ausführen
12
+
14
13
Um eine .java in eine .class-datei zu kompilieren:
14
+
15
15
```bash
16
-
cargo run --<input_file>
16
+
cargo r -r --<input_file> [<output_file>]
17
17
```
18
18
19
19
# Testen
20
+
20
21
1. Projekt bauen: `cargo build`
21
22
22
23
## Parser
23
24
24
-
2. Parser tests ausführen: `cargo test test_parser`
25
+
2. Parser tests ausführen: `cargo test --lib test_parser`
26
+
27
+
Spezifischen Test ausführen: `cargo test --lib <test_name>::test_parser`
28
+
25
29
## Typchecker
26
30
27
-
2. Typechecker tests ausführen: `cargo test test_typechecker`
31
+
2. Typechecker tests ausführen: `cargo test --lib test_typechecker`
28
32
29
-
Spezifischen Test ausführen: `cargo test <test_name>::test_typechecker`
33
+
Spezifischen Test ausführen: `cargo test --lib <test_name>::test_typechecker`
30
34
31
35
## Codegenerierung
32
36
33
-
2. Codegenerierung tests ausführen: `cargo test test_codegen`
37
+
2. Codegenerierung tests ausführen: `cargo test --lib test_codegen`
38
+
39
+
Spezifischen Test ausführen: `cargo test --lib <test_name>::test_codegen`
34
40
35
41
## Testing
36
-
Zur ausführung aller tests: `cargo test`
42
+
43
+
Zur ausführung aller tests: `cargo test --lib`. Dabei sollte beachtet werden, dass die Tests teilweise die selben Dateien schreiben und entsprechend Probleme aufkommen können, wenn alle Tests auf einmal ausgeführt werden. Diese Probleme treten nicht auf, wenn die Teile des Compilers (Parser, Typchecker, Codegenerierung) einzeln getestet werden.
0 commit comments