具有规则ovewrite和语法固有的Xtext

时间:2017-05-31 19:44:10

标签: parsing xtext

我有一个父语法:

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)

我需要做些什么才能摆脱错误?

2 个答案:

答案 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模型并使用语法而不是推断来克服它。