ANTLR 插件扩展了 Java 插件,增加了使用 ANTLR 生成解析器的支持。

ANTLR 插件支持 ANTLR 版本 2、3 和 4。

用法

要使用 ANTLR 插件,请在构建脚本中包含以下内容

build.gradle.kts
plugins {
    antlr
}
build.gradle
plugins {
    id 'antlr'
}

任务

ANTLR 插件会向您的项目添加许多任务,如下所示。

generateGrammarSourceAntlrTask

生成所有生产 ANTLR 语法的源文件。

generateTestGrammarSourceAntlrTask

生成所有测试 ANTLR 语法的源文件。

generateSourceSetGrammarSourceAntlrTask

为给定的源集生成所有 ANTLR 语法的源文件。

ANTLR 插件会向 Java 插件添加的任务添加以下依赖项。

表 1. ANTLR 插件 - 附加任务依赖项
任务名称 依赖于

compileJava

generateGrammarSource

compileTestJava

generateTestGrammarSource

compileSourceSetJava

generateSourceSetGrammarSource

项目布局

src/main/antlr

生产 ANTLR 语法文件。如果 ANTLR 语法是按包组织的,antlr 文件夹中的结构应反映包结构。这确保生成的源文件最终位于正确的目标子文件夹中。

src/test/antlr

测试 ANTLR 语法文件。

src/sourceSet/antlr

给定源集的 ANTLR 语法文件。

依赖管理

ANTLR 插件添加了一个 antlr 依赖配置,它提供要使用的 ANTLR 实现。以下示例展示了如何使用 ANTLR 版本 3。

build.gradle.kts
repositories {
    mavenCentral()
}

dependencies {
    antlr("org.antlr:antlr:3.5.2")   // use ANTLR version 3
    // antlr("org.antlr:antlr4:4.5") // use ANTLR version 4
}
build.gradle
repositories {
    mavenCentral()
}

dependencies {
    antlr "org.antlr:antlr:3.5.2" // use ANTLR version 3
    // antlr "org.antlr:antlr4:4.5" // use ANTLR version 4
}

如果未声明依赖项,将使用 antlr:antlr:2.7.7 作为默认值。要使用不同的 ANTLR 版本,请像上面那样将相应的依赖项添加到 antlr 依赖配置中。

贡献的扩展

antlrAntlrSourceDirectorySet

此源集的 ANTLR 语法文件。包含 ANTLR 源目录中找到的所有 .g.g4 文件,并排除所有其他类型的文件。默认值为非空。

惯例属性(已废弃)

ANTLR 插件添加了一个惯例属性。

antlrSourceDirectorySet

此源集的 ANTLR 语法文件。包含 ANTLR 源目录中找到的所有 .g.g4 文件,并排除所有其他类型的文件。默认值为非空。

此惯例属性已废弃,并由上面描述的扩展取代。

源集属性

ANTLR 插件为项目中的每个源集添加以下属性。

antlr.srcDirsSet<File>

包含此源集的 ANTLR 语法文件的源目录。可以使用隐式转换为文件集合的任何内容进行设置。默认值为 [projectDir/src/name/antlr]

控制 ANTLR 生成器进程

ANTLR 工具在一个独立的进程中执行。这允许对 ANTLR 进程的内存设置进行细粒度控制。要设置 ANTLR 进程的堆大小,可以使用 AntlrTaskmaxHeapSize 属性。要传递额外的命令行参数,请附加到 AntlrTaskarguments 属性。

build.gradle.kts
tasks.generateGrammarSource {
    maxHeapSize = "64m"
    arguments = arguments + listOf("-visitor", "-long-messages")
}
build.gradle
generateGrammarSource {
    maxHeapSize = "64m"
    arguments += ["-visitor", "-long-messages"]
}