6

我正在努力弄清楚如何使用 antlr4 maven 插件来运行 TestRig 类?

我已经阅读了 的输出mvn antlr4:help -Ddetail=true,这是我能够找到的唯一文档,但这并没有提到如何使用 TestRig。那么,将 test rig 与 maven 一起使用的推荐方式是什么?在这里使用 grun 别名方法似乎不是很优雅。

更新 - 推理

你好 :)

对,不要误会我的意思,但我真的不明白你为什么不希望在 maven 插件中有这个功能?而且我不明白为什么它的灵魂目的应该是编译语法?

目前,如果我使用 Maven 维护构建并使用antlr4-maven-plugin,它将在我的 maven 存储库中安装插件和 antlr 4.1。既然已经有了这个,为什么我要开始在我的类路径中添加东西并在 maven 可以处理的情况下创建别名呢?我的意思是,这就是 maven 的真正用途。如果我有一个antlr4:TestRig目标,那么我所做的就是使用它。无需手动维护类路径,或创建 bash 别名。它会起作用的。

并且比在我的类路径中硬编码本地 maven 存储库中的元素并维护 bash 别名要优雅得多。或者,每个维护两个安装。我希望使用的 antlr 版本(一个由我维护,只是为了使用 TestRig,另一个由 maven 维护用于其他所有内容)。

此外,如果我想使用不同版本的 antlr,那么我不需要更新类路径和我的别名,maven 会简单地为我管理所有这些:)

4

4 回答 4

5

这就是我使用 Maven 调用 TestRig 的方式:

mvn exec:java -Dexec.mainClass="org.antlr.v4.runtime.misc.TestRig" 
-Dexec.args="<DOT_NOTATION_GRAMMAR_CLASSPATH> <START_RULE> 
-gui <INPUT_FILE>"

因此,如果您在 src/main/antlr4/com/test/parser 中有 MyGrammar.g4,其起始规则为 startRule:

mvn exec:java -Dexec.mainClass="org.antlr.v4.runtime.misc.TestRig" 
-Dexec.args="com.test.parser.MyGrammar startRule 
-gui <INPUT_FILE>"
于 2014-12-21T23:21:50.567 回答
2

我有一个类似的问题,因为我想使用该TestRig -gui选项来调试我的语法。我没有找到通过 运行 GUI 的方法antlr4-maven-plugin,但我确实设法构建了一个令人满意的 CLASSPATH。关键是要包括target/classes.

# Assuming your project is in $PROJECT ..
CLASSPATH=".:/usr/local/lib/antlr-4.1-complete.jar:$PROJECT/target/classes"
alias grun='java org.antlr.v4.runtime.misc.TestRig'
mvn -q compile
grun MyGrammer startingRule -gui < test_input

应该产生一个可爱的语法树 GUI 视图。

于 2013-11-06T18:44:00.450 回答
1

为什么 Maven 插件会运行TestRig该类?Maven 插件的工作是将.g4语法文件转换.java为适当包位置的源文件,并确保这些生成的文件被编译。TestRig不用于其中的任何部分。

编辑:我多年来一直在许多应用程序中使用 ANTLR。在那段时间里,我从未更新我的系统类路径,也从未从命令行操作 ANTLR/gunit/TestRig 或为其创建别名。这样做对自动化测试没有帮助,并且不可避免地会导致用户遇到您描述的问题。也就是说,TestRig 需要在 Maven 插件中获得特殊支持的想法也从未出现在我的脑海中,因为已经存在更好的解决方案。

一些替代品

  1. 您可以使用 surefire 插件,并编写一个直接对您的语法执行操作的 JUnit 测试(创建一个词法分析器/解析器,解析一些输入,甚至可能调用inspect()生成的解析树。
  2. TestRig.main(String[])您可以使用 surefire 插件,并编写一个使用正确参数显式调用的 JUnit 测试。
  3. 您可以修改 ANTLR 4 Maven 插件以添加运行 TestRig 的新目标,并向项目提交拉取请求以将其包含在未来版本中(您需要提出一个非常有说服力的案例,因为已经有 2 个替代方案更适合使用 ANTLR 4) 对项目进行长期成功测试。
于 2013-09-02T21:56:10.733 回答
0

我喜欢使用 Maven 运行 TestRig 的想法。但我不喜欢将依赖项添加org.antlr:antlr4到我的代码中(因为我已经有了org.antlr:antlr4-runtime)所以我的解决方案是为 exec 插件配置一个额外的依赖项。

<properties>
    <antlr.version>4.7.1</antlr.version>
</properties>           
...
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>3.0.0</version>
    <executions>
        <execution>
            <id>TestRigGui</id>
            <phase>none</phase>
            <goals>
                <goal>java</goal>
            </goals>
            <configuration>
                <mainClass>org.antlr.v4.gui.TestRig</mainClass>
                <arguments>                             
                    <!-- Grammar -->
                    <argument>de.humanfork.experiment.antlr.Hello</argument>
                    <!-- start rule -->
                    <argument>hello_rule</argument>
                    <!-- enable gui -->
                    <argument>-gui</argument>
                    <!-- input file -->
                    <argument>example.txt</argument>
                </arguments>                
                <includePluginDependencies>true</includePluginDependencies>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.antlr</groupId>
            <artifactId>antlr4</artifactId>
            <version>${antlr.version}</version>
        </dependency>
    </dependencies>
</plugin>

然后使用:mvn exec:java@TestRigGui启动GUI

顺便说一句:在 ANTLR 4.7.1 中,TestRig 主类是:org.antlr.v4.gui.TestRig

于 2022-01-27T17:37:09.550 回答