2015-02-05 144 views
1

我想解析以下输入: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>' 
+0

@BartKiers:我添加它作为你的答案评论。再次感谢。 – 2015-02-05 20:28:05

+0

很酷,谢谢,在原始文章中复制粘贴确切的错误信息总是一个好主意(你可以在提交后编辑你的问题)。 – 2015-02-05 20:36:11

+0

我会在未来做到这一点。我是新来的,谢谢指出。也感谢您将它添加到我的消息中。 – 2015-02-05 20:48:10

回答

1

当添加消耗(和跳过)空格的词法规则,我没有问题。

语法:如下

请注意,您的NAME规则可以写成:

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  : [a-zA-Z0-9_-]+ 
      ; 

要摆脱在EOF消息,简单介绍了一个切入点,以你的语法是结束与EOF

parse : query EOF; 

然后执行:

new TParser(...).parse() 
+0

感谢您的回复!当我尝试你的语法(我复制/粘贴它),我得到以下错误:'行1:16在输入'''没有可行的替代。 – 2015-02-05 20:24:15

+0

我的代码:'new TParser(new CommonTokenStream(new TLexer(new ANTLRInputStream( “hello WITH world” ))))。query()' – 2015-02-05 20:24:35

+0

@JesterDaro,检查我的编辑。 – 2015-02-05 20:33:16