2

我正在尝试修改 Xtext 域模型示例,以便实体属性可以具有另外两个属性(除了示例中已经包含的“许多”之外)。所有属性都必须是可选的,并且它们的顺序无关紧要。看来,无论我做什么,第一个属性必须是最先列出的那个。因此,例如,如果我在 xtext 中有这个:

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

如果我使用'many',那么它必须是第一个属性,否则会出错。如果我完全忽略它,我不会出错。

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

4

2 回答 2

5

显然,我所要做的就是将组括在括号中:/

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

有帮助。

于 2013-07-26T18:13:34.560 回答
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) 中实现一个检查方法,该方法检查是否最多出现 Many、Bool 或 Enum。一次在“optElement”列表中。

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

于 2014-11-07T22:43:48.530 回答