通过Xtext / Xpand中的相同元素名称使引用或终端可访问?

时间:2011-01-18 13:34:47

标签: eclipse grammar modeling xtext xpand

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

然后我尝试将事件作为一个组合规则:

CustomEvent:
    'event' name=ID
    ;

BaseEvent:
    name=EventID
    ;

Event:
    CustomEvent | BaseEvent
    ;

Transition:
    event=[Event] '=>' state=[State]
    ;

也不起作用。

现在我决定解决一个变通方法:

Transition:
    ( event=[Event] | baseevent=EventID ) '=>' state=[State]
    ;

这样可行,但我必须更改所有模板以查找事件和基本事件。

我意识到,这是相当多的文字......所以最后,这是我的问题:

我有什么办法可以使用相同的元素名称 引用一个EventID?

1 个答案:

答案 0 :(得分:1)

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