Gérer la variable dynamique avec la grammaire Xtext
-
28-10-2019 - |
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.
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.