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

在我们的项目中,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。这是一种方法。

  • 创建配置,以使用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"
    }
    
    
  • 定义任务。
  • 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
    
  • antlr3和“org.antlr.Tool”一起使用的configurations.antlr3模拟。
  • 将输出目录添加到sourceSets.main.java
  • 10-06 02:39