2014-02-26 90 views
0

我想解析ecore模型。如果有一個接口鏈接字段,我無法訪問它的實現值。Xtext解析EMF模型接口

的Xtext語法:

Map: 
    type=MapCreate 
    name=ID '=' 
    mapcontent+=MapBody (',' mapcontent+=MapBody)* ';'; 

    MapCreate: 
    'Map' '<' keyType=MapKeyDataType ',' valueType=MapValueType '>'; 

MapKeyDataType: 
    'String' | 'int'; 

MapValueType: 
    MapKeyDataType | 'float' | MapCreate; 

樣本實施:

Map<int, String> ma = {0="a", 5="b"}; 

解析keyType現場效果很好,但怎麼做相同的valueType?它始終爲空。

回答

2

你的語法是假的。本質上你試圖使你的Map的實例成爲String的超類型實例。這將永遠不會工作,Xtext可能會顯示該語法的一些警告。

會發生什麼情況基本如下:

您定義的規則MapKeyDataType的數據類型的規則(參考文檔瞭解詳細信息)。也就是說,它的返回類型是String

您還定義了一個規則MapValueType,該規則代表MapKeyDataType。這意味着返回類型必須是返回類型MapKeyDataType的分配兼容(超類型)。它必須是String或它的一個超級類型,例如Object。現在您也可以從MapValueTypeMapCreateMapCreate反過來不會產生一個普通的字符串,但會產生MapCreate的實例。您的MapCreate和Java的String通常不是分配兼容的。 Xtext的類型推斷現在使MapKeyDataType不再返回String,而是聲明返回類型MapKeyDataType。但是,不會有任何實例,因爲它們從未實例化:解析器規則沒有任何分配。這就是爲什麼你的語法會在你身邊造成麻煩。

像這樣的東西可以清理一下一點點:

Map: 
    type = MapType name=ID '=' ...; 
MapType: 
    {MapType} name='Map' '<' keyType=PlainType ',' valueType=ValueType '>'; 
PlainType returns Type: 
    name = 'String' | name='int'; 
ValueType returns Type: 
    MapType | PlainType | ValuePlainType; 
ValuePlainType returns Type: 
    name='float';