2017-05-31 45 views
0

我有一個父語法:的Xtext與規則ovewrite和語法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)

我需要做些什麼來擺脫錯誤?

回答

1

替代地可以導入超級語法元模型和CommonGreeting的類型設定爲Greeting

例如類型

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

CommonGreeting returns superdsl::Greeting: 
    LowerGreeting|OtherGreeting; 

這使得LowerGreetingGreeting

+0

LowerGreeting | OtherGreeting現在也可以在語法MySuperDsl使用時,可以將這些規則僅限於語法MyLowerDsl創建擴展? – Johan

+0

你是什麼意思?作爲交叉參考?您必須在scooeprovider內部過濾 –

+0

是作爲交叉參考。 – Johan

1

你的問題對不對?兩個例子中的CommonGreeting看起來都一樣。在第一種情況下,我認爲它應該是Greeting|LowerGreeting|OtherGreeting

Xtext推斷2個EMF模型,一個用於超文法,另一個用於較低語法。在推斷第二種情況時,您試圖改變第一種方法,例如爲超級文法的概念添加一個新的超類型。錯誤表示這個概念已經被推斷出來,不能改變。 您可以通過在超文法中引入CommonGreeting或通過定義您自己的EMF模型並將其同時用於語法而不是推斷來克服它。

+0

假設OtherGreeting亞型是正確的 – Johan