我有一个复杂的语法,有多个预处理器。每个预处理器都在自己的包中。每个人都生成一个令牌文件。当我使用makefile来cd包到目录并在语法上调用antlr时,它会在当前工作目录中创建tokens文件,然后继续并处理语法一切都很好。
当我使用gradle antlr4插件时,令牌文件被放入generated-src / ... packagedir ...所有好但是antlr然后找不到生成的令牌文件。我尝试使用-lib参数,但只指向一个目录。
这是我的项目结构
的src / ..包../ preproc1
的src / ..包../ preproc2
当我在g4文件上运行antlr时,我得到了 建立/生成-SRC / ANTLR /主/ ..包../ preproc1 / preproc1.tokens
但是antlr进程工作目录仍然存在 src / .. package ../ preproc2,所以antlr找不到这个生成的tokens文件。
我试着告诉antlr插件在src目录中生成输出文件,就像makefile一样。不是我选择这样做的方式,而只是想继续前进。不幸的是,antlr插件使用GFileUtils.cleanDirectory(outputDirectory)在outputdirectory上执行删除操作。在执行任务中。我可以改变这一点,如果outputDirectory与源目录相同,则不执行删除,这可能是我猜的,尽管干净将无法正常工作。
我已经使用makefile进行构建以获取令牌文件,然后将这些令牌文件复制到单个目录并将-lib指向该目录。
有没有人有更好的解决方案?
答案 0 :(得分:0)
我使用Maven而不是Gradle。这是否是一个更好的"解决方案我不能说, 但是ANTLR 4 API Page目前支持Maven优于Gradle,因为我没有看到Gradle插件链接。话虽如此,我希望这两者兼容,以便ANTLR构建目录匹配。
ANTLR说明
当我按照ANTLR 4 Maven plugin指令的建议按照ANTLR源布局时,它对我来说非常有用。
默认情况下,ANTLR 4 Maven插件指令将构建项目文件夹中包含的.g4文件:
<project>/src/main/antlr4/
而您将复制任何共享的.g4文件,这些文件将用作导入到特定导入子目录中的文件:
<project>/src/main/antlr4/imports/
我的pom.xml文件
我的pom.xml文件的<plugin\>
部分设置了以下ANTLR插件配置<project><build><plugins\>
文本。
<plugin>
<groupId>org.antlr</groupId>
<artifactId>antlr4-maven-plugin</artifactId>
<version>4.5.3</version>
<executions>
<execution>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<arguments>
<argument>-visitor</argument>
</arguments>
<libDirectory>src/main/antlr4/imports</libDirectory>
</configuration>
<id>antlr</id>
<goals>
<goal>antlr4</goal>
</goals>
</execution>
</executions>
</plugin>
我发现我需要明确<libDirectory\>
条目,即使我认为这是默认设置。
我的项目结构
我在ComojoProj
项目中使用了三种语法:Countables
,Dater
和Sched
。 Sched
导入另外两个。
每个语法文件都位于src/main/antlr/
之外的单独子文件夹中,或多或少与相关java实现的包对齐:
--- /ComojoProj/
--- pom.xml
--- .project
--- ./src/main/antlr/
--- ./com/wapitia/common/Countables.g4
--- ./com/wapitia/dates/Dater.g4
--- ./com/wapitia/sched/Sched.g4
--- ./src/main/antlr/imports/
--- Countables.g4
--- Dater.g4
--- ./src/main/java/
--- ./com/wapitia/
--- ./common/parse/antlr/CountablesProducer.java
--- ./dates/parse/antlr/DaterProducer.java
--- ./dates/parse/nodes/
--- DayOfWeekNode.java ...
--- ./sched/parse/antlr/SchedProducer.java
--- ./sched/parse/nodes/
--- MonthlyNode.java, EndDateNode.java, ...
Sched.g4语法文件的开头如下:
grammar Sched;
import Countables, Dater;
schedule : dailySched | weeklySched ...
在Sched.g4版本中找到两个Countables.g4,Dater.g4语法文件,因为我们将它们复制到/src/main/antlr/imports/
目录中。
当ANTLR插件运行时,它会生成以下代码
--- /ComojoProj/target/generated-sources/java/
--- com.wapitia.common/
--- CountablesBaseListener.java
--- CountablesBaseVisitor.java
...
--- com.wapitia.dates/ ...
--- com.wapitia.sched/ ...
--- Countables.tokens
--- CountablesLexer.tokens
...
--- SchedLexer.tokens
所以.tokens
文件会生成到&#34; top&#34;包的一些java
源目录,然后在生成的jar文件的顶部结束。
我希望这有帮助!