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
klang: jádro projektuklang-prales(„praktické lexikálně-syntaktické definice“): podpůrná knihovna s předdefinovanými lesanami pro běžné konstrukce
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
- dokumentace k API - klang (poslední verze)
- dokumentace k API - klang-prales (poslední verze)
- GitHub
- ukázka kódu - JSON parser
- složitější projekt využívající klang
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.