具有规则覆盖和语法继承的 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
的 LowerGreeting
和 OtherGreeting
子类型
我有一个父语法:
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
LowerGreeting
和 OtherGreeting
子类型