在ANTLR中处理多个返回值

时间:2009-08-03 14:58:40

标签: return-value antlr

我在ANTLR中有一个简单的规则:

title returns [ElementVector<Element> v]
@init{

    $v = new ElementVector<Element>() ;

}
    :   '[]'    
    |   '[' title_args {$v.add($title_args.ele);} (',' title_args {$v = $title_args.ele ;})* ']' 
    ;

title_args为:

title_args returns [Element ele]
    :   author {$ele = new Element("author", $author.text); }
    |   location {$ele = new Element("location", $location.text); }
    ;

尝试编译我在标题规则中遇到127错误:title_args是一个非唯一的引用。

我已经按照本网站中另一个类似问题的解决方案(How to deal with list return values in ANTLR),但它似乎只适用于词汇规则。

有没有具体的解决方法?

谢谢你, 的Christos

3 个答案:

答案 0 :(得分:3)

你的表达式中有2个title_args,你需要为它们添加别名。试试这个:

|   '[' t1=title_args {$v.add($t1.ele);} (',' t2=title_args {$v = $t2.ele ;})* ']' 

t1和t2是任意别名,只要匹配就可以选择任何你想要的东西。

答案 1 :(得分:0)

我认为问题在于您重用title_args var。尝试更改其中一个变量名称。

答案 2 :(得分:0)

是的,我遇到了同样的问题。 您需要更改其中一个变量名称;例如,请执行以下操作:

title_args
title_args1
在代码中

而不是两次使用title_args。

如果title_args是解析器规则,则只需创建名称为title_args1的相同规则。 所以,基本上会有两个具有相同功能的规则。