2016-07-25 62 views
0

我是Xtext的新手。我用一個模型類在我的DSL這樣的:從Xtext導入Java類dsl

Model abc: 
variable1 
variable2 

和進口類這樣的:

import a.b.c 

我想要做的是,當我說進口美國廣播公司(這是一個Java類中相同的目錄)。編輯必須認識到這一點A.B.C類,並指這就像一個模型:

MODELNAME =類名

變量名=類中的變量。

我寫了一個不同的類,它獲取模型類中變量的引用。因此,如果我在該類中聲明variable1,並且在所有模型中沒有名爲variable1的變量,則會出現語法錯誤。它在dsl中編寫模型類時有效,但我無法使用導入類來完成。

感謝您的任何幫助。

+0

Sry基因,我不能跟着你的。你能給更多的上下文嗎? EG是一個語法和一個完整的模型 –

回答

0

這裏可能是一個起點

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.xbase.Xbase 

generate myDsl "http://www.xtext.org/example/mydsl/MyDsl" 

import "http://www.eclipse.org/xtext/common/JavaVMTypes" as types 

Model: 
    imports=XImportSection? 
    elements+=Element* 
    ; 

Element: 
    "element" "{" 
     "modelname" "=" type=JvmTypeReference 
     "variable" "names" "=" memberReferences+=MemberReference ("," memberReferences+=MemberReference)* 
    "}" 
; 

MemberReference: 
    member=[types::JvmField|ID] 
; 

並按照適應範圍提供商

package org.xtext.example.mydsl.scoping 

import org.eclipse.emf.ecore.EObject 
import org.eclipse.emf.ecore.EReference 
import org.eclipse.xtext.EcoreUtil2 
import org.xtext.example.mydsl.myDsl.Element 
import org.xtext.example.mydsl.myDsl.MyDslPackage 
import org.eclipse.xtext.scoping.IScope 
import org.eclipse.xtext.scoping.Scopes 
import org.eclipse.xtext.common.types.JvmDeclaredType 
import org.eclipse.xtext.naming.QualifiedName 

class MyDslScopeProvider extends AbstractMyDslScopeProvider { 

    override getScope(EObject context, EReference reference) { 
     if (reference == MyDslPackage.Literals.MEMBER_REFERENCE__MEMBER) { 
      val element = EcoreUtil2.getContainerOfType(context, Element) 
      if (element != null) { 
       val type = element.type.type 
       if (type instanceof JvmDeclaredType) { 
        return Scopes.scopeFor(type.declaredFields, [QualifiedName.create(simpleName)], IScope.NULLSCOPE) 
       } 
      } 
      return IScope.NULLSCOPE 
     } 
     super.getScope(context, reference) 
    } 

} 

方案提供商

class MyDslProposalProvider extends AbstractMyDslProposalProvider { 

    override protected isKeywordWorthyToPropose(Keyword keyword) { 
     true 
    } 

}