Обработки динамических переменных с 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 ответ:
Не очень хорошая идея использовать один и тот же синтаксис для объявления переменной и выражения присваивания. Если возможно, я ввел ключевое слово или специальный оператор для объявления.
В случае, если вы не можете или не хотите этого делать, самым трудным будет выбрать либо перекрестную ссылку, либо простой идентификатор.
Если вы идете с первым, вам придется отключить сообщения об ошибках для неразрешенных ссылок. Если вы выберете последнее, вам придется сутенерить контент помощь и гиперссылка вручную.