2009-04-17 6 views
5

Quelle est la bonne façon de résoudre ce problème dans ANTLR:Comment traiter avec des valeurs de retour de liste dans ANTLR

J'ai une règle simple de grammaire, par exemple pour une liste avec un nombre arbitraire d'éléments.

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

Si je voulais attribuer une valeur de retour pour la liste, et ont cette valeur soit la liste réelle des valeurs retournées de la production, ce qui est la bonne façon de le faire? Les alternatives que je suis divertissant sont:

  • créer ma propre pile dans la portée globale de garder une trace de ces listes
  • Essayez d'inspecter les nœuds d'arbre en dessous de moi et extraire des informations de cette façon
  • Accès en un moyen glissant et cool que j'espère découvrir dans lequel je peux obtenir un accès facile à une telle liste à partir de l'action associée à la règle.

Je suppose que la question est: Comment les enfants cool le font-ils?

(Pour votre information, je suis en utilisant l'API python pour ANTLR, mais si vous me frapper avec une autre langue, je peux gérer cela)

Répondre

5

En C#, il pourrait ressembler à ceci:

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

Et c'est très proche de comment il se présente en Java, aussi bien. Merci! Cependant, Antlr m'a demandé d'attribuer des noms à chaque "valeur": a = expr {$ valueList.add ($ a.value);} (b = expr {$ valueList.add ($ b.value);}) * –

1

I deviner un moyen plus simple pourrait être

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

La «référence ANTLR définitive» de l'auteur montre ce modèle à plusieurs endroits - mais ce que je trouvais en me donnant était une liste de sous-arbres AST, pas une liste de leurs valeurs. –

Questions connexes