2013-07-18 25 views
0

我不太確定我瞭解xText中的範圍過程是如何工作的,它與幾個模型文件一起工作。 在一個文件中引用工作正常,只需要沿着ref=[referencedObject | ID]這一行指定一條規則,我就可以獲得自動完成以開箱即用;但是,我似乎無法訪問另一個文件中的任何EObject。我發現的信息並不是非常明確,我不明白我應該怎麼做才能使它工作...Xtext - 在不同文件中作用域

我試圖通過QualifiedName引用,但我根本沒有得到哪裏我應該讓參考實際發生 - 我的單獨文件如何互相訪問。

編輯:代碼

File returns File: 
    UIRule | EventRule 
; 

QualifiedName: 
    ID ('.' ID)* 
; 

/* First file */ 
UIRule returns Ui: 
    {Ui} 
    "ui" 
    (screens+=ScreenRule (screens+=ScreenRule)*)? 
; 

ScreenRule returns Screen: 
    name=ID "as" "screen" 
    '{' 
     (elements+=GUIElementRule)* 
    '}' 
; 
GUIElementRule returns Button: 
    name=ID "as" "element" 
; 


/* Second file */ 
EventRule returns Event: 
    {Event} 
    "event" 
    rules+=RuleRule* 
; 

RuleRule returns Rule: 
    "on" "{" on=ButtonPressRule "}" 
    "do" "{" do=ActionRule "}" 
; 

ButtonPressRule returns Pressed: 
    "press" "[" source=[GUIElement | QualifiedName] "]" 
; 
ActionRule returns Open: 
    "open" "[" screen=[Screen | QualifiedName] "]" 
; 

回答

0

有一個文件中的鏈接和不同文件之間的鏈接沒有任何區別:在兩種情況下,鏈接目的地的索引查找起來。所以通常這兩種情況沒有區別。順便說一句,手冊中的相關部分是Linking和(特別是)Scoping

我試過參考QualifiedName,但我根本沒有得到我應該讓參考實際發生的地方 - 我的單獨文件如何互相訪問。

你的語法的相關部分應該是這樣的(請注意ReferencedObject蓋):

ReferencedObject: 
    name=ID /* more stuff */; 

Something: 
    name=ID ref=[ReferencedObject | QN]; 

QN: 
    ID ('.' ID)*; 

只要ReferencesObjectname及其每個容器也有一個name attribut你需要被完成。我假設你沒有修改你的語言的ScopeProvider類。


編輯:

給出的語法是不正確的,而不是自給自足的。

  • 第一條規則不能QualifiedName數據類型的規則。這個語法不會編譯。

  • NavigationRule未使用且ActionRule未知。我假設爲了舉例,ActionRule可以替換爲NavigationRule

  • 完整EventRule部分未使用。因此,無論頂層規則是否丟失(請參閱第一點)語法根本不知道如何使用事件規則解析文件。當然,劃定範圍,並在不可分析文件crossreferencing很難;-)

所以:固定NavigationRule/ActionRule並使用以下規則作爲第一條規則後,我可以使用標準的產生與不修改插件來自的Xtext「看MyDSL」例如:

File: 
    ui = UIRule | event = EventRule 
; 

然後我可以開始編輯,寫這兩個文件(文件2的代碼完成和正確的建議):

文件1:

S1 as screen { 
    S1E1 as element 
    S1E2 as element 
} 

S2 as screen { 
    S2E1 as element 
    S2E2 as element 
} 

文件2:

on { press [ S1.S1E1 ] } 
do { open [ S2 ] } 

在第二個文件中的crossreferences都解決了:我可以按住Shift點擊S2S1.S1E1和的Xtext跳到定義。

所以,如果這不適合你,那麼你應該從一個乾淨的項目開始提供一個SSCCE例子,它適當地演示你的問題。

+0

這就是我已經做的,但我一定犯了一個錯誤,有些參考不起作用。 「無法解析對...的引用」錯誤,等等。 我想參考的對象有'name' A,它包含在對象B中,它自己在對象C(文件的根)內。 QualifiedName是否是C.B.A?根對象是否需要命名? 'ScopeProvider'尚未修改。 –

+0

@ S.W。首先:我修正了關於'QN'的語法。第二:你的例子的QualifiedName將是'C.B.A'。在不修改ScopeProvider的情況下,您必須使用該名稱作爲參考。您不需要命名根對象。除此之外:如果沒有更多的_code_就診斷問題是不可能的。自然語言描述不起作用。有關詳細信息,請參閱http://sscce.org/。 –

+0

我添加了一個代碼示例。第二個文件的引用都不起作用。 –