什么是ANTLR4的最小样本Gradle项目(使用antlr插件)?

时间:2016-04-07 07:33:03

标签: java gradle antlr antlr4

我创建了新的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 ; ,这是我没想到的:羞耻:

7 个答案:

答案 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后,包裹消失了,这导致了问题。

来源:https://stackoverflow.com/a/1655920/1877143

答案 5 :(得分:1)

对于问题2:

您可以在gradle.build中进行配置:

  generateGrammarSource {
        maxHeapSize = "64m"
        arguments += ["-visitor", 
                      "-long-messages", 
                      "-package", "your.package.name"]

}

答案 6 :(得分:0)

Gradle STS插件不会为antlr4生成源文件。它会产生误导性输出:

[sts] -----------------------------------------------------
[sts] Starting Gradle build for the following tasks: 
[sts]      generateGrammarSource
[sts] -----------------------------------------------------
:generateGrammarSource UP-TO-DATE

卸载了这个旧插件并在命令行中使用..它可以工作!

Gradle STS plugin doesn't generate source files for antlr4. Need to Use new plugin or command line