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 楼答案
你的语法是假的。本质上,您试图使
Map
的实例成为String
的超级类型。这是行不通的,Xtext可能会对这种语法给出一些警告发生的基本情况如下:
将规则
MapKeyDataType
定义为数据类型规则(有关详细信息,请参阅文档)。也就是说,它的返回类型是String
您还定义了一个规则
MapValueType
,该规则将委托给MapKeyDataType
。这意味着返回类型必须与返回类型MapKeyDataType
的赋值兼容(超级类型)。它必须是String
或其超类型之一,例如Object
。现在您还可以从MapValueType
委托给MapCreate
MapCreate
反过来不生成普通字符串,而是生成MapCreate
的实例。您的MapCreate
和Java的String
通常不兼容赋值。Xtext的类型推断现在使MapKeyDataType
不再返回字符串,而是声明返回类型MapKeyDataType
。不过,不会有任何实例,因为它们从未被实例化:解析器规则没有任何赋值。这就是为什么你的语法会给你带来麻烦像这样的东西可以稍微清理一下: