【问题标题】:Validating unique names for strings and optional reference验证字符串和可选引用的唯一名称
【发布时间】:2015-08-21 15:31:26
【问题描述】:

XText 新手,我正在努力解决以下 MWE 语法的两个问题。

Metamodel:
    (classes += Type)*
;

Type:
    Enumeration | Class
;


Enumeration:
    'enumeration' name = ValidID '{' (literals += EnumLiteral ';')+ '}'
;
EnumLiteral:
    ValidID
;


Class:
    'class' name = ValidID '{'
        (references += Reference)*
'}'
;

Reference:
    'reference'  name = ValidID ':' type = Class ('#' opposite = [Reference])?
;

所以我的问题是:

  1. 由于枚举字面量列表是ValidID,它似乎是用EStrings来表示的。该文档似乎没有处理 ECore 中原始类型的情况。如何检查文字中的非重复项,并在编辑器中充分报告(即错误应该在第一次出现重复的文字时)?

  2. 尽管我尽了最大努力,我还是无法为相反的参考编写自定义范围。由于 XText 使用反射来检索作用域方法,我怀疑我没有正确的方法:我试过 def scope_Reference_opposite(Reference context, EReference r),对吗?非常感谢一个例子,我相信我可以轻松地适应我的“真实”DSL。

非常感谢您的帮助,您将节省我大量时间在文档中一次又一次地寻找解决方案...

【问题讨论】:

    标签: xtext


    【解决方案1】:
    1. 错误可以附加到多值特征的某个索引。为 Enumeration 类型编写验证并检查重复的文字列表。将错误附加到列表中的索引。
    2. 签名正确。您是否导入了正确的“参考”,或者您是否偶然使用了具有相同简单名称的其他类。另请注意,您的语法对于参考的类型似乎是错误的。这应该是type=[Class] 或更可能是type=[Class|ValidID]。 如果您打算使用或已经使用 Xbase,情况可能会有所不同。 Xbase 不使用反射范围提供程序。

    【讨论】:

    • 感谢@Sebastian 的回答。我将尝试您对问题 1 的建议。对于问题 2:我小心不要导入错误的 Reference。该语言是 OMG MOF 的简化版本:Reference 的对立面是在Reference 的类型范围内的Reference(即Class)。我没有得到你关于 XBase 的评论:我实际上在 DSL 的其他部分使用它(示例被简化为构成 MWE)但它具体有什么影响?
    • Xbase 不使用反射范围提供程序,因此如果您使用 Xbase,我怀疑您的范围提供程序是否被使用。
    • 感谢您的提示,您说的完全正确。为了让我的完整 DSL 正常工作,我苦苦挣扎了大约一周……看来您无法使用 my.dsl.definition.validation 包中的 Xtend 代码。很奇怪。不过,不知道是否有解决方法,否则我最终将重新发明 XBase 的大部分......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    相关资源
    最近更新 更多