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"]
}