【问题标题】:XText: permit invalid cross referenceXText:允许无效的交叉引用
【发布时间】:2012-11-29 20:32:51
【问题描述】:

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

如何使用 XText 做到这一点?

【问题讨论】:

    标签: reference grammar xtext cross-reference


    【解决方案1】:

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

    我建议使用 EAttributes 而不是 EReferences:

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

    【讨论】:

      【解决方案2】:

      我在创建 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,您无法设置它。但是您可以创建一个直接设置名称的新方法。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多