2014-05-17 42 views
0

我想要做的,是修改了一下基本entity DSL例子,所以它支持原語,讓人覺得這是可以做到:XTEXT實體例如,原始類型

entity Dog { 
    name : String 
} 

entity Person { 
    name : String 
    dog : Dog 
} 

使成員的類型可以是對另一個實體的名稱的引用,也可以是預定義的原語。我也在尋找一種方法,因此在生成的編輯器中爲原語和實體名稱提供內容幫助。

這裏是我的.xtext至今:

Model: 
    (entites+=Entity)*; 

Entity: 
    'entity' name=ID '{' 
    (members+=Member)* 
    '}'; 

AbstractType: 
    Entity | PrimitiveType; 

PrimitiveType: 
    name='Integer' | name='String'; 

Member: 
    (many?='many')? name=ID ':' (type=[AbstractType]); 

在這種情況下,IntegerString由編輯爲關鍵字的認可,但它們標記爲錯誤,與消息:

不匹配的輸入'整數'期待RULE_ID

我嘗試使用此問題的解決方案: Defining Primitives within xtext Grammar, 這是半正式的,因爲原語沒有被標記爲錯誤,但沒有內容幫助他們。

那麼這樣做的正確方法是什麼?

回答

1

xxxx = [YYYYY]是一個交叉引用。這是對其他地方定義的東西的引用。在你的模型中你沒有一個PrimitiveType的實例,所以你不能擁有它的一個實例。所以你必須明確地定義它們

Model: 
(primitives+= PrimitiveType)*; 
PrimitiveType: 
'datatype' (name='Integer' | name='String'); 

模型

datatype String 
datatype Integer 
entity Dog { 
    name : String 
} 

entity Person { 
    name : String 
    dog : Dog 
} 

還是得拿出一個完全不同的語法

Model: 
    (entites+=Entity)*; 

Entity: 
    'entity' name=ID '{' 
    (members+=Member)* 
    '}'; 

Type: 
    EntityRefence | SimpleDataType; 

EntityRefence: 
    entity=[Entity] 
; 

SimpleDataType: 
    type=PrimitiveType 
; 


enum PrimitiveType: 
    String | Integer 
; 

Member: 
    (many?='many')? name=ID ':' type=Type; 
+0

非常感謝,這正是我一直在尋找對於。 –