2017-12-06 3 views
0

Ich versuche eine Grammatik zu erstellen, um Solr-Abfragen zu parsen (nur leicht relevant und Sie müssen nichts über solr wissen, um die Frage zu beantworten - nur mehr als wissen Ich mache über Antlr 4.7). Ich basiere es auf der QueryParser.jj-Datei von Solr 6. Ich suchte nach einem bestehenden, aber es scheint nicht zu sein, das nicht alt und veraltet ist.Laufender Antlr4 Parser mit Lexergrammatik erhält Tokenerkennungsfehler

Ich bin fest, weil, wenn ich versuche, den Parser zu laufen bekomme ich "Token-Erkennung Fehler" s.

Der Lexer, den ich erstellt habe, benutzt Lexer-Modi, was, wie ich es verstehe, bedeutet, dass ich eine separate Lexer-Grammatikdatei haben muss. Also, ich habe einen Parser und eine Lexer-Datei.

Ich habe es zu einem einfachen Beispiel verkleinert, um zu zeigen, dass ich sehe. Vielleicht kann mir jemand sagen, was ich falsch mache. Hier ist der Parser (Junk.g4):

grammar Junk; 

options { 
    language = Java; 
    tokenVocab=JLexer; 
} 

term : TERM '\r\n'; 

ich nicht einen Import wegen des Lexer-Modi in der Lexer-Datei verwendet, kann ich erstellen bin versucht (die Token in den Modi werden „undefiniert“, wenn ich Verwenden Sie einen Import). Deshalb referenziere ich die Lexer-Datei mit dem Parameter tokenVocab (wie im XML-Beispiel in GitHub gezeigt).

Hier ist die Lexer (JLexer.g4):

lexer grammar JLexer; 

TERM : TERM_START_CHAR TERM_CHAR* ; 

TERM_START_CHAR : [abc] ; 
TERM_CHAR : [efg] ; 
WS : [ \t\n\r\u3000]+ -> skip; 

Wenn ich den Lexer-Code in die Parser zu kopieren, dann wie erwartet die Dinge funktionieren (zum Beispiel "Aeee" ist ein Begriff). Wenn ich die lexer-Datei mit grun ausführe (Tokens als Ziel angeben), parst die Zeichenfolge als TERM (wie erwartet).

Wenn ich den Parser ("grun Junk Begriff -tokens") laufen, dann erhalte ich:

line 1:0 token recognition error at: 'a' 
line 1:1 token recognition error at: 'e' 
line 1:2 token recognition error at: 'e' 
line 1:3 token recognition error at: 'e' 
[@0,4:5='\r\n',<' 
'>,1:4] 

I "kompilieren", um die Lexer zuerst, dann "kompilieren" den Parser und JavaC dann die resultierende java Dateien. Ich mache das in einer Batch-Datei, also bin ich ziemlich zuversichtlich, dass ich das jedes Mal mache.

Ich verstehe nicht, was ich falsch mache. Ist es die Art, wie ich grun fahre? Irgendwelche Vorschläge würden geschätzt werden.

Antwort

0

Vertrauen Sie immer Ihrer Intuition! Es gibt einige Konvention innerhalb grun :-) Sehen Sie hier TestRig.java c. Zeilen 125, 150. Wäre viel besser gewesen, wenn einige zusätzliche CLI-Argumente hinzugefügt worden wären.

Wenn Lexer und Grammatik getrennt kompiliert werden, wäre der Grammatikname - in Ihrem Fall - "" "Junk" und die beiden Dateien müssen "JunkLexer.g4" und "JunkParser.g4" heißen. Dementsprechend werden die Header in Parser Datei JunkParser.g4 sollte auch

parser grammar JunkParser; 
options { tokenVocab=JunkLexer; } 
... stuff 

Jetzt können Sie Ihre Tests

laufen modifiziert werden
> antlr4 JunkLexer 
> antlr4 JunkParser 
> javac Junk*.java 
> grun Junk term -tokens 
aeee 
^Z 
[@0,0:3='aeee',<TERM>,1:0] 
[@1,6:5='<EOF>',<EOF>,2:0] 
> 
Verwandte Themen