2024-04-24 12:08:32 +00:00
|
|
|
# CompilerNichtHaskell
|
2024-04-24 12:35:09 +00:00
|
|
|
|
2024-06-25 15:26:56 +00:00
|
|
|
## Teamrollen
|
|
|
|
|
2024-04-24 12:35:09 +00:00
|
|
|
- Scanner & Parser: Julian Kraus und Laurenz Schleicher
|
|
|
|
- Semantische Analyse: Juha Ahmad
|
|
|
|
- Code-Generierung: Simon Wittmann
|
|
|
|
- Testen: Jonathan Fleischmann
|
2024-06-22 15:20:18 +00:00
|
|
|
|
2024-06-25 15:47:40 +00:00
|
|
|
## Erbrachte Leistungen
|
|
|
|
- Laura Schleicher: Grammatik entwickeln, Records, Statements als Liste zurückgeben, Generator, Syntactic Sugar auflösen
|
2024-07-03 20:05:57 +00:00
|
|
|
- Julian Kraus: Grammatik entwickeln, Generator, Syntactic Sugar auflösen, Parser Exceptions sammeln
|
2024-06-23 16:35:57 +00:00
|
|
|
- Ahmad Juha: Typcheck
|
2024-07-03 20:44:00 +00:00
|
|
|
- Simon Wittmann: Codegen, Logging, CommandLine Nutzung
|
2024-07-05 06:58:10 +00:00
|
|
|
- Jonathan Fleischmann: Testfiles, manuelle übersetzung in AST und TypedAST, JUnit-Tests für Scanner, Parser und
|
|
|
|
Typecheck und Compiler, Testfiles für E2E-Tests, JUnit-Tests für E2E-Tests mit Reflections, Negative Testfiles und
|
|
|
|
Überprüfung, ob sie bei Kompilierung Fehler werfen, Dokumentation
|
2024-06-25 15:26:56 +00:00
|
|
|
|
|
|
|
## Besonderheiten unserer Implementierung
|
|
|
|
|
2024-06-25 15:47:40 +00:00
|
|
|
- Zugriff auf Felder nur über `this`-Referenz möglich
|
2024-06-25 15:26:56 +00:00
|
|
|
- `print()`statt `System.out.println()`
|
2024-06-25 15:47:40 +00:00
|
|
|
- keine Accessmodifier/alles ist public
|
2024-06-28 20:57:43 +00:00
|
|
|
- logische Statements MÜSSEN geklammert werden, ansonsten wird ununterbrochen von links nach rechts berechnet
|
|
|
|
(so würde z.B. (true || false == false) false zurückgeben)
|
2024-07-02 19:49:53 +00:00
|
|
|
- i++ und i-- sind nur in for-Schleifen oder Statements erlaubt, --i und ++i sind generell nicht erlaubt
|
|
|
|
- ein File kann nur eine Klasse enthalten
|
2024-07-04 16:34:32 +00:00
|
|
|
- Datentypen sind auf int, boolean und char sowie Klassen beschränkt
|
2024-07-03 16:36:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
## Aufbau der Tests
|
2024-07-03 20:34:46 +00:00
|
|
|
|
2024-07-05 06:58:10 +00:00
|
|
|
### Tests für den Scanner, Parser und Typecheck:
|
2024-07-03 16:36:54 +00:00
|
|
|
- Die Testfiles (.java), die alle Features abdecken, sind im Ordner `src/test/testFiles/ASTandTypedASTFeatures` zu finden.
|
2024-07-05 08:43:34 +00:00
|
|
|
Der Name des jeweiligen Files gibt circa an, welches Feature / welche Features es abdeckt.
|
|
|
|
- Ihre manuell übersetzten ASTs befinden sich im Ordner `src/test/java/ScannerParserTests/FeaturesASTs`
|
|
|
|
- Die Übereinstimmung der manuell übersetzten ASTs mit den vom Compiler generierten ASTs wird mit JUnit-Tests im File
|
|
|
|
`src/test/java/ScannerParserTests/ScannerParserTests.java` überprüft
|
|
|
|
- Die manuell übersetzten TypedASTs befinden sich im Ordner `src/test/java/TypeCheckTests/FeaturesTypedASTs`
|
|
|
|
- Die Übereinstimmung der manuell übersetzten TypedASTs mit den vom Compiler generierten TypedASTs wird mit JUnit-Tests im File
|
|
|
|
`src/test/java/TypeCheckTests/TypingTests.java` überprüft
|
2024-07-03 16:36:54 +00:00
|
|
|
- Weitere Testfiles, die nicht unbedingt auf ein bestimmtes Feature abzielen, sind im Ordner `src/test/testFiles/MoreTestFiles`
|
2024-07-05 08:43:34 +00:00
|
|
|
zu finden, die manuell übersetzen ASTs und TypedASTs dazu sind im Ordner `src/test/java/ScannerParserTests/MoreTestsASTs`
|
|
|
|
und `src/test/java/TypeCheckTests/MoreTestsTypedASTs` zu finden. Die korrekte Umwandlung der Testfiles in AST und
|
|
|
|
TypedAST wird in den gleichen Testklassen wie die Features getestet.
|
2024-07-03 20:34:46 +00:00
|
|
|
|
2024-07-03 16:36:54 +00:00
|
|
|
### Tests für den gesamten Compiler:
|
2024-07-05 06:58:10 +00:00
|
|
|
- Da die Kompilierung der Testfiles für den Scanner, Parser und Typecheck teilweise nicht gut mit Reflections testbar ist,
|
2024-07-03 16:36:54 +00:00
|
|
|
gibt es extra Testfiles für das Testen des Compilers im Ordner `src/test/testFiles/E2EFeatures`
|
|
|
|
- Jedes der Testfiles hat eine eigene Testklasse, welche sich im Ordner `src/test/java/E2ETests/Features` befindet. Diese
|
2024-07-03 20:34:46 +00:00
|
|
|
Testklassen haben jeweils einen Namen, der sich aus `E2E_` und dem Namen des Testfiles zusammensetzt. Sie prüfen
|
2024-07-03 16:36:54 +00:00
|
|
|
mithilfe der Hilfsklasse `src/test/java/E2ETests/BytecodeTestUtil.java`, ob der Compiler die Testfiles korrekt in
|
2024-07-03 20:34:46 +00:00
|
|
|
class-Files umwandelt. Die Hilfsklasse erstellt ein Class<?>-Objekt der Klasse und implementiert Methoden, welche mit
|
2024-07-05 08:43:34 +00:00
|
|
|
Reflections Werte aus einem Objekt der Klasse auslesen und zurückgeben. Diese Werte werden dann mit den erwarteten
|
|
|
|
Werten in der jeweiligen Testklasse verglichen.
|
2024-07-03 20:34:46 +00:00
|
|
|
|
2024-07-03 16:36:54 +00:00
|
|
|
### Negative Tests:
|
|
|
|
- Um zu überprüfen, dass der Compiler auch bei fehlerhaften Testfiles fehlschlägt, gibt es Testfiles im Ordner
|
2024-07-05 08:43:34 +00:00
|
|
|
`src/test/testFiles/Negative`, welche nicht korrekt kompiliert werden können. Die Testfiles sind in mehrere Kategorien
|
2024-07-03 16:36:54 +00:00
|
|
|
unterteilt, die durch die Ordnerstruktur in `src/test/testFiles/Negative` dargestellt werden. Für jede Kategorie gibt es
|
|
|
|
eine eigene Testklasse, die sich im Ordner `src/test/java/NegativeTests` befindet und den gleichen Namen wie der Ordner
|
|
|
|
ihrer Kategorie hat. Diese Testklassen versuchen die Testfiles ihrer Kategorie zu kompilieren und erwarten, dass der
|
2024-07-05 08:43:34 +00:00
|
|
|
Compiler fehlschlägt. Die Testfiles, die in keine Kategorie passen werden in der Testklasse
|
|
|
|
`src/test/java/NegativeTests/RestOfNegativeTests.java` getestet
|
|
|
|
- Hinweis: Bitte die Ausgabe in der Konsole ignorieren, diese Fehlermeldungen sind die erwarteten Fehlermeldungen,
|
|
|
|
die der Compiler ausgeben soll, werden in diesem Test-Fall jedoch nicht unterdrückt.
|