无法弄清楚 MPS 错误:“角色 X.Y 中的孩子不属于概念 X”

问题描述

我是 MPS 的新手,所以这可能是一个愚蠢的问题,但我在任何地方都找不到解决方案。

我正在定义两个 DSL,其中第一个将依赖于第二个。
我已经定义了第一语言的一部分,到目前为止还不错。
我有一堆概念,一些编辑器,约束等。

我已经创建了一个带有示例节点的模型,我可以在其中查看我所做的。

现在我正在研究第二种语言,我的方法与第一种语言完全相同。
我创建了一个可以作为 root 的概念。它被称为“模块”。
然后我定义了一个名为“IModuleContent”的接口概念,并将其作为子项交给了“模块”,将其称为“内容”并将基数设置为 [0..n]。
然后我定义了另一个从“IModuleContent”继承的名为“Interface”的概念。 我给了两个概念编辑器,现在基本上只是大括号。
在我的示例模型中,我用我的新语言创建了一个新节点。它给了我我的根,一个“模块”。因为它是一个命名概念,所以我给它起了个名字。然后,在模块的大括号内,我声明了一个新的“接口”。
在一起,它看起来像这样:

Module printeri {
  Interface printer {
  }
}

这一切几乎都有效,除了在给“模块”一个“接口”(即“打印机”)的实例作为变量之后,它会用红色下划线并显示错误

"Child in the role Module.content does not belong to the concept Module"

但是,我很确定它确实如此。所有的概念都在新语言的结构中,我相信一切都是以正确的方式继承的。我用我的母语做了几乎同样的事情,而且效果很好。
这是怎么回事?

编辑:应该指定我使用的是 2020.3 版

解决方法

如果您认为 MPS 的行为很奇怪,您可以转到“文件 -> 使缓存无效并重新启动”。 对我来说,您似乎做了一些更改,例如在您的示例中创建“模块”节点,然后更改结构,例如删除“内容”子项并重新添加它。这里的问题是 MPS 不解析基于 id 的而不是基于名称的。通过删除并重新添加成员定义,您可以更改 id。 MPS 能够在一定程度上处理此类变化,例如只需按“F5”即可刷新编辑器。您也可以点击节点并通过“ALT+ENTER”打开意图菜单,调查那里建议的选项。

希望这些背景知识能帮助你解决未来的问题:)

最好的问候 黑子

这里的评论功能似乎有问题,hi 删除了“Hi Noah”

,

好的,看来错误在一夜之间神奇地消失了。

昨天我关闭了当天的 MPS,今天早上又打开了。
代码完成不起作用。很烦人。所以我重新启动了 MPS。

在第二次尝试代码完成工作时,之前的错误消失了。
好像 MPS 可能有点不稳定。

是的,对于任何遇到相同问题的人:
试试旧的“关闭再打开”方法。