# "Nicht Haskel 2.0" Java Compiler Realisation of a subset of the Java Standard Compiler in the course Compiler Construction of the 4th semester Computer Science at the Duale Hochschule Stuttgart (Horb). This project aims to provide a simplified version of the Java compiler, focusing on key language features and demonstrating the principles of compiler construction. ## Realised Java syntax - **Data types**: `int`, `boolean`, `char` - **Access modifier**: `public`, `protected`, `private` - **Operators**: `=` `+` `-` `*` `%` `/` `>` `<` `>=` `<=` `==` `!=` `!` `&&` `||` `++` `--` - **Keywords**: `class`, `this`, `while`, `do`, `if`, `else`, `for`, `return`, `new`, `switch`, `case`, `break`, `default`, `:` - **Statements**: - `if` ... `if else` ... `else`; - `while` ... ; - `do` ... `while`; - `for`; - `switch` ... `case` ... ; - **Comments**: - Single line: `// comment` - Multi-line: `/* comment */` - **Further functions**: - All methods are overloadable - High maintainability and expandability through implementation of the visitor pattern - Logging Input and Outputs - Error Handling in the Semantic Check ## Project Structure ```plain src/ └── main/ ├── java/ │ ├── ast/ -> Defining the structure of the AST │ ├── bytecode/ -> Generate Java bytecode │ ├── main/ -> Running the compiler │ ├── parser/ │ │ ├── astBuilder/ -> Builder creating the AST │ │ ├── generated/ -> Antlr generated grammar │ │ └── grammar/ -> Antlr grammar │ ├── semantic/ -> Running the semantic check │ └── visitor/ -> Visitor interface └── resources/ test/ └── java/ │ ├── main/ -> Running E2E tests │ ├── parser/ -> Performs tests on the parser │ ├── semantic/ -> Performs tests on the semantic check └── resources/ -> Ressources for running the Tests ``` ## Class-Diagramm AST ![AST Diagramm](ast.png) ## Distribution of the realisation ### i22030 & i22035 Parser: - Grammar -> (src/main/java/parser/grammar) - Scanner - Parser - Abstract Syntax Tree (AST) -> (src/main/java/ast) - AstBuilder -> (src/main/java/parser/astBuilder) Parser tests: - ParserTests -> (src/test/java/parser) - TestCases -> (src/test/resources/input/singeFeatureTests) Other: - Documentation -> (README.md) - Ast Class-Diagramm -> (ast.png) - PowerPoint ### i22005 Semantic check: - Set all types and check whether types have been used correctly - Contexts -> (src/main/java/semantic/context) - Exceptions Handling -> (src/main/java/semantic/exceptions) Semantic Tests: - Typing and Type checking -> (src/test/java/semantic/EndToTypedAstTest) - Exception and feature test -> (src/test/resources/input/typedAstExceptionsTests) ### i22007 Bytecode generation: - Complete bytecode generation -> (src/mein/java/bytecode) ### i22011 Tests and execution: - Makefile - Running Compiler -> (src/main/main) - Running E2E tests -> (src/test/main) - Typing and Type checking -> (src/test/java/semantic/EndToTypedAstTest) ## Used Tools - [Maven 4.0](https://maven.apache.org/index.html) - Used for automating the build process and managing dependencies. - [ANTLR4 v.13.1](https://www.antlr.org/) - Used to parse the input Java code into the Abstract Syntax Tree. ## How to run the compiler ### Possibilities ### 1. Start miniCompiler using make: Make needs to be installed ```bash cd .\src\test\ ; make clean compile-miniCompiler ``` ### 2. Start miniCompiler using jar: If you do not have the .jar, download it [here](https://gitea.hb.dhbw-stuttgart.de/i22005/NichtHaskell2.0/src/branch/Endabgabe/src) or compile it using mvn package or make first ``` java.exe -DgenJar=bool -DgenClass=bool -jar path_to_jar\jarName.jar 'path_to_input_file.java' 'path_to_output_directory' ``` Example (jar needs to be in the target directory) ```bash java.exe -DgenJar=true -DgenClass=true -jar .\target\JavaCompiler-1.0-jar-with-dependencies.jar 'src/main/resources/input/CompilerInput.java' 'src/main/resources/output' ``` - set DgenJar true, to generate the jar, false for no jar ``` DgenJar=true ``` - set DgenClass true, to generate class files, false for no class files ``` DgenClass=true ```