我有一个父语法:
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)
。
我需要做些什么才能摆脱错误?
答案 0 :(得分:2)
或者您可以导入超级语法元模型并将Greeting
的类型设置为import "http://www.spr.org/mydsl/MySuperDsl" as superdsl
CommonGreeting returns superdsl::Greeting:
LowerGreeting|OtherGreeting;
e.g。
LowerGreeting
这会使OtherGreeting
Greeting
和{{1}}个子类型生效
答案 1 :(得分:1)
你的问题是否正确?两个示例中CommonGreeting
看起来都一样。我认为在第一种情况下它应该是Greeting|LowerGreeting|OtherGreeting
。
Xtext推断出2个EMF模型,一个用于超语法,一个用于低语法。在推断第二个时,你试图改变第一个,就像在超语法的概念中添加一个新的超类型一样。该错误表明此概念已经推断并且无法更改。
您可以通过在超语法中引入CommonGreeting
或通过定义自己的EMF模型并使用语法而不是推断来克服它。