我在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
答案 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的相同规则。 所以,基本上会有两个具有相同功能的规则。