2013-07-26 39 views
2

我试图修改Xtext域模型示例,以便实体属性可以有两个更多的属性(除了已经包含在示例中的'许多')。所有属性都必须是可选的,并且它们的顺序不相关。看来,不管我做什么,第一个属性必须是首先列出的属性。因此,举例来说,如果我有这样的XTEXT:Xtext可选项目的无序列表

(many ?= 'many')? & (aBool ?= 'isBool')? & (anEnum = EnumType)? 

如果我用“多”,那么它必须是第一个属性,否则我得到一个错误。如果我完全抛弃它,我不会有任何错误。

那么,如何告诉xtext我想在无序组中使用三个可选属性?

回答

3

显然,所有我需要做的是封闭组括号:帮助/

((many ?= 'many')? & (aBool ?= 'isBool')? & (anEnum = EnumType)?) 

This

0

&运算符在Xtext中很成问题!因为解析器必须实现所有可能的排列。最好实现一个抽象的解析器规则'OptionalElement',这个规则可以在列表中经常出现无限。这个解析器规则然后被指定为'Many','Bool'或'Enum'。然后,语法是这样的:

AnyRule: /* some stuff */ optElement+=OptionalElement*; 
OptionalElement: Many | Bool | Enum; 
Many: {Many} 'many'; 
Bool: {Bool} 'isBool'; 
Enum: anEnum=EnumType; 

然后你只需要实现的验证器类(... mydsl.validation.MyDslValidator),检查是否很多,布尔或枚举occures最大的检查方法。一次在'optElement'列表中。

类/方法/字段修饰符在Java语法中以相同的方式定义。