我有一个描述状态机的 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 ?