如何匹配 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 );
field1
如果第二列包含和值,我在这里解析行field2
,否则忽略行。
如何实现这种方法?