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()