Question

Quelle est la bonne façon de résoudre ce problème 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 divertissants 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 d'une certaine façon slick et cool que j'espère découvrir où je peux obtenir un accès facile à une telle liste, dans l'action associée à la règle.

Je suppose que la question est: Comment les enfants cools font

(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)

Était-ce utile?

La solution

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);})* ']'
    ;

Autres conseils

Je suppose que d'une manière plus simple pourrait être

list returns [ List values ]
: '[]' 
| '[' vs+=value (COMMA vs+=value)* ']' {
        $values = $vs;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top