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.
Copy file name to clipboardExpand all lines: docs/Project-Doc.md
+28-31
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,6 @@
1
1
## Supported types
2
-
- 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
@@ -28,32 +29,33 @@ Funktionsweise des Typecheckers:
28
29
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.
29
30
30
31
Folgende Funktionen werden vom Typechecker übernommen:
31
-
- Liest alle definierten Types/Strukturen
32
-
- Typisierung aller Variablen und Ausdrücke
33
-
- Checken von mehreren Klassen
34
-
- Checken der Rückgabe-Typen von Methoden
35
-
- Ersetzen von LocalOrFieldVar durch LocalVar oder FieldVar
36
32
33
+
- Liest alle definierten Types/Strukturen
34
+
- Typisierung aller Variablen und Ausdrücke
35
+
- Checken von mehreren Klassen
36
+
- Checken der Rückgabe-Typen von Methoden
37
+
- Ersetzen von LocalOrFieldVar durch LocalVar oder FieldVar
37
38
38
39
Folgende Fehler werden vom Typechecker erkannt:
39
-
- Mehrfache Deklaration einer Klasse
40
-
- Mehrfache Deklaration einer Methode
41
-
- Type-Mismatch bei Methodenrückgabe
42
-
- Type-Mismatch bei Methodenaufruf
43
-
- Type-Mismatch bei Methodenparametern
44
-
- Type-Mismatch bei FieldDecl
45
-
- Type-Mismatch bei Unary/Binary-Operationen
46
-
- Mehrfache Deklaration von FieldDecl
47
-
- Mehrfache Deklaration von LocalOrFieldVar
48
-
- Nicht deklarierte Variable
49
-
- Unbekannte Methode bei Methodenaufruf
50
-
- Verwendung einer nicht deklarierten Variable
51
-
- Panic bei TypedExpr in AST
52
-
- Bedingung von If/While-Statement ist kein Bool
40
+
41
+
- Mehrfache Deklaration einer Klasse
42
+
- Mehrfache Deklaration einer Methode
43
+
- Type-Mismatch bei Methodenrückgabe
44
+
- Type-Mismatch bei Methodenaufruf
45
+
- Type-Mismatch bei Methodenparametern
46
+
- Type-Mismatch bei FieldDecl
47
+
- Type-Mismatch bei Unary/Binary-Operationen
48
+
- Mehrfache Deklaration von FieldDecl
49
+
- Mehrfache Deklaration von LocalOrFieldVar
50
+
- Nicht deklarierte Variable
51
+
- Unbekannte Methode bei Methodenaufruf
52
+
- Verwendung einer nicht deklarierten Variable
53
+
- Panic bei TypedExpr in AST
54
+
- Bedingung von If/While-Statement ist kein Bool
53
55
54
56
## Codegenerierung
55
57
56
-
ByteCode-Umwandlung, Bugfixes, StackSize und viele Improvements: Val Richter
58
+
ByteCode-Umwandlung, Bugfixes, StackSize und viele Verbesserungen: Val Richter
57
59
58
60
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
59
61
@@ -69,7 +71,7 @@ hatten häufig off-by-one Errors.
69
71
70
72
Zudem musste eine StackMapTable implementiert werden, da die JVM sonst unsere Klassen nicht lädt.
71
73
Das Troubleshooten von Testfehlern war auch sehr aufwending da oft javap gar nicht erst den Fehler im Klassencode ausgab
72
-
und wir mit einem Hex-Editor die Klassen von Hand analysieren mussten, da es auch kein anderes Tool gab, um solche Fehler
74
+
und wir mit einem Hex-Editor die Klassen von Hand analysieren mussten, da es auch kein anderes Tool gab, um solche Fehler
73
75
auszugeben und die Zeit fehlte ein Eigenes zu schreiben.
74
76
75
77
Da es auch keine Dokumentation gibt, die in etwa zeigt, welcher Bytecode für welche Operationen genutzt wird, mussten wir
@@ -78,15 +80,13 @@ in die wir manuell Java Code eingeben und schauten, was für Bytecode bei versch
78
80
wird, was sehr zeitaufwendig war.
79
81
80
82
Auch sehr schwierig war die Implementation einer StackMapTable, da Java diese erwartet. Diese ist eine Tabelle, die für
81
-
jede Instruktion die Typen der Elemente auf dem Stack in komprimiertem Format angibt. Diese Tabelle muss manuell
83
+
jede Instruktion die Typen der Elemente auf dem Stack in komprimiertem Format angibt. Diese Tabelle muss manuell
82
84
erstellt werden und über die Typen aller Variablen, die in den Stack geschrieben wurden Bescheid wissen.
83
85
84
86
## Testing
85
87
86
-
- Wer hat welche Arbeit beim Testing gemacht?
87
-
- Wie funktioniert das Testing genau?
88
-
89
88
Das Testen des Codegens war sehr aufwendig, er besteht aus diesen Schritten:
89
+
90
90
1. Ein handgeschriebener TAST wird geladen
91
91
2. Eine Java Klasse wird erstellt die jede Methode im TAST aufruft
92
92
3. Die java Klasse wird mit javac kompiliert und ausgeführt, wobei die Ausgabe in einer Variable gespeichert wird
@@ -99,9 +99,6 @@ Das Testen des Codegens war sehr aufwendig, er besteht aus diesen Schritten:
99
99
100
100
## AST-Definition
101
101
102
-
- Wer hat wie zur endgültigen Definition des ASTs beigetragen?
103
-
- v.a. interessant, dass während der Arbeit der einzelnen Teams, der AST iterativ verändert wurde
104
-
105
-
## Projektmanagement
102
+
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.
106
103
107
-
- 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.
Copy file name to clipboardExpand all lines: lib/src/types.rs
-8
Original file line number
Diff line number
Diff line change
@@ -90,13 +90,6 @@ pub enum Stmt {
90
90
pubenumStmtExpr{
91
91
Assign(Expr,Expr),// first the name of the variable, then the value it is being assigned to
92
92
New(Type,Vec<Expr>),// first the class type, that should be instantiated, then the list of arguments for the constructor
93
-
// FIXME: This needs to be changed to represent more how the JVM handles method calls. We need a class(at least name) and a method name with the typed arguments inside it, also the return type
94
-
// #2 = Methodref #3.#17 // MethodTest.y:(I)I
95
-
// #3 = Class #18 // MethodTest
96
-
// #17 = NameAndType #19:#20 // y:(I)I
97
-
// #18 = Utf8 MethodTest
98
-
// #19 = Utf8 y
99
-
// #20 = Utf8 (I)I
100
93
MethodCall(Expr,String,Vec<Expr>),// first the object to which the method belongs (e.g. Expr::This), then the name of the method and lastly the list of arguments for the method call
101
94
TypedStmtExpr(Box<StmtExpr>,Type),
102
95
}
@@ -272,7 +265,6 @@ impl Type {
272
265
Type::Bool => "Z",
273
266
Type::String => "Ljava/lang/String;",
274
267
Type::Void => "V",
275
-
// FIXME: Either the class has the formatting `L<class>;' or we have to add it here.
0 commit comments