2009-04-17 10 views
5

Qual è il modo corretto per risolvere questo problema in ANTLR:Come trattare con i valori elenco ritorno in ANTLR

Ho una semplice regola grammaticale, diciamo per una lista con un numero arbitrario di elementi.

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

Se avessi voluto assegnare un valore di ritorno per la lista, e che hanno valore sia ha l'elenco dei valori restituiti dalla produzione, qual è il modo corretto di farlo? Le alternative Sto divertenti sono:

  • creare il mio stack nel ambito globale per tenere traccia di queste liste
  • Provare a ispezionare i nodi della struttura sotto di me ed estrarre le informazioni in questo modo
  • accesso in un modo agile e interessante che spero di scoprire in cui posso ottenere un facile accesso a tale elenco dall'azione associata alla regola.

Credo che la domanda sia: come fanno i ragazzi alla moda?

(FYI sto usando l'API Python per ANTLR, ma se mi ha colpito con un altro linguaggio, posso gestire tale)

risposta

5

In C# che potrebbe assomigliare a questo:

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

E questo è molto vicino a come appare in Java, pure. Grazie! Tuttavia, Antlr mi ha richiesto di assegnare nomi a ciascun "valore": a = expr {$ valueList.add ($ a.value);} (b = expr {$ valueList.add ($ b.value);}) * –

1

I indovinate un modo più semplice potrebbe essere

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

Il "Definitive ANTLR Reference" dell'autore mostra questo modello in diversi punti - ma quello che ho trovato che mi dava era un elenco di sottoalberi AST, non un elenco dei loro valori. –