簡體   English   中英

Xtext解析EMF模型接口

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM