4

我正在尝试用 gradle 编译我的 antlr 语法。我对 gradle 很陌生,所以无法解决如何解决这个问题。

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

我怎样才能:

  1. 显示试图使用什么版本的 Antlr gradle?
  2. 让 gradle 正确编译?

这是我的语法:

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。

有一个拉取请求将 antlr3 支持添加这里讨论的 gradle 。

这是另一个包含手动支持 Antlr3 的版本。

4

3 回答 3

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
}
于 2012-05-17T13:33:57.170 回答
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/.

于 2012-05-16T21:40:44.603 回答
1

这是 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']
}
于 2013-01-16T09:59:16.053 回答