我创建了新的Gradle项目,添加了
app/code/
和
apply plugin: 'antlr'
到dependencies {
antlr "org.antlr:antlr4:4.5.3"
。
使用以下内容创建build.gradle
文件
src/main/antlr/test.g4
但它不起作用。没有生成java源文件(并且没有发生错误)。
我错过了什么?
项目在这里:https://github.com/dims12/AntlrGradlePluginTest2
更新
我发现我的示例实际上是有效的,但它将代码放入grammar test;
r : 'hello' ID;
ID : [a-z]+ ;
WS : [ \t\r\n]+ -> skip ;
,这是我没想到的:羞耻:
答案 0 :(得分:10)
我将在这里添加其他答案。
问题1 :生成的源文件放在build/generated-src
文件夹中。
我找到this discussion,但那里的解决方案(设置outputDirectory
属性)是错误的想法。如果执行gradle clean build
命令,则会清除整个源目录。那里的讨论给出了一个很好的解释,为什么你不应该
将antlr生成的源生成为a “build”文件夹的子目录,就像所有其他工件一样 在构建期间生成。此外,您生成的目录 projectRoot / build / generated-src / antlr / main被添加到java中 sourceset定义,以确保其被认为是compileJava任务。 如果将antlr生成的源代码直接写入src / main / java 您使用构建输出污染源文件夹的文件夹 处理。 ...在构建期间污染源文件夹是一个 我认为反模式。
但是,如果要执行此操作,可以添加gradle任务以将生成的文件复制到构建目录。
generateGrammarSource << {
println "Copying generated grammar lexer/parser files to main directory."
copy {
from "${buildDir}/generated-src/antlr/main"
into "src/main/java"
}
}
第2期:生成的源文件没有设置包属性。
要解决此问题,请在语法文件顶部附近添加以下内容:
@header {
package com.example.my.package;
}
答案 1 :(得分:4)
帮助我的是两件事:
@header{
package com.example.something.antlrparser;
}
添加到语法文件的顶部。src/main/antlr/com/example/something/antlrparser/grammar.g4
现在,当我运行generateGrammarSource
gradle任务时,.java
会生成/build/generated-src/antlr/main/com/example/something/antlrparser/*.java
个文件,这些文件会被IntelliJ自动选中,也可以通过gradle编译。
build.gradle
文件只是:
group 'com.example.something'
version '1.0-SNAPSHOT'
apply plugin: 'java'
apply plugin: 'antlr'
apply plugin: 'idea'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
antlr "org.antlr:antlr4:4.5" // use ANTLR version 4
}
答案 2 :(得分:3)
将此添加到build.gradle
generateGrammarSource {
outputDirectory = file("src/main/java/com/example/parser")
}
在你的“语法”之后将它添加到你的语法中;
@header {
package com.example.parser;
}
经过测试并使用Java8 grammar from antlr example grammars
其他链接:
Here is a short guide of the Antlr plugin from docs.gradle.org
答案 3 :(得分:2)
示例包含在Gradle&#34; all&#34;根据&#34;样本分发&#34;夹。您也可以在GitHub上浏览示例。
https://github.com/gradle/gradle/tree/master/subprojects/docs/src/samples/antlr
答案 4 :(得分:1)
@Mark Vieira注意到的Gradle样本只让我到了那里。我发现我必须在我的ANTLR语法文件的标题中指定包,以便在两个方向上看到所有内容(生成的代码能够访问手写代码,反之亦然)。
grammar MyGrammar;
@header {
package com.mypackage;
}
在切换到Gradle之前,我一直在使用IntelliJ中的ANTLR插件,它为我填写了包。切换到Gradle后,包裹消失了,这导致了问题。
答案 5 :(得分:1)
对于问题2:
您可以在gradle.build中进行配置:
generateGrammarSource {
maxHeapSize = "64m"
arguments += ["-visitor",
"-long-messages",
"-package", "your.package.name"]
}
答案 6 :(得分:0)