我有一个描述状态机的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?
最佳答案
您最初的问题是:您不想在多个文件中重复自己。
我建议另一种解决此问题的方法:
我们不是制作标准文件,而是在其中定义常用状态并使用此处描述的import语句导入这些状态:
http://www.eclipse.org/Xtext/documentation/1_0_1/xtext.html#syntax
关于eclipse - 是否可以通过Xtext/Xpand中的相同元素名称访问引用或终端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4724662/