はじめに
最近ANTLRを使う機会があったのでKotlinのプロジェクトへの導入方法を簡単に書いておきます。
環境構築と言っていますが、KotlinとGradleの環境があれば用意するものはないです。
Gradle
GradleがANTLRをサポートしているのでGradleを使うのが楽だと思います。
今回の記事ではGradle公式ページに載っているものに少し足すだけで足ります。
build.gradle.kts
plugins {
kotlin("jvm") version "1.4.10"
application
antlr
}
repositories {
mavenCentral()
}
dependencies {
implementation(kotlin("stdlib"))
antlr("org.antlr:antlr4:4.7.2")
}
application {
mainClassName = "MainKt"
}
tasks.generateGrammarSource {
maxHeapSize = "64m"
arguments = arguments + listOf("-visitor", "-long-messages")
}
文法定義ファイル
まず、src/mainの下にantlrディレクトリを作ります。このディレクトリの下に.g4ファイルを置きます。今回はsrc/main/antlr/Hello.g4を用意します。
Hello.g4
grammar Hello;
r : 'hello' ID ; // match keyword hello followed by an identifier
ID : [a-z]+ ; // match lower-case identifiers
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
このファイルを作成したら、コンソールで以下のコマンドを打ってください。
$ ./gradlew generateGrammarSource
これをすると、buildディレクトリの中に構文解析用のjavaファイルが生成されてるはずです。
Kotlin
先ほど生成されたファイルを使用してみましょう。
src/main/kotlin/Main.ktを用意します。
Main.kt
import org.antlr.v4.runtime.CharStreams
import org.antlr.v4.runtime.CommonTokenStream
fun main() {
val text = CharStreams.fromString("hello world")
val lexer = HelloLexer(text)
val tokenStream = CommonTokenStream(lexer)
val parser = HelloParser(tokenStream)
println(parser.r().children)
}
これを実行してみましょう。
$ ./gradlew run
実行して[hello, world]
と出力されていたら成功です。
おわり
Gradleに慣れていると結構簡単にできちゃいます。
これを機にMavenから乗り換えてみては