2013-07-26 63 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語法中以相同的方式定義。