Как сопоставить любой текст в ANTLRv4? Я имею в виду текст, который неизвестен на момент написания грамматики?
Моя грамматика следующая:
grammar Anytext;
line :
comment;
comment : '#' anytext;
anytext: ANY*;
WS : [ \t\r\n]+;
ANY : .;
И мой код выглядит следующим образом:
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
Вывод следующий:
line 1:1 extraneous input ' ' expecting {<EOF>, ANY}
(comment # (anytext T h i s _ i s _ a _ c o m m e n t))
Если я изменю ANY
правило
ANY : [ \t\r\n.];
он вообще перестает распознавать любой символ.
ОБНОВЛЕНИЕ1
У меня нет символа конечной строки в конце.
ОБНОВЛЕНИЕ 2
Итак, я понял, что невозможно сопоставить любой текст с лексером, так как лексер не может разрешить несколько классов. Если я определю правило лексера для любого символа, оно либо скроет все остальные правила, либо не будет работать.
Но вопрос остается.
Как тогда сопоставить все символы на уровне парсера?
Предположим, у меня есть табличные данные, и я не хочу обрабатывать одни поля и игнорировать другие. Если бы у меня было правило anytext
, я бы написал
infoline :
( codepoint WS 'field1' WS field1Value ) |
( codepoint WS 'field2' WS field2Value ) |
( codepoint WS anytext );
здесь я анализирую строки, если 2-й столбец содержит значения field1
и field2
, и игнорирую строки в противном случае.
Как осуществить этот подход?