有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaXTEXT解析EMF模型接口

我试图解析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进行同样的分析呢?它总是空的


共 (1) 个答案

  1. # 1 楼答案

    你的语法是假的。本质上,您试图使Map的实例成为String的超级类型。这是行不通的,Xtext可能会对这种语法给出一些警告

    发生的基本情况如下:

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

    您还定义了一个规则MapValueType,该规则将委托给MapKeyDataType。这意味着返回类型必须与返回类型MapKeyDataType的赋值兼容(超级类型)。它必须是String或其超类型之一,例如Object。现在您还可以从MapValueType委托给MapCreateMapCreate反过来不生成普通字符串,而是生成MapCreate的实例。您的MapCreate和Java的String通常不兼容赋值。Xtext的类型推断现在使MapKeyDataType不再返回字符串,而是声明返回类型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';