2013-09-02 10 views
5

Ich habe ein wenig zu kämpfen, um herauszufinden, wie ich den antlr4 maven-Plug verwenden kann, um die TestRig-Klasse zu starten?Antlr4 "Test Rig" und maven

Ich habe gelesen, obwohl die Ausgabe von mvn antlr4:help -Ddetail=true, die die einzige Dokumentation ist, die ich gefunden habe, aber dies nicht erwähnt, wie Sie das TestRig verwenden. Also, was ist die empfohlene Art, den Prüfstand zusammen mit maven zu benutzen? Die Verwendung der Grun-Alias-Methode erscheint hier nicht sehr elegant.

AKTUALISIERT - Reasoning

Hallo :)

Rechts, versteh mich nicht falsch, aber ich wirklich nicht verstehen, warum Sie diese Funktionalität nicht in der Maven Plugin wollen würde? Und ich verstehe nicht, warum es Sinn der Seele sein sollte, Grammatiken zu kompilieren?

Derzeit, wenn ich einen Build mit Maven verwalte, und ich benutze antlr4-maven-plugin, wird es sowohl das Plugin als auch die AntiRr 4.1 in meinem Maven Repository installieren. Mit diesem bereits dort, warum sollte ich beginnen, Dinge zu meinem Klassenpfad hinzuzufügen und Aliase zu erstellen, wenn Maven sich darum kümmern kann? Ich meine, dafür ist Maven wirklich. Wenn ich ein antlr4:TestRig Ziel hätte, dann würde ich nur das verwenden. Sie müssen den Klassenpfad nicht manuell pflegen oder Bash-Aliase erstellen. Es würde einfach funktionieren.

Und weit weit eleganter sein, dass hard-coding Elemente aus meinem lokalen Maven-Repository in meinem Klassenpfad und Aufrechterhaltung Bash Aliase. Oder alternativ, zwei Installationen pro warten. Version von antlr möchte ich verwenden (eine, die von mir gepflegt wird, einfach um TestRig zu verwenden, und eine, die von maven für alles andere gepflegt wird).

Außerdem, wenn ich eine andere Version von antlr verwenden wollte, dann würde ich nicht die Classpath und meine Aliase aktualisieren müssen, Maven würde einfach alles für mich verwalten :)

Antwort

1

Warum sollte das Maven Plugin Führen Sie die TestRig Klasse? Der Job des Maven Plugins wandelt die .g4 Grammatikdateien in .java Quelldateien in den richtigen Paketpositionen um und stellt sicher, dass diese generierten Dateien kompiliert werden. TestRig wird für keinen Teil davon verwendet.

Bearbeiten: Ich habe ANTLR seit vielen Jahren in vielen Anwendungen verwendet. In dieser Zeit habe ich weder meinen System Classpath aktualisiert, noch ANTLR/gunit/TestRig von der Kommandozeile aus bedient oder Aliases dafür erstellt. Dies ist für automatisiertes Testen nicht hilfreich und führt den Benutzer zwangsläufig zu den beschriebenen Problemen. Allerdings fiel mir auch der Gedanke, dass TestRig im Maven-Plugin besondere Unterstützung benötigte, nie in den Sinn, denn es gibt bereits bessere Lösungen.

Einige Alternativen

  1. Sie das todsichere Plugin verwenden können, und einen JUnit-Test schreiben, der direkt Operationen auf Ihre Grammatik führt (eine Lexer/Parser erstellen, analysieren einige Eingaben, und vielleicht rufen sogar inspect() auf die resultierende Parse-Baum.
  2. Sie können die todsichere Plugin verwenden und einen JUnit-Test schreiben, die explizit TestRig.main(String[]) mit den richtigen Argumenten aufruft.
  3. Sie können die ANTLR 4 Maven Plugin ändern, um ein neues Ziel für die Ausführung von TestRig hinzuzufügen, und sub mit einer Pull-Anforderung an das Projekt, um es in eine zukünftige Version aufzunehmen (Sie müssten einen sehr zwingenden Fall machen, da es bereits zwei Alternativen gibt, die besser geeignet sind, ein Projekt mit ANTLR 4 langfristig erfolgreich zu testen).
+0

ich meine Frage mit einigen Überlegungen aktualisiert :) – JustDanyul

+0

@JustDanyul Danke, es ist jetzt viel klarer, was Sie fordern. Ich habe meine Antwort aktualisiert. –

+0

danke, dass Sie wieder zu mir kommen. Ich hatte nicht an Option # 2 gedacht, das wird mit den bereits bestehenden Unit Tests recht gut zusammenspielen. Prost. – JustDanyul

2

Ich hatte eine ähnliche Frage, in der ich die TestRig-gui Option zum Debuggen meiner Grammatik verwenden wollte. Ich habe keine Möglichkeit gefunden, die GUI über die antlr4-maven-plugin zu starten, aber ich habe es geschafft, einen befriedigenden CLASSPATH zu erstellen. Der Schlüssel sollte target/classes enthalten.

# 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 

Sollte eine schöne GUI-Ansicht des Syntaxbaums erzeugen.

Dies ist vielleicht nicht die Antwort, die Sie suchen, aber ich hoffe, es hilft jemand anderem. (. ZB mich, morgen, wenn ich vergessen)

2

Dies ist, wie ich rufe TestRig mit Maven:

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

Also, wenn Sie MyGrammar.g4 in src/main/antlr4/com/Test haben/Parser mit einer Startregel StartRule:

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