3

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

这真的很好用,我已经使用了很长时间了。

但是由于许多事件对于我的所有状态机(initshowhidefinish等)都是通用的,因此我希望能够像以前那样引用事件,或者无需输入上述事件名称之一在每个文件中声明事件。

但我不能这样做:

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

4

1 回答 1

1

您最初的问题是:您不想在多个文件中重复自己。我建议解决这个问题的另一种方法:我们不制作标准文件,您可以在其中定义常见状态并使用此处描述的导入语句导入这些状态:http: //www.eclipse.org/Xtext/documentation/ 1_0_1/xtext.html#语法

于 2011-01-24T15:51:47.703 回答