Skip to content

Commit 3d8f10b

Browse files
committed
minor changes in docs
1 parent 41a9ce5 commit 3d8f10b

File tree

3 files changed

+63
-63
lines changed

3 files changed

+63
-63
lines changed

README.md

+16-20
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ A MiniJava Compiler written in Rust.
44

55
## MiniJava
66

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
88
supported in this compiler), and strong typing.
99

1010
## Build
1111

1212
### Requirements
1313

14-
- [Rust](https://rustup.rs/)
14+
- [Rust](https://rustup.rs/)
1515

1616
### Build
1717

@@ -22,29 +22,25 @@ cargo build --release
2222
## Usage
2323

2424
```bash
25-
cargo r -r -- <input_file> <output_file>
25+
cargo r -r -- <input_file> [<output_file>]
2626
```
2727

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
3029

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).
3231

33-
## Parsing
34-
Parsing is done using a [Pest grammar](https://pest.rs/).
32+
## Disclaimer
3533

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.
3835

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.
4237

4338
## Authors
44-
- Flippchen
45-
- Marion
46-
- mfloto
47-
- Nereuxofficial
48-
- Sander
49-
- Tori
50-
- Val
39+
40+
- Philipp Wolf (Flippchen)
41+
- Maximilian Floto (mfloto)
42+
- Marion Hinkel (MarionHinkel)
43+
- Benedikt Brandmaier (Nereuxofficial)
44+
- Tori Gönnheimer (ToriTheGreenOne)
45+
- Sander Stella (SanderForGodot)
46+
- Val Richter (ArtInLines)

docs/Project-Doc.md

+28-31
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
## Supported types
2-
- Welche Types, Strukturen und deren Kombinationen werden unterstützt?
2+
3+
- Welche Types, Strukturen und deren Kombinationen werden unterstützt?
34

45
## Parser
56

@@ -19,32 +20,33 @@ Funktionsweise des Typecheckers:
1920
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.
2021

2122
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
2723

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
2829

2930
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
4446

4547
## Codegenerierung
4648

47-
ByteCode-Umwandlung, Bugfixes, StackSize und viele Improvements: Val Richter
49+
ByteCode-Umwandlung, Bugfixes, StackSize und viele Verbesserungen: Val Richter
4850

4951
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
5052

@@ -60,7 +62,7 @@ hatten häufig off-by-one Errors.
6062

6163
Zudem musste eine StackMapTable implementiert werden, da die JVM sonst unsere Klassen nicht lädt.
6264
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
6466
auszugeben und die Zeit fehlte ein Eigenes zu schreiben.
6567

6668
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
6971
wird, was sehr zeitaufwendig war.
7072

7173
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
7375
erstellt werden und über die Typen aller Variablen, die in den Stack geschrieben wurden Bescheid wissen.
7476

7577
## Testing
7678

77-
- Wer hat welche Arbeit beim Testing gemacht?
78-
- Wie funktioniert das Testing genau?
79-
8079
Das Testen des Codegens war sehr aufwendig, er besteht aus diesen Schritten:
80+
8181
1. Ein handgeschriebener TAST wird geladen
8282
2. Eine Java Klasse wird erstellt die jede Methode im TAST aufruft
8383
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:
9090

9191
## AST-Definition
9292

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.
9794

98-
- Welche Arbeit lief von wem ins Projektmanagement?
95+
![Klassendiagramm](AST-Klassendiagramm.png)

docs/User-Doc.md

+19-12
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,43 @@
1-
TBD
2-
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-
61
## Vorbedingungen
2+
73
[Rust installieren](https://rustup.rs/):
4+
85
```bash
96
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
107
```
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)
1210

1311
# Ausführen
12+
1413
Um eine .java in eine .class-datei zu kompilieren:
14+
1515
```bash
16-
cargo run -- <input_file>
16+
cargo r -r -- <input_file> [<output_file>]
1717
```
1818

1919
# Testen
20+
2021
1. Projekt bauen: `cargo build`
2122

2223
## Parser
2324

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+
2529
## Typchecker
2630

27-
2. Typechecker tests ausführen: `cargo test test_typechecker`
31+
2. Typechecker tests ausführen: `cargo test --lib test_typechecker`
2832

29-
Spezifischen Test ausführen: `cargo test <test_name>::test_typechecker`
33+
Spezifischen Test ausführen: `cargo test --lib <test_name>::test_typechecker`
3034

3135
## Codegenerierung
3236

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`
3440

3541
## 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

Comments
 (0)