用gradle编译3.2antlr语法
我正试图用gradle编译我的antlr语法。我对gradle很陌生,所以我很难解决这个问题 我认为它试图使用2.7 antlr进行编译(正如我看到其他一些人在使用错误版本时报告类似错误),因此抛出错误 我怎样才能:用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
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,我将亲自尝试这个插件,如果它看起来不错的话,可能会发出一些噪音。