2015-05-31 52 views
0

如果我有下面的輸入哪個實體進行交叉引用?

test = 3; //first 
test = test + 3; //second 

Declaration: 
    name=ID "=" DeclarationContent 
; 

    DeclarationContent: 
     number=INT ("+" DeclarationContent)? 
     | reference=[Declaration] ("+" DeclarationContent)? 
    ; 

,其聲明中引用參考(看在我的例子中,第二個聲明語法看起來像這樣(例如)解析)?換句話說,參考文獻"test"(第二個聲明)是指第一個聲明("test = 3;")或直接指向自身("test = test+ 3"),並且因此會是層次結構中的循環。

問候Krzmbrzl

回答

0

的Xtext將交叉引用[Declaration]始終鏈接到由給定的ID識別的第一elemenent。在你的榜樣hello + 3,背後hello交叉引用將解析到聲明hello 1行,但如果你有更多的然後一個元素相同(限定)名稱同一範圍內(能見度容器) Xtext將拋出一個異常。你應該

  1. 實現自己ScopeProvider(使用生成的存根在your.dsl.scoping.YourDslScopeProvider)來解決這個問題,或者
  2. 使用組成檢查自動驗證名稱。

    fragment = validation.JavaValidatorFragment auto-inject { 
        composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator" 
    }