Java 什么是ANTLR4(带有antlr插件)的最小示例Gradle项目?
“我已经创建了新的Gradle项目,”他补充道Java 什么是ANTLR4(带有antlr插件)的最小示例Gradle项目?,java,gradle,antlr,antlr4,Java,Gradle,Antlr,Antlr4,“我已经创建了新的Gradle项目,”他补充道 apply plugin: 'antlr' 及 到build.gradle 创建了包含以下内容的src/main/antlr/test.g4文件 grammar test; r : 'hello' ID; ID : [a-z]+ ; WS : [ \t\r\n]+ -> skip ; 但它不起作用。没有生成java源文件(并且没有发生错误) 我错过了什么 项目在这里: 更新 我发现我的示例实际上可以工作,但它将代码放入了\buil
apply plugin: 'antlr'
及
到build.gradle
创建了包含以下内容的src/main/antlr/test.g4文件
grammar test;
r : 'hello' ID;
ID : [a-z]+ ;
WS : [ \t\r\n]+ -> skip ;
但它不起作用。没有生成java源文件(并且没有发生错误)
我错过了什么
项目在这里:
更新
我发现我的示例实际上可以工作,但它将代码放入了\build\generated src
,这是我没有想到的:羞耻:一个片段包含在“snippets”文件夹下的Gradle“all”发行版中。您也可以简单地在GitHub上浏览代码段
马克·维埃拉(Mark Vieira)提到的格拉德尔(Gradle)样本只让我走了一半路。我发现我必须在ANTLR语法文件的头中指定包,以便在两个方向上都能看到所有内容(生成的代码能够访问手写代码,反之亦然)
在切换到Gradle之前,我一直在IntelliJ中使用ANTLR插件,它为我填充了软件包。切换到Gradle后,软件包消失了,这导致了问题
来源:我将在这里补充其他答案
问题1:生成的源文件放在build/Generated src
文件夹中
我找到了,但是那里的解决方案(设置outputDirectory
属性)是一个糟糕的想法。如果执行gradle clean build
命令,将清除整个源目录。那里的讨论很好地解释了为什么你不应该这样做
antlr生成的源被生成为
“build”文件夹的子目录与所有其他工件一样
在构建期间生成。此外,您生成的目录
projectRoot/build/generated src/antlr/main被添加到java
sourceset定义以确保其已被视为compileJava任务。
如果将antlr生成的源代码直接写入src/main/java
文件夹您正在用生成的输出污染源文件夹
过程在构建过程中污染源文件夹是一个重要问题
我想是反模式
但是,如果您想这样做,您可以添加一个gradle任务来将生成的文件复制到build目录
generateGrammarSource << {
println "Copying generated grammar lexer/parser files to main directory."
copy {
from "${buildDir}/generated-src/antlr/main"
into "src/main/java"
}
}
Gradle STS插件不会为antlr4生成源文件。它产生误导性输出,如下所示:
[sts] -----------------------------------------------------
[sts] Starting Gradle build for the following tasks:
[sts] generateGrammarSource
[sts] -----------------------------------------------------
:generateGrammarSource UP-TO-DATE
已卸载此旧插件并从命令行使用..它可以工作
将此添加到build.gradle中
generateGrammarSource {
outputDirectory = file("src/main/java/com/example/parser")
}
在你的“语法”后面加上这个
测试和使用
其他链接:
帮助我的是两件事:
- 添加标题:
@header{
包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期:
您可以在gradle.build中配置:
generateGrammarSource {
maxHeapSize = "64m"
arguments += ["-visitor",
"-long-messages",
"-package", "your.package.name"]
}
转到github.com并搜索“antlr gradle”。提供了多个示例。我不需要工作示例,我需要了解什么是必需的,什么不是。很高兴我发现了这个问题,也找不到生成的文件。感谢格罗森伯格,他是一个完全没有帮助的人。如果你把你的语法文件放在软件包里,它会自动完成。例如,如果您有src/main/antlr/com/mypackage/MyGrammar.g
,那么它将把生成的文件放在com.mypackage
中。我收回它。。。这会将输出文件放在正确的位置,但仍然不会将包行添加到生成的源中。头必须位于语法名称之后代码>和复制生成的源代码没有意义。构建
有什么问题?如果你真的想移动gen src,那么使用generateGrammarSource{outputDirectory=file(“src/gen/java/”)}
参见mawalker的答案。@Kip这样做会给我一个错误,即“在”build/generated src/…中找到重复的类”。。。“。我该怎么办?不要将生成的类复制到源目录中!Gradle能够在编译项目时包含生成的src目录。这样,类总是生成的,但也可用于编译。混合生成源和静态源会导致类路径上的重复,这是真正的答案。
generateGrammarSource {
outputDirectory = file("src/main/java/com/example/parser")
}
@header {
package com.example.parser;
}
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
}
generateGrammarSource {
maxHeapSize = "64m"
arguments += ["-visitor",
"-long-messages",
"-package", "your.package.name"]
}