Go to file
2024-07-05 13:24:48 +02:00
.gitea/workflows added maven test 2024-05-14 17:59:53 +02:00
.idea Huge Changes in TestFiles, ReflectionsTest, much more 2024-07-03 13:04:33 +02:00
.lib Doku, AllFeaturesClassExample not running!!! 2024-07-03 14:08:27 +02:00
src refactoring 2024-07-05 13:24:48 +02:00
.gitignore refactoring, readme 2024-07-04 16:49:14 +02:00
ast.png Fixing ReflectionTests 2024-07-04 18:57:36 +02:00
Makefile Changing location of Makefile 2024-07-04 21:13:38 +02:00
pom.xml E2E tests done 2024-07-04 15:22:05 +02:00
README.md Fixing ReflectionTests 2024-07-04 18:57:36 +02:00

"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

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

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
    • Used for automating the build process and managing dependencies.
  • ANTLR4 v.13.1
    • 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

cd .\src\test\ ; make clean compile-miniCompiler

2. Start miniCompiler using jar:

If you do not have the .jar, download it here 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)

 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