Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Antlr4 "Test Rig" and maven

Tags:

java

antlr4

I am struggling a little bit to figure out how I can use the antlr4 maven plug in to run the TestRig class?

I've read though the output of mvn antlr4:help -Ddetail=true, which is the only documentation I have been able to find, but this doesn't mention how to use the TestRig. So, what's the recommended way of using the test rig together with maven? using the grun alias method doesn't seem very elegant here.

UPDATED - Reasoning

Hello :)

Right, don't get me wrong but I really don't understand why you wouldn't want this functionality in the maven plugin? And I don't understand why its soul purpose should be to compile grammars?

Currently, if I maintain a build with Maven, and I use the antlr4-maven-plugin , it will install both the plugin and the antlr 4.1 in my maven repository. With this already there, why would I start adding things to my classpath and creating aliases when maven can take care of that? I mean, this is what maven is for really. If I had a antlr4:TestRig goal, then all I would do was use that. No need to manually maintain the class path, or create bash aliases. It would just work.

And be far far more elegant that hard-coding elements from my local maven repository in my class path, and maintaining bash aliases. Or alternatively, maintain two installations per. version of antlr I wish to use (one maintained by me, simply to use TestRig, and one maintained by maven for everything else).

Additionally, if I wanted to use a different version of antlr, then I wouldn't need to update the classpath and my aliases, maven would simply manage all this for me :)

like image 612
JustDanyul Avatar asked Sep 02 '13 11:09

JustDanyul


3 Answers

This is how I invoke TestRig with Maven:

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

So if you've got MyGrammar.g4 in src/main/antlr4/com/test/parser with a starting rule of startRule:

mvn exec:java -Dexec.mainClass="org.antlr.v4.runtime.misc.TestRig" 
-Dexec.args="com.test.parser.MyGrammar startRule 
-gui <INPUT_FILE>"
like image 172
jasterm007 Avatar answered Nov 20 '22 14:11

jasterm007


I had a similar question, in that I wanted to use the TestRig -gui option for debugging my grammar. I didn't find a way to run the GUI via the antlr4-maven-plugin, but I did manage to build a satisfactory CLASSPATH. The key was to include 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

Should produce a lovely GUI view of the syntax tree.

like image 30
Jared Beck Avatar answered Nov 20 '22 13:11

Jared Beck


Why would the Maven plugin run the TestRig class? The Maven plugin's job is converting the .g4 grammar files to .java source files in the proper package locations and ensuring those generated files get compiled. TestRig is not used for any part of that.

Edit: I have been using ANTLR for many years, in many applications. In all that time I have never updated my system classpath, nor operated ANTLR/gunit/TestRig from the command line or created aliases for it. Doing so is not helpful for automated testing and inevitably leads users into the problems you described. That said, the thought that TestRig needed special support in the Maven plugin also never crossed my mind, because better solutions already exist.

Some alternatives

  1. You can use the surefire plugin, and write a JUnit test that performs operations on your grammar directly (create a lexer/parser, parse some input, and perhaps even call inspect() on the resulting parse tree.
  2. You can use the surefire plugin, and write a JUnit test that explicitly calls TestRig.main(String[]) with the correct arguments.
  3. You can modify the ANTLR 4 Maven plugin to add a new goal for running TestRig, and submit a pull request to the project to have it included in a future release (you would need to make a very compelling case since there are already 2 alternatives that are more suited to long-term successful testing of a project using ANTLR 4).
like image 1
Sam Harwell Avatar answered Nov 20 '22 14:11

Sam Harwell