如何处理多个令牌文件?

时间:2017-11-05 15:17:35

标签: antlr4 gradle-plugin

我有一个复杂的语法,有多个预处理器。每个预处理器都在自己的包中。每个人都生成一个令牌文件。当我使用makefile来cd包到目录并在语法上调用antlr时,它会在当前工作目录中创建tokens文件,然后继续并处理语法一切都很好。

当我使用gradle antlr4插件时,令牌文件被放入generated-src / ... packagedir ...所有好但是antlr然后找不到生成的令牌文件。我尝试使用-lib参数,但只指向一个目录。

这是我的项目结构

  • 的src / ..包../ preproc1

    • preproc1.g4
    • preproc1Tokens.g4
  • 的src / ..包../ preproc2

    • preproc2.g4
    • preproc2Tokens.g4

当我在g4文件上运行antlr时,我得到了 建立/生成-SRC / ANTLR /主/ ..包../ preproc1 / preproc1.tokens

但是antlr进程工作目录仍然存在 src / .. package ../ preproc2,所以antlr找不到这个生成的tokens文件。

我试着告诉antlr插件在src目录中生成输出文件,就像makefile一样。不是我选择这样做的方式,而只是想继续前进。不幸的是,antlr插件使用GFileUtils.cleanDirectory(outputDirectory)在outputdirectory上执行删除操作。在执行任务中。我可以改变这一点,如果outputDirectory与源目录相同,则不执行删除,这可能是我猜的,尽管干净将无法正常工作。

我已经使用makefile进行构建以获取令牌文件,然后将这些令牌文件复制到单个目录并将-lib指向该目录。

有没有人有更好的解决方案?

1 个答案:

答案 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项目中使用了三种语法:CountablesDaterSchedSched导入另外两个。 每个语法文件都位于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文件的顶部结束。

我希望这有帮助!