我有一个描述状态机的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]
;
然后我尝试将事件作为一个组合规则:
CustomEvent:
'event' name=ID
;
BaseEvent:
name=EventID
;
Event:
CustomEvent | BaseEvent
;
Transition:
event=[Event] '=>' state=[State]
;
也不起作用。
现在我决定解决一个变通方法:
Transition:
( event=[Event] | baseevent=EventID ) '=>' state=[State]
;
这样可行,但我必须更改所有模板以查找事件和基本事件。
我意识到,这是相当多的文字......所以最后,这是我的问题:
我有什么办法可以使用相同的元素名称 引用或一个EventID?
答案 0 :(得分:1)
你最初的问题是:你不想在几个文件中重复自己。 我建议另一种方法来解决这个问题: 我们不制作标准文件,您可以在其中定义公共状态并使用此处描述的import语句导入这些状态: http://www.eclipse.org/Xtext/documentation/1_0_1/xtext.html#syntax