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

gradle构建如何处理antlr3和antlr4语法?,gradle,build.gradle,antlr4,antlr3,Gradle,Build.gradle,Antlr4,Antlr3,我有一个遗留项目,其中使用了ANTLR3和ANTLR4语法。我们想将ant构建系统更新为gradle。有一个支持ANTLR2/3/4的。但是,很明显,它一次只支持三个依赖项中的一个(取决于添加的依赖项) 在我们的项目中,antlr3文件具有后缀.g,而antlr4语法具有后缀.g4 这个插件有没有一个选项或者一个替代插件可以让我同时使用两个ANTLR版本的语法 谢谢你的提示 plugins { id 'java-library' id 'antlr' } dependencie

我有一个遗留项目,其中使用了ANTLR3和ANTLR4语法。我们想将
ant
构建系统更新为
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
tasks调用antlr3或antlr4。这里有一个方法

  • 创建使用渐变依赖关系管理检索antlr3或antlr4的配置
  • 定义任务
  • task runAntlr4(类型:JavaExec){
    //请参阅增量任务api,防止在没有任何更改的情况下重新运行。
    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/”,
    “-包”,
    “src/main/antlr4/MyLanguage.g4”]
    }
    compileJava.dependsOn runAntlr4
    
    • 使用
      configurations.antlr3
      和“org.antlr.Tool”模拟
      antl3
    • 将输出目录添加到
      sourceset.main.java

    在万不得已的情况下,您始终可以。我使用Maven,但实际上是通过Ant插件构建ANTLR3,因为并非所有需要的配置都可以通过ANTLR Maven插件访问。不幸的是,这在较新的gradle版本中不再有效,因为main现在是最终版本,无法再被覆盖。有人能解决这个问题吗?对我来说,这仍然适用于较新的Gradle版本。此外,文档还覆盖了main属性,请参阅我们将其包装在插件中。那是行不通的。现在它起作用了。有一件事,inputs.dir现在是一个方法,例如现在必须是inputs.dir(…)
    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