2016-04-29 14 views
1

ich eine einfache ANTLR4 Grammatik haben:ANTLR4 auflegt Wenn mit EOF Umgang

grammar Test; 
preprocessing_file: oneline+; 

oneline: IDENTIFIER? new_line; 

new_line: EOF|CRLF 
; 

WS: [ \t\f]+ -> channel(2); 

CRLF: '\r'? '\n'; 


IDENTIFIER: (NONDIGIT | DIGIT)+ 
; 
    fragment DIGIT: [0-9]; 
    fragment NONDIGIT: [_a-zA-Z] ; 

ich testen, wie eine neue Zeile Regel zu verwenden, die die letzte Zeile erlaubt nicht durch eine CRLF beendet wird. Ich habe die Grammatik mit ANTLR v4.1 und v4.5.3 getestet.

Eine Eingabedatei mit ein paar Zeilen Text führte dazu, dass ANTLR4 nach einer Weile einfror und OutOfMemoryException. Es sieht so aus, als ob ANTLR4 eine Endlosschleife betreten hat. Ist es ein Fehler mit ANTLR4? Habe ich etwas falsch gemacht? Auch, wenn ich die EOF in new_line Regel entfernen, funktioniert alles gut.

Antwort

2

einfach zu validieren müssen eine EOF an die Hauptregel hinzuzufügen. Ohne es wird die Hauptregel nie enden - der Lexer wird weiterhin EOF Tokens produzieren, die erfolgreich von der new_line Regel verbraucht werden.

preprocessing_file: oneline+? EOF ; 
oneline: IDENTIFIER? new_line ; 
new_line: EOF|CRLF ; 
+0

Thx, das ist das Problem. Ich wusste nicht, dass es unendlich viele EOF geben könnte, wenn der Lexer es konsumiert. Aber die von dir vorgeschlagene Lösung wird nicht funktionieren. Der wahre Schuldige ist, dass die "Oneline" -Regel einen einzelnen EOF auf unbestimmte Zeit erreichen kann, den der Lexer auch auf unbestimmte Zeit auspumpt. Brauchen Sie einen nicht-gierigen Operator, also oneline +? zusätzlich zu den zusätzlichen EOF – JavaMan

+0

Ja - Antwort aktualisiert. – GRosenberg

0

EOF [Ende der Datei] sollte nicht in New_line-Regel sein. Ändern Sie einfach

oneline: IDENTIFIER? new_line 

in

oneline: IDENTIFIER? new_line? 

Validate die Anwesenheit von new_line in späteren Phasen benötigt, wenn bei allen

+0

(1), warum EOF nicht in der Regel erlaubt? ist es nicht für uns erstellt, um das Ende der Datei explizit übereinstimmen (2) in dieser Grammatik IDENTIFIER kann alles sein, aber meine echte Grammatik ist sehr spezifisch über den Inhalt und diktieren eine neue_line muss folgen. So kann new_line hier nicht optional sein. Jedenfalls gibt es keinen Grund für ANLTR4, zu hängen und OutOfMemoryException später zu werfen. – JavaMan

+0

Ich sage nicht, dass es nicht erlaubt ist, nur dass es keinen wirklichen Grund gibt, es dort zu sagen. Setze am Ende die Grundregel ein und schaue ob es hilft, wenn nicht, dann muss es einen anderen Fehler geben ... ich sehe keine in der Grammatik/ist das die ganze Grammatik? – Divisadero

+0

ja die ganze Grammatik, ich habe gerade die 'grammatik xx' ausgeschlossen; Linie. (Ich habe gerade den Quellcode bearbeitet, um diese Zeile einzuschließen). Und, ohne EOF in der new_line-Regel, funktioniert ANTLR4 korrekt, aber kann nicht mit meiner letzten Zeile übereinstimmen, die keine nachfolgende CRLF hat. – JavaMan