2014-01-23 165 views
3

例如的Xtext:DSL參考屬性

我有這樣一個文法:

Bundle: 
    'Bundle' 
    name= ID '{' 
    car+=Car+ 
    service +=Service* 
    '}' 
    ; 

Car: 
    'Car' 
    name=ID 
    extra+=Extra* 
    '}' 
; 

Extra: 
    name= ID '=' type=STRING 
; 

Service: 
    'Service' att=STRING 'for' ref+=Reference* 
; 

Reference: 
    //Ref to car oder Ref to Car.Extra 
; 

在我的模型我想創建一個Service像:

Service "ServiceName" for car1 
Service "ServiceName" for car2 (extra1 extra2) 

哪有我解決了對Car的參考Extras

回答

4

這可以用簡單的跨裁判

Service: 
    'Service' att=STRING 'for' car=[Car] ('(' extras+=[Extra]+ ')')? 
; 

和相應的範圍內提供

package org.xtext.example.mydsl.scoping 

import org.eclipse.emf.ecore.EReference 
import org.eclipse.xtext.scoping.IScope 
import org.eclipse.xtext.scoping.Scopes 
import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider 
import org.xtext.example.mydsl.myDsl.Service 

class MyDslScopeProvider extends AbstractDeclarativeScopeProvider { 

    def IScope scope_Service_extras(Service ctx, EReference ref) { 
     return Scopes.scopeFor(ctx.car.extra) 
    } 

} 
+0

感謝的作品很好做!很好的解決方案! – JavaNullPointer