我检查了antlr4 4.3版本的来源。
-package
参数仅由代码生成器模板使用,但不在实际工具源代码中的任何位置使用(请参阅genPackage
的Github搜索结果)。所以它不会影响输出文件的位置。
相反,每个输出文件的位置是根据相应输入文件的位置确定的(请参阅源中的here和here)。这符合 maven 插件文档中的解释:
如果您的语法打算成为名为 org.foo.bar 的包的一部分,那么您可以将其放置在目录 src/main/antlr4/org/foo/bar 中。然后,该插件将在输出目录 target/ generated-sources/antlr4/org/foo/bar 中生成 .java 和 .tokens 文件。编译 Java 文件时,它们将位于 Javac 编译器的正确位置,无需任何特殊配置。生成的java文件由插件自动提交编译。此外,使用 antlr4-maven-plugin 时,无需指定
-package
选项。由于插件从输入文件路径中派生出
-package
参数的值,并自动将其添加到 antlr 调用中(请参阅此处的源代码)。这可能也是为什么
-pacakge
不能直接用作 Maven 插件中的配置参数 的原因。 解决方案
本质上,您需要做的就是将语法文件放入
src/main/antlr4/wrb/grammar
中,从配置中删除
-package
参数,一切都会按预期工作。顺便说一句:代替写作
<arguments>
<argument>-visitor</argument>
</arguments>
你可以简单地写
<visitor>true</visitor>
因为
pom.xml
文件无关。ANTLR 尝试通过查看文件夹树来找出包名称,因此,如果您有一个名为
com
的文件夹,其中包含一个名为
example
的文件夹,其中又包含一个名为
hello_world
的文件夹,那么这将形成包
com.example.hello_world
它将在输出文件夹中生成完全相同的文件夹结构和包。因此,如果你的包名为
com.example.hello_world
,那么你的目录结构必须如下所示,假设你的语法文件位于
src/main/antlr4
:
hello_world (root project folder)
|
--src
|
-- main
|
-- antlr4 (up to here, these are "verbatim" folders)
|
-- com.example.hello_world (this is a package, to create it you can make a "source folder" in Eclipse)
|
-- YourGrammar.g4
|
-- target (autogenerated)
|
-- generated_sources
|
-- antlr4
|
-- com.example.hello_world
|
-- ...All ANTLR-generated files...