Jak dopasować dowolny tekst w ANTLRv4? Mam na myśli tekst, który jest nieznany w czasie pisania gramatyki?Dopasowanie dowolnego tekstu (zarówno symboli, jak i spacji) za pomocą ANTLR?
Moja gramatyka jest następujący:
grammar Anytext;
line :
comment;
comment : '#' anytext;
anytext: ANY*;
WS : [ \t\r\n]+;
ANY : .;
A mój kod jest następujący:
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
Wyjście następująco:
line 1:1 extraneous input ' ' expecting {<EOF>, ANY}
(comment # (anytext T h i s _ i s _ a _ c o m m e n t))
Jeśli zmienię ANY
reguła
ANY : [ \t\r\n.];
przestaje rozpoznawać dowolny symbol.
UPDATE1
nie mam charakter linii końcowej na końcu.
UPDATE 2
Tak, zrozumiałem, że jest to niemożliwe, aby dopasować dowolny tekst z lexer lexer ponieważ nie może pozwolić wielu klas. Jeśli zdefiniuję regułę lexera dla dowolnego symbolu, to albo ukryję wszystkie inne reguły, albo nie zadziała.
Ale pytanie nie ustępuje.
Jak dopasować wszystkie symbole na poziomie parsera?
Załóżmy, że mam dane w kształcie tabeli i nie chcę przetwarzać niektórych pól i ignorować innych. Gdybym miał anytext
regułę, chciałbym napisać
infoline :
(codepoint WS 'field1' WS field1Value) |
(codepoint WS 'field2' WS field2Value) |
(codepoint WS anytext);
ja tu analizowania wierszy jeśli Kolumna 2 zawiera field1
i field2
wartości i ignorować wiersze inaczej.
Jak osiągnąć to podejście?
Edytowałem twój post, aby podać dokładnie tę samą regułę w składni ANTLR 4. W oddzielnej notatce polecam * nie *, w tym '' \ r '? Terminator "\ n" w ramach samej reguły "LINE_COMMENT" (spraw, aby zużywał znaki do, ale nie wliczając końca wiersza). Jest kilka powodów, dla których polecam to, ale największy jest fakt, że w obecnej formie "LINE_COMMENT" nie będzie pasować do komentarza na ostatnim wierszu pliku, jeśli nie następuje jednoznaczne zakończenie linii. –
tak, to było dla ANTLR 3, dziękuję za edycje – hoaz
Dlaczego to jest takie skomplikowane? Czy można pisać łatwiej? Dlaczego moja zasada nie działa? –