1

我在 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 is a non-unique reference。

我已经按照本网站中另一个类似问题的解决方案(如何处理 ANTLR 中的列表返回值)但是它似乎只适用于词法规则。

有没有特定的方法可以绕过它?

谢谢你,克里斯托斯

4

3 回答 3

3

你的表达式中有 2 个 title_args,你需要给它们起别名。尝试这个:

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

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

于 2009-08-31T01:57:47.477 回答
0

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

title_args
title_args1

在您的代码中,而不是使用 title_args 两次。

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

于 2011-10-18T00:48:58.463 回答
0

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

于 2009-08-11T10:32:08.967 回答