具有规则覆盖和语法继承的 Xtext

Xtext with rule ovewrite and grammar inheretance

我有一个父语法:

grammar org.spr.mydsl.MySuperDsl with org.eclipse.xtext.common.Terminals
generate mySuperDsl "http://www.spr.org/mydsl/MySuperDsl"
SuperModel:
    greetings+=Greeting*;   
Greeting:
    'Hello' name=ID '!';

和一个儿童语法:

grammar org.lwr.MyLowerDsl with org.spr.mydsl.MySuperDsl
generate myLowerDsl "http://www.lwr.org/MyLowerDsl"
LowerModel:
    lower_greetings=LowerGreeting
    other_gretting=OtherGreeting
    super_greetings=Greeting
    refname=[CommonGreeting];   
LowerGreeting:
    'Lower Hello' name=ID '!';
OtherGreeting:
    'Other Hello' name=ID '!';  
CommonGreeting:
    LowerGreeting|OtherGreeting;    

和两个语法工作。当规则

CommonGreeting:
    LowerGreeting|Greeting|OtherGreeting;

被用来代替规则给出一个错误并且在 mw 工作流程的执行期间。错误是 Cannot add supertype 'CommonGreeting' to sealed type 'Greeting'. (ErrorCode: CannotCreateTypeInSealedMetamodel).

我需要做什么才能消除错误?

你的问题正确吗? CommonGreeting 在两个示例中看起来相同。我认为在第一种情况下应该是 Greeting|LowerGreeting|OtherGreeting

Xtext 推断出 2 种 EMF 模型,一种用于上层文法,一种用于下层文法。在推断第二个过程中,您正在尝试更改第一个,例如将新的超类型添加到超语法的概念中。错误说这个概念已经推断出来了,不能改变。 您可以通过在超级语法中引入 CommonGreeting 或定义您自己的 EMF 模型并同时使用这两种语法而不是推断来克服它。

或者您可以导入超级语法元模型并将 CommonGreeting 的类型设置为 Greeting

的类型

例如

import "http://www.spr.org/mydsl/MySuperDsl" as superdsl

CommonGreeting returns superdsl::Greeting:
    LowerGreeting|OtherGreeting;

这使得 Greeting

LowerGreetingOtherGreeting 子类型