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

2022-09-03 04:02:19

我创建了新的Gradle项目,添加了

apply plugin: 'antlr'

dependencies {
    antlr "org.antlr:antlr4:4.5.3"

自。build.gradle

已创建包含以下内容的文件src/main/antlr/test.g4

grammar test;
r   : 'hello' ID;
ID  : [a-z]+ ;
WS  : [ \t\r\n]+ -> skip ;

但它不起作用。未生成 Java 源文件(且未发生任何错误)。

我错过了什么?

项目在这里: https://github.com/dims12/AntlrGradlePluginTest2

更新

我发现我的示例实际上是有效的,但它将我没想到的代码放入其中:shame:\build\generated-src


答案 1

我将在这里添加其他答案。

问题 1:生成的源文件放在文件夹中。build/generated-src

我发现了这个讨论,但那里的解决方案(设置属性)是一个主意。如果您执行命令,这将清除整个源目录。那里的讨论很好地解释了为什么你不应该outputDirectorygradle clean build

antlr生成的源代码像所有其他工件一样生成到“build”文件夹的子目录中,这些工件是在构建过程中生成的。此外,您生成的目录项目Root/build/generated-src/antlr/main被添加到java sourceset定义中,以确保其被认为是编译Java任务。如果你将 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;
}

答案 2

对我有帮助的是两件事:

  • 将 header:直接添加到声明之后的语法文件中。@header{ package com.example.something.antlrparser; }grammar test;
  • 将语法文件放在相应的文件夹中,即src/main/antlr/com/example/something/antlrparser/grammar.g4

现在,当我运行 gradle 任务时,文件会生成,并由 IntelliJ 自动拾取它们,并由 gradle 编译。generateGrammarSource.java/build/generated-src/antlr/main/com/example/something/antlrparser/*.java

该文件只是: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
}

推荐