У меня есть грамматика Xtext, которая описывает машины состояний, и я использую ссылки на ранее объявленные события и состояния для описания переходов:
Event:
'event' name=ID
;
State:
'state' name=ID
;
Transition:
event=[Event] '=>' state=[State]
;
Когда я использую MWE для создания редактора, он будет проверятьналичие ссылочных позиций.Например, для написания
init => idle
потребуется следующее:
event init
state idle
должно присутствовать где-то еще в коде (кстати, я использую один файл для каждой машины состояний, поэтому он должен бытьв том же файле).В моих шаблонах кода Xpand я могу получить доступ к событию и состоянию как к элементам перехода:
«FOREACH statemachine.transitions.event AS event-» // you get the idea
Это работает очень хорошо, и я уже довольно давно его использую.
Но так какряд событий является общим для всех моих машин состояний (init
, show
, hide
, finish
и некоторые другие), я хочу иметь возможность ссылаться на событие так, как я это делал, или введите одно из указанных выше имен событий без необходимости объявлять событие в каждом файле.
Но я не могу этого сделать:
Transition:
event=( [Event] | ('init'|'show'|'hide'|'finish') ) '=>' state=[State]
;
Поэтому я решилопределить терминал EventID
, который является одним из указанных ключевых слов:
terminal EventID:
'init'|'show'|'hide'|'finish'
;
Но я также не могу сделать это:
Transition:
event=( [Event] | EventID ) '=>' state=[State]
;
Затем я попытался сделать Event комбинированным правилом:
CustomEvent:
'event' name=ID
;
BaseEvent:
name=EventID
;
Event:
CustomEvent | BaseEvent
;
Transition:
event=[Event] '=>' state=[State]
;
, который тоже не работал.
На данный момент я решил согласиться с обходным решением:
Transition:
( event=[Event] | baseevent=EventID ) '=>' state=[State]
;
Это работает, но мне придется изменить все мои шаблоны, чтобы искать как события, так и базовые события.
Я понимаю, это довольно много текста ... Итак, наконец, вот мой вопрос:
Можно ли вообще использовать одно и то же имя элемента для либо ссылка или EventID?