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、2 つの可能な参照の可能性のうちの 1 つである単一のルールを使用する - しかし、これらはすべて Xtext によって拒否されます。これは実行可能ですか? もしそうなら、どのように?

(別の方法として、パラメーターと命令の両方を表す単一の要素を定義してから参照することも考えられますが、構文または命令全体をパラメーター リストに表示させずにそれを行う方法がわかりませんでした。 )

4

2 に答える 2

0

解決策を見つけました。私が推測したように、パラメーターと命令には共通の祖先が必要ですが、その祖先は実際には文法規則の右側に現れる必要はありません。だから私は定義しました:

ValueDef:
  Parameter | Instruction

その後

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

...そしてInstructionParameter自体のルールは変更されませんでした。つまり、パラメーターが期待される場所では命令が実行可能ではありませんが、両方ともValueDef参照を定義します。

于 2012-07-17T12:18:45.620 に答える
0

命令とパラメーターの両方に共通の祖先がある場合、その祖先を参照するルールを作成できます。

次に、いくつかのマイナーなバリデーター/コンテンツアシスト構成により、他の可能な構成を禁止できます。

これは、ダウンキャストされたバージョンの代わりにモデルで使用される基本クラスを導入するため、最も良い解決策ではありませんが、この問題を解決する他の方法は知りません。

于 2012-07-17T11:37:40.483 に答える