我正在编写一个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 :(得分:0)
如果指令和参数都有一个共同的祖先,那么你可以编写一个引用该祖先的规则。
然后,您可以禁止任何其他可能的配置。
这不是最好的解决方案,因为它引入了一个基类,在模型中使用而不是下载版本,但我不知道任何其他方法来解决这个问题。
答案 1 :(得分:0)
我找到了解决方案。我怀疑,参数和指令有有一个共同的祖先 - 但是祖先并不一定要出现在任何语法规则的右边。所以我定义了:
ValueDef:
Parameter | Instruction
然后
Instruction:
name=Value '=' 'eat' '(' ref=[ValueDef|Value] ')'
... Instruction
和Parameter
本身的规则保持不变。这意味着在预期参数的情况下,指令不可行,但两者都定义了ValueDef
个引用。