maven - 使用 maven antlr4 插件从其他 Artifact 生成语法

标签 maven antlr4

我想使用 antlr4 为语法生成一个 java parser api。我意识到其他人可能对语法部分感兴趣,所以我想将 maven 中的解析器 Artifact 与语法 Artifact 分开。

我几乎已经完成了所有工作,问题似乎是它使用正确的包生成 *.java 文件,但将它们放在代表不同包的目录中。

我有一个带有父模块和两个模块的多模块 Maven 项目;语法和解析器。语法生成一个包含以下内容的简单 jar:

META-INF/
META-INF/MANIFEST.MF
org/
org/boazglean/
org/boazglean/dabar/
org/boazglean/dabar/grammer/
org/boazglean/dabar/grammer/DabarLexer.g4
org/boazglean/dabar/grammer/DabarParser.g4
META-INF/maven/
META-INF/maven/org.boazglean.dabar/
META-INF/maven/org.boazglean.dabar/grammer/
META-INF/maven/org.boazglean.dabar/grammer/pom.xml
META-INF/maven/org.boazglean.dabar/grammer/pom.properties

现在我想生成一个解析器 jar,包中有一堆解析器类 org.boazglean.dabar.parser .这是我使用的 pom 配置:
<plugin>
    <groupId>org.antlr</groupId>
    <artifactId>antlr4-maven-plugin</artifactId>
    <version>4.0</version>
    <executions>
        <execution>
            <goals>
                <goal>antlr4</goal>
            </goals>
            <configuration>
                <sourceDirectory>${antlr.dir}</sourceDirectory>
                <listener>true</listener>
                <visitor>true</visitor>
                <arguments>
                    <argument>-package</argument>
                    <argument>org.boazglean.dabar.parser</argument>
                </arguments>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>extract-grammer</id>
            <phase>initialize</phase>
            <goals>
                <goal>unpack-dependencies</goal>
            </goals>
            <configuration>
                <includeArtifactIds>grammer</includeArtifactIds>
                <outputDirectory>${antlr.dir}</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

现在的问题是生成的源代码出现在错误的目录中(但它们确实有正确的包)。
head -n 2 parser/target/generated-sources/antlr4/org/boazglean/dabar/grammer/DabarLexer.java 

// Generated from org/boazglean/dabar/grammer/DabarLexer.g4 by ANTLR 4.0
package org.boazglean.dabar.parser;

我是否遗漏了一些我应该用来配置 antlr4 的命令?

最佳答案

  • 制作语法文件夹结构
    /src/main/antlr4/org/nimy/antlr4/xml/xxxx.g4
  • 在 pom.xml

  • <plugin>
        <groupId>org.antlr</groupId>
        <artifactId>antlr4-maven-plugin</artifactId>
        <version>4.1</version>
        <configuration>
            <listener>true</listener>
            <visitor>true</visitor>
            <arguments>
                <argument>-package</argument>
            </arguments>
        </configuration>
        <executions>
            <execution>
                <id>antlr-generate</id>
                <phase>generate-sources</phase>
                <goals>
                    <goal>antlr4</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    
  • 包中生成Java代码:
    包 org.nimy.antlr4.xml

  • github上的antlt4 maven插件源代码。尝试阅读它并获得配置项目的方法。 antlr4 source code

    关于maven - 使用 maven antlr4 插件从其他 Artifact 生成语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16683135/

    相关文章:

    java - Application.properties 没有被拾取,其值是静态的

    java - 如何在 Maven 项目中使用 JFrog Artifact 存储库

    java - maven 非标准版本控制导致意外的最新版本结果

    java - maven-compiler-plugin 在 linux 上坏了?

    rest - 将 JAX-RS 应用程序部署到 Tomcat 时出现 IncompatibleClassChangeError

    ANTLR 使特定标记或规则不区分大小写

    java - ANTLR "no viable alternative at input"解析 SAS 代码时出错 If Then Else

    parsing - 如何匹配ANTLR解析器(不是lexer)中的任何符号?

    go - ANTLR4内存使用情况

    antlr4 - 组合语法中无法识别 ANDL 4 Lexer 规则