4

文法定義を再利用したいと思います。

私はこのような文法を持っています:

Person:
  'contact' name=ID '{'
    'phone' phone=INT
  '}'
;

次のような別の文法が必要です。

include "uri/to/other/project/to/other/grammar/definitions"

Call:
  'call' person=Person
;

Personは、2 番目の文法では認識されません。したがって、XtextPersonは最初の文法の定義を 2 番目の文法に挿入または含めることができますか?

次のステップは、 の生成ですPerson。私もそれを達成する方法を知りたいです。

4

2 に答える 2

4

解決策を見つけました。ターミナルを含めるために使用されるキーワード「with」を使用できます。

必要な手順:

  1. Xtext プロジェクト com.mydsl.A (A) および com.mydsl.B (B) を作成します。
  2. A の文法を書く
  3. B の META-INF/MANIFEST に依存関係として A を追加
  4. B.ui の META-INF/MANIFEST に依存関係として A.ui を追加
  5. B のワークフローに A の genmodel の登録を次のように追加します。 registerGenModelFile = "platform:/resource/A/src-gen/path/to/A.genmodel"
  6. B の最初の行をgrammar B with A
  7. 文法 B を書きながら、A の EClasses を使用できるようになりました

with複数の文法を含めるために使用することはできないため、終端の定義は A に記載する必要があります。

生成は B の IGenerator で実行されますが、A の Generator を拡張すると、A の EClasses の生成を再利用できます。

提案、検証などのクラスは A の対応するクラスによって拡張されるため、このアプローチは一種の継承です。多重継承がサポートされているかどうかはわかりませんでした。後にコンマを配置できますwith Aが、機能しません。

于 2013-05-09T09:54:10.040 に答える