2

我需要构建一个包含交叉引用的语法,它可能是无效的,即指向一个不存在的目标。包含此类引用的文件不应产生错误,而只会产生警告。生成器会将其作为特殊情况处理。

我怎样才能用 XText 做到这一点?

4

2 回答 2

5

无法为 EMF 中不存在的目标创建有效的交叉引用。

我建议使用 EAttributes 而不是 EReferences:

  • 在 {YourDSL} 语法中通过feature=ID更改feature=[EClass|ID] 。
  • 提供一个范围计算实用程序,就像它在{YourDSL}ScopeProvider类的 *scope_EClass_feature(context, reference)* 方法中完成的那样。由于此范围方法仅使用给定参考的 eType,因此重新实现应该很简单。
  • 在{YourDSL}ProposalProvider中使用此范围计算实用程序来为引入的 EAttribute 建议值。
  • 或者,您可以在验证规则中使用此实用程序来向此 EAttribute 添加警告/信息(如果它不是“有效的”)。
  • 最后使用生成器中的实用程序根据有效的目标 eObjects 创建输出。
于 2012-12-01T18:56:25.973 回答
1

我在创建 DSL 时也遇到了这个问题,以便为转换阶段的非声明语言提供变量声明。这种方法有效,但问问自己是否真的想要那些讨厌的可能引用。

您只能在您的 UI 模块中删除自动生成的错误。为此,请提供ILinkingDiagnosticMessageProvider并覆盖函数getUnresolvedProxyMessage

class DSLLinkingDiagnosticMessageProvider extends LinkingDiagnosticMessageProvider {
    override getUnresolvedProxyMessage(ILinkingDiagnosticContext context) {
        if(context.context instanceof YourReference) {
            // return null so the your error is left out
            null
        } else {
            // use super implementation for others
            super.getUnresolvedProxyMessage(context)
        }
    }
}

YourReference将错过所有链接器错误。但请注意,将有一个所有 fealds 为空的虚拟引用对象。特别是名称丢失了,由于CyclicLinkingException. 但是您可以创建一个直接设置名称的新方法。

请注意,虚拟对象将具有您在语法中输入的类型。如果它的摘要你可以很容易地检查女巫参考没有链接。

于 2015-11-12T14:26:11.220 回答