我正在尝试使用gradle编译我的antlr语法。我很擅长闲聊,因此无法解决如何解决问题。
我认为它正在尝试使用2.7 antlr进行编译(因为我看到其他一些人在使用错误的版本时报告类似的错误),因此抛出错误。
我怎么能:
这是我的语法:
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。
答案 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']
}