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 拒绝。这是可行的,如果可行,怎么做?

(我想另一种方法是定义一个代表参数和指令的单个元素,然后引用它,但如果不允许语法或整个指令出现在参数列表中,我无法弄清楚如何做到这一点)

4

2 回答 2

0

如果指令和参数都有一个共同的祖先,那么您可以编写一个引用该祖先的规则。

然后一些次要的验证器/内容辅助配置,您可以禁止任何其他可能的配置。

这不是最好的解决方案,因为它引入了一个基类,用于模型而不是向下转换的版本,但我不知道解决这个问题的任何其他方法。

于 2012-07-17T11:37:40.483 回答
0

我找到了解决方案。正如我所怀疑的,参数和指令必须有一个共同的祖先——但这个祖先实际上不必出现在任何语法规则的右侧。所以我定义:

ValueDef:
  Parameter | Instruction

进而

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

... 和本身的规则Instruction保持Parameter不变。这意味着指令在需要参数的地方不可行,但两者都定义了ValueDef引用。

于 2012-07-17T12:18:45.620 回答