Обработки динамических переменных с Xtext грамматики


В моем DSL переменные являются динамическими, они создаются при первом присвоении им значения. Итак, это допустимый код:

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

Мой наивный подход состоит в том, чтобы иметь правила, подобные этому

Identifier:
  ID; // ID from Terminals

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

Это не работает, жалуясь, что "следующие альтернативы никогда не могут быть сопоставлены: 2". Это понятно, потому что сгенерированная отладочная грамматика Antlr содержит Правило:

ruleAssignable: ruleIdentifier | ruleIdentifier;

(трюк [Identifier|ID] исходит из ответа на вопросо перекрестных ссылках . Я просто скопировал это без полного понимания :) я также попытался grok, как это решается в грамматике Xbase:

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

Похоже, что он использует только перекрестные ссылки, и я не вижу, как обрабатывается объявление новой переменной.

1 2

1 ответ:

Не очень хорошая идея использовать один и тот же синтаксис для объявления переменной и выражения присваивания. Если возможно, я ввел ключевое слово или специальный оператор для объявления.

В случае, если вы не можете или не хотите этого делать, самым трудным будет выбрать либо перекрестную ссылку, либо простой идентификатор.

Если вы идете с первым, вам придется отключить сообщения об ошибках для неразрешенных ссылок. Если вы выберете последнее, вам придется сутенерить контент помощь и гиперссылка вручную.