用gradle编译3.2 Antlr语法

时间:2012-05-16 09:45:11

标签: antlr gradle

我正在尝试使用gradle编译我的antlr语法。我很擅长闲聊,因此无法解决如何解决问题。

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

我怎么能:

  1. 显示哪个版本的Antlr gradle正在尝试使用?
  2. 让gradle正确编译?
  3. 这是我的语法:

    grammar Test;
    
    options {
      language = Java;
    }
    
    rule: ;
    

    这是我的gradle脚本:

    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
    

    修改

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

    有一个pull request to add antlr3 support来评估discussed here

    这里是another version of including support for Antlr3手动。

3 个答案:

答案 0 :(得分:5)

为了完整起见,我为我的项目提出了以下gradle构建文件,该文件采用tapestryjava blogspot中的版本并添加了一些注释。

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

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
}

答案 1 :(得分:4)

我自己对Gradle不是很了解,但generateGrammarSource使用的是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构建文件位于同一目录中)

修改

您还可以让Tool将生成的源文件输出到特定目录中。以下任务:

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/

答案 2 :(得分:1)

这是Mark Fisher和Bart Kiers响应的混合,它从依赖项获取antlr jar并放入classpath。它对我有用:

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