![](/img/trans.png)
[英]How to get notifications when xtext's EMF model changes with proper values
[英]Xtext parse EMF model interface
我正在嘗試解析ecore模型。 如果有一個接口鏈接字段,我將無法訪問它的實現值。
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
進行相同操作? 它始終為空。
您的語法是虛假的。 本質上,您嘗試使Map
的實例成為String
實例的超類型。 那將永遠行不通,Xtext可能會對該語法顯示一些警告。
基本上會發生以下情況:
您將規則MapKeyDataType
定義為數據類型規則(有關詳細信息,請參閱文檔)。 也就是說,其返回類型為String
。
您還定義了一個規則MapValueType
,它委派給MapKeyDataType
。 這意味着返回類型必須與MapKeyDataType
的返回類型是賦值兼容的(超類型)。 它必須是String
或其超級類型之一,例如Object
。 現在,您還可以從MapValueType
委托給MapCreate
。 反過來, MapCreate
不會產生純字符串,而是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';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.