antlr4 - 如何实现递归

时间:2015-02-05 19:42:07

标签: java recursion antlr antlr4

我想解析以下输入:

<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>'

1 个答案:

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