Antlr4“测试装备”和maven

时间:2013-09-02 11:27:25

标签: java antlr4

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

我已阅读mvn antlr4:help -Ddetail=true的输出,这是我能找到的唯一文档,但这并未提及如何使用TestRig。那么,将测试装置与maven一起使用的推荐方法是什么?使用grun别名方法在这里似乎并不优雅。

更新 - 推理

您好:)

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

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

在我的类路径中使用来自本地maven存储库的硬编码元素并保持bash别名远远优雅。或者,每个维护两个安装。我希望使用的antlr版本(一个由我维护,只需使用TestRig,另一个由maven维护)。

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

3 个答案:

答案 0 :(得分:2)

我有一个类似的问题,因为我想使用TestRig -gui选项来调试我的语法。我没有找到通过antlr4-maven-plugin运行GUI的方法,但我确实设法建立了一个令人满意的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视图。

这可能不是您正在寻找的答案,但我希望它可以帮助其他人。 (例如,我,明天,当我忘记)

答案 1 :(得分:2)

这就是我用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中有一个启动规则为startRule的MyGrammar.g4:

mvn exec:java -Dexec.mainClass="org.antlr.v4.runtime.misc.TestRig" 
-Dexec.args="com.test.parser.MyGrammar startRule 
-gui <INPUT_FILE>"

答案 2 :(得分:1)

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

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

一些替代方案

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