繁体   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