Question

Dans mes variables DSL sont dynamiques, elles sont créées la première fois qu'une valeur leur est attribuée.C'est donc un code valide:

a = 0
b = 2 // new variable created
a = 3 // existing variable reassigned

Mon approche naïve est d'avoir des règles comme celle-ci

Identifier:
  ID; // ID from Terminals

Assignable:
  {Assignable} ref=[Identifier|ID] |
  {Assignable} newVar=Identifier;

Cela ne fonctionne pas, se plaignant "Les alternatives suivantes ne peuvent jamais être égalées: 2".C'est compréhensible, car la grammaire de débogage Antlr générée contient une règle:

ruleAssignable: ruleIdentifier | ruleIdentifier;

(L'astuce du [Identifier|ID] vient d'une réponse à une question sur cross-référencement . Je viens de le copier sans bien comprendre :) J'ai également essayé de comprendre comment il est résolu dans la grammaire Xbase:

{XAssignment} /* (declaringType=[types::JvmDeclaredType] '::')? */ feature=[types::JvmIdentifiableElement|ValidID] OpSingleAssign value=XAssignment

Il semble n'utiliser que des références croisées, et je ne vois pas comment la nouvelle déclaration de variable est gérée.

Était-ce utile?

La solution

Il n'est pas particulièrement judicieux d'utiliser la même syntaxe pour une déclaration de variable et une expression d'affectation.Si possible, j'avais introduit un mot-clé ou un opérateur spécial pour la déclaration.

Si vous ne pouvez pas ou ne voulez pas faire cela, le plus difficile serait de choisir entre une référence croisée ou un simple identifiant.

Si vous optez pour le premier, vous devrez désactiver les messages d'erreur pour les références non résolues. Si vous choisissez cette dernière option, vous devrez effectuer manuellement l’assistance au contenu et les hyperliens.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top