我想解析以下输入:
<name 1> WITH <name 2> WITH <name 3> WITH <name 4> ...
我尝试了以下语法:
WITH : 'WITH'
;
NAME : ('a'..'z' | 'A'..'Z' | '0'..'9' | '-' | '_')+
;
query : NAME (WITH query)?
;
但这似乎不起作用。我该如何实现递归?
以获取您的信息
我的最终目标是解析像这样的树状结构:
<name 1> WITH (<name 2> WITH <name 3> WITH <name 4>) WITH <name 5>
这会生成以下树:
<name 1>
<name 2>
<name 3>
<name 4>
<name 5>
但是,让我们先从第一个表达开始。
我的代码:
new TParser(new CommonTokenStream(new TLexer(new ANTLRInputStream( "hello WITH world" )))).query()
导致了消息:
line 1:16 no viable alternative at input '<EOF>'
答案 0 :(得分:1)
当添加消耗(和跳过)空格的词法分析器规则时,我没有问题。
语法:
grammar T;
SPACE : [ \t\r\n]+ -> skip
;
WITH : 'WITH'
;
NAME : ('a'..'z' | 'A'..'Z' | '0'..'9' | '-' | '_')+
;
query : NAME (WITH query)?
;
将匹配输入a WITH b WITH c WITH d
,如下所示:
请注意,您的NAME
规则可以写成如下:
NAME : [a-zA-Z0-9_-]+
;
要删除EOF
消息,只需引入以EOF
结尾的语法入口点:
parse : query EOF;
然后执行:
new TParser(...).parse()