2009-04-17 5 views
5

Was ist der richtige Weg umgehen dieses Problem in ANTLR zu lösen:Wie mit der Liste Rückgabewert in ANTLR

ich eine einfache Grammatikregel habe, sagen, um eine Liste mit einer beliebigen Anzahl von Elementen.

list 
: '[]' 
| '[' value (COMMA value)* ']' 

Wenn ich einen Rückgabewert für die Liste zuweisen wollte, und habe diesen Wert die aktuelle Liste der zurückgegebenen Werte aus der Produktion sein, was ist der richtige Weg, es zu tun? Die Alternativen Ich bin unterhaltsam sind:

  • meinen eigenen Stapel im globalen Bereich erstellen Spur dieser Listen
  • Versuchen Sie, halten Sie die Baumknoten unter mir zu inspizieren und extrahieren Informationen auf diese Weise
  • Zugang in etwas raffinierte und coole Art und Weise, die ich herausfinden möchte, in der ich leichten Zugang zu solch einer Liste von innerhalb der mit der Regel verbundenen Handlung bekommen kann.

Ich denke, die Frage ist: Wie machen die coolen Kinder das?

(FYI die Python-API für ANTLR Ich verwende, aber wenn Sie mich treffen mit einer anderen Sprache, ich kann damit umgehen)

Antwort

5

In C# könnte es so aussehen:

list returns [ List<string> ValueList ] 
    @init 
    { 
     $ValueList = new List<string>(); 
    } 
    : '[]' 
    | '[' value {$ValueList.Add(value);} (COMMA value {$ValueList.Add(value);})* ']' 
    ; 
+1

Und das ist sehr nah daran, wie es auch in Java aussieht. Vielen Dank! Antlr forderte mich jedoch auf, jedem "Wert" Namen zuzuweisen: a = Ausdruck {$ WertListe.add ($ a.Wert);} (b = Ausdruck {$ WertListe.add ($ b.Wert);}) * –

1

I eine einfachere Möglichkeit könnte

sein
list returns [ List values ] 
: '[]' 
| '[' vs+=value (COMMA vs+=value)* ']' { 
     $values = $vs; 
} 
+0

Die "Definitive ANTLR Reference" des Autors zeigt dieses Muster an mehreren Stellen - aber was ich fand, gab mir eine Liste von AST-Unterbäumen, keine Liste ihrer Werte. –