gpt4 book ai didi

java - Xtext解析EMF模型接口(interface)

转载 作者:行者123 更新时间:2023-11-30 04:00:44 27 4
gpt4 key购买 nike

我正在尝试解析ecore模型。如果有接口(interface)链接字段,我无法访问它的实现值。

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 实例的父类(super class)型。这永远不会起作用,Xtext 可能会显示一些针对该语法的警告。

发生的情况基本上如下:

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

您还可以定义一个委托(delegate)给 MapKeyDataType 的规则 MapValueType。这意味着返回类型必须与 MapKeyDataType 的返回类型兼容(父类(super class)型)。它必须是 String 或其父类(super class)型之一,例如对象。现在,您还可以从 MapValueType 委托(delegate)给 MapCreateMapCreate 反过来不会生成纯字符串,而是生成 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';

关于java - Xtext解析EMF模型接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22047162/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com