1

我正在尝试解析 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呢?它始终为空。

4

1 回答 1

2

你的语法是假的。本质上,您尝试使您Map的实例成为String. 这永远不会起作用,Xtext 可能会针对该语法显示一些警告。

发生的情况基本上如下:

您将规则定义MapKeyDataType为数据类型规则(有关详细信息,请参阅文档)。也就是说,它的返回类型是String.

您还定义了一个MapValueType委托给MapKeyDataType. 这意味着返回类型必须与返回类型的赋值兼容(超类型)MapKeyDataType。它必须是String其超类型之一或其中之一,例如Object. 现在您还委托 fromMapValueTypeMapCreateMapCreate反过来不会产生纯字符串,而是MapCreate. 您MapCreate和 JavaString通常不兼容分配。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';
于 2014-02-26T17:48:00.117 回答