Обработка нескольких возвращаемых значений в ANTLR - PullRequest
1 голос
/ 03 августа 2009

У меня есть простое правило в 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 - неуникальная ссылка.

Я следовал решению, заданному для другого подобного вопроса на этом сайте ( Как обращаться со значениями, возвращаемыми списком в ANTLR ), однако кажется, что он работает только с лексическими правилами.

Есть ли конкретный способ обойти это?

Спасибо, Christos

Ответы [ 3 ]

3 голосов
/ 31 августа 2009

В вашем выражении есть 2 title_args, вам нужно их псевдоним. Попробуйте это:

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

t1 и t2 - произвольные псевдонимы, вы можете выбрать все, что захотите, если они совпадают.

0 голосов
/ 18 октября 2011

Да, у меня была такая же проблема. Вам нужно изменить одно из имен переменных; например, сделайте следующее:

title_args
title_args1

в вашем коде вместо использования title_args дважды.

Если title_args - это правило синтаксического анализатора, просто создайте то же правило с именем title_args1. Таким образом, в основном было бы два правила с одинаковой функциональностью.

0 голосов
/ 11 августа 2009

Я думаю, проблема в том, что вы используете title_args var. Попробуйте изменить одно из этих имен переменных.

...