如果我打电话:
java org.antlr.Tool -o outdir sources/com/example/Java5.g
...使用 antlr-3.1.3,解析器和词法分析器代码将在目录中生成
outdir/sources/com/example
。但是生成的类没有任何 package
语句。我需要他们在包裹中生活com.example
.
有没有办法指定目标包?
ANTLR 提供了一个标头工具,允许您包含包和导入。您将其包含在 *.g 语法文件中:
@header {
package org.xmlcml.cml.converters.antlr;
import java.util.HashMap;
}
你可能在词法分析器中也需要它:
@lexer::header {package org.xmlcml.cml.converters.antlr;}
如果您需要添加一些成员和代码:
@members {
HashMap<String, Object> objectMap = new HashMap<String, Object>();
//...
private void addArrayValue(String content) {
//... code required by snippets in the grammar
}
}
它可能在最近的版本中发生了变化。
我正在为 Savantly 游戏服务开发 DSL,并且
我将语法文件放在子文件夹中。
生成的类在文件夹结构对应的包中。
我的插件配置是这样的-
<plugin>
<groupId>org.antlr</groupId>
<artifactId>antlr4-maven-plugin</artifactId>
<version>${antlr.version}</version>
<configuration>
<sourceDirectory>${basedir}</sourceDirectory>
<includes>
<include>**/*.g4</include>
</includes>
<visitor>true</visitor>
<listener>true</listener>
</configuration>
<executions>
<execution>
<goals>
<goal>antlr4</goal>
</goals>
</execution>
</executions>
</plugin>
以及由此产生的文件夹结构-
对于使用 Gradle 的 Antlr 插件的人来说,把它扔到你的
build.gradle.kts
,
tasks {
generateGrammarSource {
val pkg = "com.stackoverflow.antlr"
arguments = arguments + listOf("-package", pkg)
outputDirectory = outputDirectory.resolve(pkg.split(".").joinToString("/"))
}
}
outputDirectory
部分可能不需要,但无论出于何种原因,Antlr 不会将生成的文件放入包目录布局中,即使您给它一个包。我想知道这是否是一个错误,因为文档 提到了另一个选项,这听起来像是在尝试。不管怎样,这对我有用。
-Xexact-output-dir all output goes into -o dir regardless of paths/package
(此外,我在 Windows 上,
/
而不是 \\
似乎工作得很好。)