2009-08-03 10 views
1

J'ai une règle simple ANTLR:Gestion des multiples valeurs de retour dans ANTLR

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

    $v = new ElementVector<Element>() ; 

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

avec title_args étant:

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

Essayer de compiler que je me confronté à une erreur 127 dans la règle de titre : title_args est une référence non unique.

J'ai suivi la solution donnée à une autre question similaire sur ce site web (How to deal with list return values in ANTLR) mais cela ne semble fonctionner qu'avec des règles lexicales.

Existe-t-il un moyen spécifique de contourner ce problème?

Merci, Christos

Répondre

0

Je pense que le problème est votre réutilise le title_args var. Essayez de changer l'un de ces noms de variables.

3

Vous avez 2 title_args dans votre expression, vous devez les alias. Essayez ceci:

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

t1 et t2 sont des alias arbitraires que vous pouvez choisir ce que vous voulez aussi longtemps qu'ils correspondent.

0

Oui, j'ai eu le même problème. Vous devez modifier l'un des noms de variables; par exemple, faites comme suit:

title_args 
title_args1 

au lieu d'utiliser deux fois title_args.

Si title_args est une règle de parseur, créez simplement la même règle avec le nom title_args1. Donc, fondamentalement, il y aurait deux règles avec la même fonctionnalité.

+1

Ceci est un hack et un mauvais conseil. La bonne réponse est celle ci-dessus, déclarez un nom de variable pour chaque production en utilisant = puis faites-en référence. – user430788

Questions connexes