用gradle编译3.2antlr语法

用gradle编译3.2antlr语法,antlr,gradle,Antlr,Gradle,我正试图用gradle编译我的antlr语法。我对gradle很陌生,所以我很难解决这个问题 我认为它试图使用2.7 antlr进行编译(正如我看到其他一些人在使用错误版本时报告类似错误),因此抛出错误 我怎样才能: 显示Antlr gradle试图使用的版本 让gradle正确编译 这是我的语法: grammar Test; options { language = Java; } rule: ; 这是我的毕业剧本: apply plugin: 'java' apply plugin

我正试图用gradle编译我的antlr语法。我对gradle很陌生,所以我很难解决这个问题

我认为它试图使用2.7 antlr进行编译(正如我看到其他一些人在使用错误版本时报告类似错误),因此抛出错误

我怎样才能:

  • 显示Antlr gradle试图使用的版本
  • 让gradle正确编译
  • 这是我的语法:

    grammar Test;
    
    options {
      language = Java;
    }
    
    rule: ;
    
    这是我的毕业剧本:

    apply plugin: 'java'
    apply plugin: 'antlr'
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        antlr 'org.antlr:antlr:3.2'
        testCompile group: 'junit', name: 'junit', version: '4.+'
    }
    
    以下是尝试编译的输出:

    $ gradle compileJava
    :generateGrammarSource
    /home/admin/workspace/BuildTools/src/main/antlr/Test.g:1:1: unexpected token: grammar
    :compileJava UP-TO-DATE
    
    BUILD SUCCESSFUL
    
    Total time: 2.458 secs
    
    编辑:

    似乎Antlr3还没有在gradle中直接得到支持

    格拉德尔有一个很好的例子


    这是手动的。

    我对Gradle不是很了解,但是
    GenerateGramarSource
    使用ANTLR 2.7.x(不确定确切的版本),因为如果我在2.7语法上使用它,则会正确生成.java文件

    要使用ANTLR 3和Gradle,您始终可以执行以下操作:

    task generateWithANTLR3(type:Exec) { 
      commandLine = ['java', '-cp', 'antlr-3.2.jar', 'org.antlr.Tool', 'T.g']  
    }
    
    (假设ANTLR jar和语法文件与Gradle构建文件位于同一目录中)

    编辑

    您还可以让
    工具
    在特定目录中输出生成的源文件。以下任务:

    task generateWithANTLR3(type:Exec) { 
      commandLine = ['java', '-cp', 'antlr-3.2.jar', 'org.antlr.Tool', '-o', 'src/x/y/generated/', 'T.g']  
    } 
    

    将生成的文件放在
    src/x/y/generated/
    中。为了完整起见,我为我的项目提供了以下gradle构建文件,该文件从中获取了版本并添加了一些注释

    我唯一需要更改的是不要使用动态属性来删除警告

    apply plugin: 'java'
    
    project.ext.grammarpackage = "eclipse"
    
    repositories {
        mavenCentral()
    }
    
    configurations {
        antlr3
    }
    
    dependencies {
        compile 'org.antlr:antlr-runtime:3.2'
        antlr3 'org.antlr:antlr:3.2'
        testCompile group: 'junit', name: 'junit', version: '4.+'
    }
    
    task antlrOutputDir << {
        mkdir(generateGrammarSource.destinationDir)
    }
    
    task generateGrammarSource(dependsOn: antlrOutputDir, type: JavaExec) {
        description = 'Generates Java sources from Antlr3 grammars.'
    
        destinationDir = "$buildDir/generated-sources/antlr"
        def antlrSource = 'src/main/antlr'
    
        inputs.dir file(antlrSource)
        outputs.dir file(destinationDir)
    
        def grammars = fileTree(antlrSource).include('**/*.g')
    
        main = 'org.antlr.Tool'
        classpath = configurations.antlr3
        args = ["-o", "${destinationDir}/${project.ext.grammarpackage}", grammars.files].flatten()
    }
    
    compileJava {
        dependsOn generateGrammarSource
        source generateGrammarSource.destinationDir
    }
    
    apply插件:“java”
    project.ext.grammarpackage=“eclipse”
    存储库{
    mavenCentral()
    }
    配置{
    antlr3
    }
    依赖关系{
    编译“org.antlr:antlr运行时:3.2”
    antlr3'org.antlr:antlr:3.2'
    testCompile组:'junit',名称:'junit',版本:'4.+'
    }
    
    task antlrOutputDir这是Mark Fisher和Bart Kiers响应的组合,它从依赖项获取antlr jar并放入类路径。这对我很有用:

    configurations {
        antlr3
    }
    
    dependencies {
        antlr3 'org.antlr:antlr:3.4'
    }
    
    
    task generateWithANTLR3(type:Exec) { 
      commandLine = ['java', '-cp',  configurations.antlr3.getAsPath(), 'org.antlr.Tool', '-o', 'target/generated-sources/antlr3/t3', 'src/main/antlr3/t2/Exp.g']
    }
    

    感谢巴特(本周3人回答我的问题)。我将对此进行进一步探讨,目前它正在eclipse中编译,但我已经围绕gradle默认值设计了这个项目,以尝试“利用gradle的强大功能”。很高兴知道我可以退回到像这样的显式Antlr3任务。没问题@MarkFisher。也可以看看我的编辑。看来这是目前唯一的方法。有一个是,但还没有被拉进主梯度。我正在构建gradle,我将亲自尝试这个插件,如果它看起来不错的话,可能会发出一些噪音。