2012-07-17 24 views
0

我在寫一個Xtext語法,我想支持在我的目標語言中使用變量或參數的交叉引用。我怎樣才能寫出對兩件事之一的引用?

所以目標語言看起來像:

function(p1) { 
    x1 = eat(p1) // line 1 
    x2 = eat(x1) // line 2 
} 

就因爲這一點,我已經定義:

Instruction: 
    name=Value '=' 'eat' '(' ref=[Instruction|Value] ')' 

這適用於第2行,但沒有第1行,因爲一個參數是不是指令。我試圖將其定義爲:

Instruction: 
    name=Value '=' 'eat' '(' ref=([Instruction|Value] | [Parameter|Value]) ')' 

或者這個的各種變化 - 例如,使用單一的Ref規則可能是兩種可能的參考可能性之一 - 但所有這些都被Xtext拒絕。這是可行的,如果是這樣,如何?我想另一種方法是定義一個代表參數和指令的單個元素,然後引用它,但我不知道如何做到這一點,而不允許語法或整個指令出現在參數列表中)

回答

0

我找到了解決方案。正如我懷疑的那樣,參數和指令有一個共同的祖先 - 但祖先不必實際出現在任何語法規則的右側。所以我定義:

ValueDef: 
    Parameter | Instruction 

然後

Instruction: 
    name=Value '=' 'eat' '(' ref=[ValueDef|Value] ')' 

...和Instruction規則和Parameter自己都保持不變。這意味着一個指令在預期參數的情況下不可行,但都定義了ValueDef引用。

0

如果指令和參數都有一個共同的祖先,那麼您可以編寫一個引用該祖先的規則。

然後,一些小的驗證器/內容輔助配置可以禁止任何其他可能的配置。

這不是最好的解決方案,因爲它引入了一個基類,用於模型而不是降級版本,但是我不知道解決此問題的其他方法。

+0

我還沒有深入研究xtext的代碼,只有語法到目前爲止,但如果你描述的是唯一的解決方案,那麼它看起來像我沒有選擇。 – Oak 2012-07-17 11:39:52