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.
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
Ja - Antwort aktualisiert. – GRosenberg