2009-08-03 8 views
1

Ich habe eine einfache Regel in ANTLR:Handhabung mehr Rückgabewerte in ANTLR

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

    $v = new ElementVector<Element>() ; 

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

mit title_args sein:

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

Dem Versuch, zu kompilieren, dass ich mit einem 127 Fehler in der Titel Regel konfrontiert erhalten : title_args ist eine nicht eindeutige Referenz.

Ich habe die Lösung einer anderen ähnlichen Frage auf dieser Website (How to deal with list return values in ANTLR) gefolgt, aber es scheint nur mit lexikalischen Regeln zu arbeiten.

Gibt es einen bestimmten Weg, um es zu umgehen?

Danke, Christos

Antwort

0

denke ich das Problem Ihr die title_args var Wiederverwendung ist. Versuchen Sie, einen dieser Variablennamen zu ändern.

3

Sie haben 2 title_args in Ihrem Ausdruck, Sie müssen sie umbenennen. Versuchen Sie folgendes:

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

T1 und T2 sind beliebige Aliase Sie alles, was Sie wollen so lange wählen können, wie sie zusammenpassen.

0

Ja, ich hatte das gleiche Problem. Sie müssen einen der Variablennamen ändern. Beispiel:

title_args 
title_args1 

in Ihrem Code anstatt zweimal title_args zu verwenden.

Wenn title_args eine Parser-Regel ist, dann erstellen Sie einfach die gleiche Regel mit dem Namen title_args1. Also, im Grunde gäbe es zwei Regeln mit der gleichen Funktionalität.

+1

Dies ist ein Hack und schlechter Rat. Die richtige Antwort ist die obige, deklarieren Sie einen Variablennamen für jede Produktion mit = und verweisen Sie dann darauf. – user430788