![](/img/trans.png)
[英]How to get notifications when xtext's EMF model changes with proper values
[英]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.