Java 什么是ANTLR4(带有antlr插件)的最小示例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

“我已经创建了新的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源文件(并且没有发生错误)

我错过了什么

项目在这里:

更新


我发现我的示例实际上可以工作,但它将代码放入了
\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"]

}