This repository is part of a Uni-Project to write a complete Compiler for a subset of Java.

Related tags

Kotlin compiler
Overview

Compiler

This repository is part of a Uni-Project to write a complete Compiler for a subset of Java.

Features

  • error recovery using context sensitive anchor sets
  • source annotated error messages
  • type-safe AST annotations and wrapping using Wrapped

Documentation

Building

$ ./build
# Or just:
$ ./gradlew shadowJar
# To build the `LexerDEA.svg` file:
$ dot LexerDEA.dot -T svg > LexerDEA.svg

Testing

Our tests consist of unit tests written directly in kotlin and *MjTestSuitetests, that run tests using all MjTest-tests directly in kotlin. This makes it easier so use the mjtests in the IDE.

# make sure the `test-cases` submodule is cloned
$ git submodule update --recursive
$ ./gradlew test

Running

$ ./run <arguments>
# Or just
$ java -jar out/libs/compiler-all.jar <arguments>

Structure

The repository is organized into packages:

  • ast: The AST type, Visitor and Wrapper type
  • error: Functionality for attaching Errors and Warnings to source-locations
  • lex: The lexer and functionality for getting the current source-location
  • parser
  • prettyprinter: PrettyPrinting Visitor
Comments
  • peek(>0) throws exception when reaching EOF

    peek(>0) throws exception when reaching EOF

    Ich dachte wir hatten sichergestellt, dass der Compiler nicht explodiert, wenn ein ungünstiges EOF erreicht wird.

    Aber ein lookahead über mehrere Zeichen (an einer new-array-expression) führt zu einer unhandled exception:

    Eingabe:

    class A {
        public static void main(String[] args) {
            int a = new int
    
    Internal error: tried to peek past the end of the sequence
    java.lang.IllegalStateException: tried to peek past the end of the sequence
    	at edu.kit.compiler.parser.LookaheadBuffer.peek(LookaheadBuffer.kt:43)
    	at edu.kit.compiler.parser.AbstractParser.peek(AbstractParser.kt:45)
    	at edu.kit.compiler.parser.AbstractParser.peek$default(AbstractParser.kt:45)
    	at edu.kit.compiler.parser.Parser.parseUnaryExpression-7yDSdB4(Parser.kt:366)
    	at edu.kit.compiler.parser.Parser.parseExpression-Qkhz27U$compiler(Parser.kt:395)
    	at edu.kit.compiler.parser.Parser.parseExpression-Qkhz27U$compiler$default(Parser.kt:391)
    	at edu.kit.compiler.parser.Parser.parseNewArrayExpression-7yDSdB4(Parser.kt:201)
    	at edu.kit.compiler.parser.Parser.parseNewObjectArrayExpression-7yDSdB4(Parser.kt:136)
    	at edu.kit.compiler.parser.Parser.parsePrimaryExpression-7yDSdB4(Parser.kt:106)
    	at edu.kit.compiler.parser.Parser.parsePostfixExpression-7yDSdB4(Parser.kt:263)
    	at edu.kit.compiler.parser.Parser.parseUnaryExpression-7yDSdB4(Parser.kt:387)
    	at edu.kit.compiler.parser.Parser.parseExpression-Qkhz27U$compiler(Parser.kt:395)
    	at edu.kit.compiler.parser.Parser.parseExpression-Qkhz27U$compiler$default(Parser.kt:391)
    	at edu.kit.compiler.parser.Parser.parseLocalVariableDeclarationStatement-7yDSdB4(Parser.kt:1103)
    	at edu.kit.compiler.parser.Parser.parseBlockStatement-7yDSdB4(Parser.kt:865)
    	at edu.kit.compiler.parser.Parser.parseBlockStatements(Parser.kt:841)
    	at edu.kit.compiler.parser.Parser.parseBlock-7yDSdB4$compiler(Parser.kt:813)
    	at edu.kit.compiler.parser.Parser.parseMainMethod-7yDSdB4(Parser.kt:659)
    	at edu.kit.compiler.parser.Parser.parseClassMember-7yDSdB4(Parser.kt:536)
    	at edu.kit.compiler.parser.Parser.parseClassMembers-7yDSdB4(Parser.kt:486)
    	at edu.kit.compiler.parser.Parser.parseClassDeclarations-7yDSdB4$compiler(Parser.kt:460)
    	at edu.kit.compiler.parser.Parser.parse(Parser.kt:38)
    	at edu.kit.compiler.Compiler.compile(Compiler.kt:82)
    	at edu.kit.compiler.Cli.run(Main.kt:26)
    	at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:198)
    	at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:18)
    	at com.github.ajalt.clikt.core.CliktCommand.parse(CliktCommand.kt:395)
    	at com.github.ajalt.clikt.core.CliktCommand.parse$default(CliktCommand.kt:392)
    	at com.github.ajalt.clikt.core.CliktCommand.main(CliktCommand.kt:410)
    	at com.github.ajalt.clikt.core.CliktCommand.main(CliktCommand.kt:435)
    	at edu.kit.compiler.MainKt.main(Main.kt:30)
    
    Process finished with exit code 127
    
    bug 
    opened by Cydhra 4
  • Failing Tests finden & fixen @csicar

    Failing Tests finden & fixen @csicar

    • [x] nimmt 01 als syntaktisch korrekten Ausdruck an und behält nur 0
    • [x] nicht-statische Methode main kann nicht aufgerufen werden
    • [x] System.out.println(new A().bla(new A()));, bla gibt A zurück
    • [x] Fehlermeldung von System.out.println(new A()) gibt unformatierte Compiler-Objekte aus
    opened by csicar 2
  • Utility Functions vereinigen

    Utility Functions vereinigen

    Es gibt gefühlt 300 verschiedene Funktionen um etwas am AST zu checken und im Fehlerfall nen Error auszugeben. Die könnte man mal alle in eine elegante Lösung vereinigen.

    Auch sonstige Utilities kann man dabei mal auf Redundanz checken.

    enhancement 
    opened by Cydhra 2
  • Lookahead Recovery

    Lookahead Recovery

    Wenn der Parser eine Unterscheidung durch Lookahead macht, und im else Teil nicht failt sondern einen rekursiven Abstieg macht, dann wird er nach dem Abstieg bei einem illegalen Token falsche Annahmen bezüglich der Recovery treffen. Illegale Tokens müssen vor dem Abstieg gelesen werden:

    Theoretisches Beispiel:

    when(val p = peek()) {
        case LBRACE -> parseArrayAccess(anc)
        case LPAREN -> parseMethodCall(anc)
        else -> parseStatement(anc)
    }
    

    wird bei einem Input von ident!(...) (mit ident gerade gelesen, also peek() == '!' in parseStatement absteigen. Dann wird in parseStatement erkannt dass ! illegal ist, aber dennoch ins Statement parsing recovered, obwohl danach das vorher nicht betrachtete ( steht.

    opened by Cydhra 2
  • Implement lenient parsing

    Implement lenient parsing

    Jetzt wo der Parser wiederaufsetzen kann, muss der AST noch fehlertolerant konstruiert werden, (sodass der Parser nicht trotz Wiederaufsetzen abstürzen muss).

    Ich habe Lenient.Error abgeändert und schreibe keine Fehlermeldungen mehr hinein, weil die ohnehin nur im SourceFile benötigt und verwertet werden, und es den Code übersichtlicher machen sollte, wenn ich die da direkt hinschreibe. Vorrangig muss jedoch der AST noch weiter verändert werden, und Parserfunktionen so abgeändert, dass sie Nodes als invalid kennzeichnen, wenn Parserfehler entstehen (auch wenn alle notwendigen Informationen zum Parsing theoretisch vorliegen).

    Der Branch baut nicht, weil ich die expect-Funktionen so abgeändert habe, dass sie auch Optional.empty() zurückgeben können, wenn ein erwartetes Token nicht da ist.

    opened by Cydhra 2
  • correct input processing

    correct input processing

    (hopefully) correct processing of files with

    • nice error handling
    • buffered character-based loading-
    • asynchronous loading of data
    • correct handling of character devices
    • correct encoding
    • look-ahead capabilities
    opened by Cydhra 2
  • Setup Unit-Testing

    Setup Unit-Testing

    Joa, wir sollten wohl noch irgendeine Form von junit aufsetzen, für ein paar Unit-Tests. Optional mit tollem Github Workflow für automatisierte Tests beim Merge/Commit auf den Master-Branch.

    Sollen wir auch versuchen irgendwelche externen Integration-Tests aufzusetzen?

    enhancement discussion 
    opened by Cydhra 2
  • Update your gradle wrapper to 7.3 or open a nix-shell with a JDK<17 in your ./build script

    Update your gradle wrapper to 7.3 or open a nix-shell with a JDK<17 in your ./build script

    Apparently, gradle 7.1 doesn't support JDK 17, which is installed in our Speedcenter. That's probably why your build seems to fail consistently with "Unsupported class file major version 61": http://speedcenter.informatik.kit.edu/compprakt/run-detail/ff5e36b7-d470-40ea-adb0-5d28a4497ec1

    opened by sgraf812 2
  • Blatt 9 - Codeerzeugung

    Blatt 9 - Codeerzeugung

    • #76
    • #101
    • Codeerzeugung
      • [x] Zwischensprache(n?): für molki @iTob191
      • [x] SSA-Abbau (wann?)
      • [x] #109
      • [x] Befehlsanordnung
      • [x] Register-"Allokation" @Cydhra
    tracking 
    opened by iTob191 1
  • Reading/Writing to array fields fails because array member field is treated as read

    Reading/Writing to array fields fails because array member field is treated as read

    Weil wir Feldzugriffe immer als Lesezugriff werten, wenn sie nicht in einer Assignment Expression stehen, wird eine FieldAccessExpression als target einer ArrayAccessExpression immer als Lesezugriff verstanden, obwohl sie teil eines Schreibzugriffs sein sollte.

    opened by Cydhra 1
  • Neue Parser/PrettyPrinter-Tests schlagen fehl

    Neue Parser/PrettyPrinter-Tests schlagen fehl

    Auf feature/type_analysis ham wir den MJ-Tests-Stand aktualisiert, um die semantic tests zu bekommen und da ist ein Test dabei, der fehlschlägt: OpeningComment.invalid.mj

    Muss man sich irgendwann mal anschauen.

    bug 
    opened by RobinRSchulz 1
  • Further Optimizations

    Further Optimizations

    • [x] Konstantenfaltung #97
    • [ ] Triviale Phi-Funktionen entfernen
    • [ ] Unnötige Blöcke entfernen
    • [x] Mathematische Äquivalenzen @iTob191
    • [ ] Common Subexpression Elimination
    • [ ] Load/Store
    • [ ] (Strength Reduction)
    • [ ] Loop-Invariant Code Motion
    • [ ] Inlining maybe? @iTob191
    • [ ] Tailrec maybe maybe? @csicar
    opened by iTob191 0
Owner
null
A Kotlin compiler plugin that allows Java callers to pass in null for default parameters

kotlin-null-defaults (Compiler plugin) (Gradle Plugin) ( Currently pending approval) A Kotlin compiler plugin that allows Java callers to pass in null

Youssef Shoaib 7 Oct 14, 2022
Android sliding panel that is part of the view hierarchy, not above it.

sliding-panel A ViewGroup that implements a sliding panel that is part of the view hierarchy, not above it. Difference from other libraries All other

Pierfrancesco Soffritti 441 Nov 12, 2022
Location Reminder App build as part of the udacity nanodegree program

Location Reminder a Location Reminder App with notifications that remind the user to do something when the user is at a specific location. built as pa

André Wagner 0 Dec 26, 2021
Cross-platform framework for building truly native mobile apps with Java or Kotlin. Write Once Run Anywhere support for iOS, Android, Desktop & Web.

Codename One - Cross Platform Native Apps with Java or Kotlin Codename One is a mobile first cross platform environment for Java and Kotlin developers

Codename One 1.4k Jan 9, 2023
Write a Ghidra Extension without using Java or Eclipse!

Ghidra Extension in Kotlin using IntelliJ IDEA Write a Ghidra Extension without using Java or Eclipse! Setup Hit Use this template at the top of the r

Florian Magin 7 Dec 15, 2022
Playground project for Koin Koin Compiler - Sandbox

Koin Compiler - Sandbox The goal of Koin compiler & Annotations project is to help declare Koin definition in a very fast and intuitive way, and gener

insert-koin.io 17 Nov 22, 2021
📒 NotyKT is a complete 💎Kotlin-stack (Backend + Android) 📱 application built to demonstrate the use of Modern development tools with best practices implementation🦸.

NotyKT ??️ NotyKT is the complete Kotlin-stack note taking ??️ application ?? built to demonstrate a use of Kotlin programming language in server-side

Shreyas Patil 1.4k Jan 4, 2023
The most complete and powerful data-binding library and persistence infra for Kotlin 1.3, Android & Splitties Views DSL, JavaFX & TornadoFX, JSON, JDBC & SQLite, SharedPreferences.

Lychee (ex. reactive-properties) Lychee is a library to rule all the data. ToC Approach to declaring data Properties Other data-binding libraries Prop

Mike 112 Dec 9, 2022
An experimental tool for building console UI in Kotlin using the Jetpack Compose compiler/runtime

An experimental tool for building console UI in Kotlin using the Jetpack Compose compiler/runtime

Jake Wharton 1.4k Dec 28, 2022
An annotation and Kotlin compiler plugin for enforcing a when statement is exhaustive

An annotation and Kotlin compiler plugin for enforcing a when statement is exhaustive

Cash App 468 Jan 4, 2023
A composite Github Action to execute the Kotlin Script with compiler plugin and dependency caching!

Kotlin Script Github Action Kotlin can also be used as a scripting language, which is more safer, concise, and fun to write than bash or python. Githu

Suresh 9 Nov 28, 2022
Build a compiler in Kotlin (based on the original tutorial by Jack Crenshaw)

Let's Build a Compiler Based on the original series "Let’s Build a Compiler!" by Jack Crenshaw. This is an adaptation of the original series to Kotlin

null 2 Oct 9, 2022
A Open GAL compiler based on OpenGAL 0.3.1

A Open GAL compiler based on OpenGAL 0.3.1

Li Plum 3 Dec 21, 2022
Lightweight compiler plugin intended for Kotlin/JVM library development and symbol visibility control.

Restrikt A Kotlin/JVM compiler plugin to restrict symbols access, from external project sources. This plugin offers two ways to hide symbols: An autom

Lorris Creantor 18 Nov 24, 2022
A simple example of kotlim compiler plugin with FIR and IR.

A simple Kotlin compiler plugin example This Kotlin compiler plugin generates a top level class: public final class foo.bar.MyClass { fun foo(): S

Anastasiia Birillo 10 Dec 2, 2022
A CLI tool to convert multi-module Jetpack Compose compiler metrics into beautiful HTML reports

A CLI tool to convert multi-module Jetpack Compose compiler metrics into beautiful HTML reports 1. What are Jetpack Compose compiler metrics? The Comp

Jaya Surya Thotapalli 116 Jan 3, 2023
Android MVVM framework write in kotlin, develop Android has never been so fun.

KBinding 中文版 Android MVVM framework write in kotlin, base on anko, simple but powerful. It depends on my another project AutoAdapter(A library for sim

Benny 413 Dec 5, 2022
Don't write a RecyclerView adapter again. Not even a ViewHolder!

LastAdapter Don't write a RecyclerView adapter again. Not even a ViewHolder! Based on Android Data Binding Written in Kotlin No need to write the adap

Miguel Ángel Moreno 781 Dec 19, 2022
use kmm to write a flutter plugin

use KMM to write a flutter plugin The reference plugin_codelab example plugin that accompanies the How to write a Flutter plugin codelab. I changed pl

libill 8 Nov 9, 2022