LoginSignup
0
0

More than 3 years have passed since last update.

ANTLRをKotlinで使うための環境構築

Last updated at Posted at 2020-09-29

はじめに

最近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から乗り換えてみては

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0