gradle 构建如何处理 antlr3 和 antlr4 语法?

How can a gradle build handle both antlr3 and antlr4 grammars?

我有一个遗留项目,其中使用了 ANTLR3 和 ANTLR4 语法。我们想将 ant 构建系统更新为 gradle。有一个antlr plugin for gradle支持ANTLR2/3/4。但是,显然它一次只支持这三个中的一个(取决于添加的依赖项)。

在我们的项目中,antlr3 文件的后缀为 .g 而 antlr4 语法的后缀为 .g4.

是否有插件选项或替代插件允许我同时使用两个 ANTLR 版本的语法?

感谢任何提示。

plugins {
    id 'java-library'
    id 'antlr'
}

dependencies {
    // ...

    // If both are mentioned, then "X.g" is also treated as antlr4
    antlr "org.antlr:antlr:3.5.2" // use ANTLR version 3
    antlr "org.antlr:antlr4:4.5" // use ANTLR version 4
}

目前antlr插件不支持多版本。解决方法是使用 JavaExec 任务来调用 antlr3 或 antlr4。这是一种方法。

  1. 创建配置以使用 gradle 依赖管理来检索 antlr3 或 antlr4。
configurations{
  antlr3,
  antlr4
}

dependencies {
    antlr3 "org.antlr:antlr:3.5.2"
    antlr4 "org.antlr:antlr4:4.7.1" 

    compile "org.antlr:antlr-runtime:3.5.2"
    compile "org.antlr:antlr4-runtime:4.7.1" 
}

  1. 定义任务。
task runAntlr4(type:JavaExec) {
   //see incremental task api, prevents rerun if nothing has changed.
   inputs.dir "src/main/antlr4/"
   outputs.dir "$projectDir/build/generated/antlr/main/"

   classpath = configurations.antlr4

   main = "org.antlr.v4.Tool" 

   args = [ "-verbose", "-visitor", 
            "-o",  "$projectDir/build/generated/antlr/main/",  
            "-package", <my-package>,
            "src/main/antlr4/MyLanguage.g4"]
}

compileJava.dependsOn runAntlr4
  • antlr3configurations.antlr3 和 "org.antlr.Tool" 的模拟。
  • 将输出目录添加到sourceSets.main.java