i22035
430d551f7d
Some checks are pending
Gitea Actions Demo / Explore-Gitea-Actions (push) Waiting to run
149 lines
4.7 KiB
Markdown
149 lines
4.7 KiB
Markdown
# "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.
|
|
|
|
## 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
|
|
```
|
|
|
|
## How to run tests
|
|
|
|
```bash
|
|
mvn test
|
|
```
|
|
Or start them manually in your IDE |