klang

klang je knihovna pro tvorbu parserů (programovacích) jazyků v Kotlinu.

Oproti ostatním (ANTLR, Bison etc.) se snaží zjednodušit integraci (není potřeba zvláštní build step), a umožňuje komponovat parsery z menších celků.

Ukázka:

sealed class AST {
    class Num(val value: Int): AST()
    class Op(val operator: String, val a: AST, val b: AST): AST()
}

// Lesana == "lexikálně-syntaktický analyzátor"
val lsn = lesana<AST> {
    // Zadefinujeme neterminály. Každý symbol má definován datový typ, který bude nést (zde AST).
    val top = NodeID<AST>()
    val expr = NodeID<AST>()

    // Nemusíme sami vytvářet definici pro integer, ale stačí ji includovat.
    // integer() není nic jiného než knihovní funkce:
    //  fun integer(...) = lesana<Int> { ... }
    val int = include(integer())

    // Zadefinujeme pravidla gramatiky:
    //  - parametry uvnitř kulatých závorek určují přepisovací pravidlo (expr se skládá z expr, operátoru a čísla)
    //  - re("<regex>") vytváří terminální symbol
    //  - lambda na konci určuje, jak z dat symbolů na pravé straně vytvoříme data symbolu na levé straně
    expr to def(expr, re("""\+|-"""), int)   { (a: AST, op: String, b: Int) ->
        AST.Op(op, a, AST.Num(b))
    }
    expr to def(int) { (v) -> AST.Num(v) }

    top to def(expr) { (v) -> v }

    // Další konfigurace
    setTopNode(top)
    onUnexpectedToken { err -> println(err) /* ... */ }
}.getLesana()

Instalace

Knihovny

repositories {
    maven {
        url = "https://j-jzk.cz/dl/maven"
    }
}

dependencies {
    implementation("cz.j_jzk.klang:klang:1.0-rc3")
    implementation("cz.j_jzk.klang:klang-prales:1.0-rc3") // pokud chceme použít
}

Odkazy a další informace

Někdy v budoucnu bude vytvořen i podrobnější návod k použití.

K parsování se používá algoritmus LR(1).

klang vznikl v roce 2021 a získal 3. místo v krajském kole Středoškolské odborné činnosti. Nynější podoba je výsledkem mé maturitní práce o rok později; od té doby jej (postupně) vyvíjím.