antlr4 - 如何实现递归
antlr4 - how to implement recursion
我要解析以下输入:
<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>'
添加消耗(并跳过)空格的词法分析器规则时,我没有问题。
语法:
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()
我要解析以下输入:
<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>'
添加消耗(并跳过)空格的词法分析器规则时,我没有问题。
语法:
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()