Wie passt man Text in ANTLRv4? Ich meine Text, der zum Zeitpunkt des Grammatikschreibens unbekannt ist?Übereinstimmender beliebiger Text (sowohl Symbole als auch Leerzeichen) mit ANTLR?
Meine Grammatik ist folgendermaßen:
grammar Anytext;
line :
comment;
comment : '#' anytext;
anytext: ANY*;
WS : [ \t\r\n]+;
ANY : .;
Und mein Code folgt ist:
String line = "# This_is_a_comment";
ANTLRInputStream input = new ANTLRInputStream(line);
AnytextLexer lexer = new AnytextLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
AnytextParser parser = new AnytextParser(tokens);
ParseTree tree = parser.comment();
System.out.println(tree.toStringTree(parser)); // print LISP-style tree
Ausgang folgt:
line 1:1 extraneous input ' ' expecting {<EOF>, ANY}
(comment # (anytext T h i s _ i s _ a _ c o m m e n t))
Wenn ich ANY
Regel
ANY : [ \t\r\n.];
ändern
es hört auf, irgendein Symbol überhaupt zu erkennen.
UPDATE1
Ich habe keine Endlinie Zeichen am Ende.
UPDATE 2
Also, ich verstanden, dass es mit Lexer beliebigen Text übereinstimmen, da Lexer nicht zulassen, können mehrere Klassen unmöglich ist. Wenn ich die Lexer-Regel für ein beliebiges Symbol definiere, werden alle anderen Regeln entweder ausgeblendet oder funktionieren nicht.
Aber die Frage bleibt.
Wie alle Symbole auf Parser Ebene dann passen?
Angenommen, ich tabellenförmigen Daten haben, und ich wan't einige Felder zu bearbeiten und andere ignorieren. Wenn ich anytext
Regel hätte, würde ich
infoline :
(codepoint WS 'field1' WS field1Value) |
(codepoint WS 'field2' WS field2Value) |
(codepoint WS anytext);
schreiben hier bin ich Parsen weitere Zeilen zweite Spalte enthält field1
und field2
Werte und ignorieren Zeilen anders.
, wie dieser Ansatz zu erreichen?
Ich bearbeitet Ihren Beitrag, um genau die gleiche Regel in ANTLR 4 Syntax geben. Auf einer separaten Notiz empfehle ich * nicht * einschließlich der ''\ r' '? '\ n''-Zeilenabschluss als Teil der 'LINE_COMMENT'-Regel selbst (es darf Zeichen bis einschließlich, aber nicht am Ende der Zeile enthalten). Es gibt ein paar Gründe, warum ich das empfehle, aber die größte ist die Tatsache, dass 'LINE_COMMENT' in der aktuellen Form nicht mit einem Kommentar in der letzten Zeile einer Datei übereinstimmt, wenn auf sie kein expliziter Zeilenabschluss folgt. –
Ja, das war für ANTLR 3, danke für die Änderungen – hoaz
Warum ist es so komplex? Ist es möglich, einfacher zu schreiben? Warum funktioniert meine Regel nicht? –