MPS 2024.3 ヘルプ

ジェネレーターユーザガイド Demo5

Generator ユーザーガイドデモ 5

このデモでは、生成スクリプトユーティリティクラスの使用方法を学習します。

生成スクリプトには、pre-processing スクリプトと post-processing スクリプトの 2 種類があります。

前処理スクリプトは、ジェネレータールールを適用する前に呼び出され、通常、ルールによるさらなる処理を容易にする方法で入力モデルを変更します。

後処理スクリプトは、すべてのジェネレータールールが終了した後に呼び出され、出力モデルに適用されます。

さらに、ジェネレーターに複数のスクリプトがある場合、スクリプトが実行される順序に影響を与えることができます。

新しい言語

まず、demoLang4 言語の正確なコピーから始めます。

  • 新しい言語「generator_demo.demoLang5」を作成します

  • 言語プロパティダイアログで拡張言語を追加します:「jetbrains.mps.sampleXML」と「jetbrains.mps.baseLanguage」

  • この言語の新しいジェネレーターが作成されていない場合は作成します。詳細については、デモ 1 を参照してください。

  • demoLang5 ジェネレーターから(空の)マッピング構成 'main' を削除します

  • demoLang4 ジェネレーターから demoLang5 ジェネレーターにすべてのノードをコピーして貼り付けます

新しいテストモデル

  • 「test_models」ソリューションで、モデル「test4」を「test5」に複製します

  • モデルプロパティダイアログで、「生成中」言語の demoLang4 -> demoLang5 を置き換えます。詳細については、デモ 2 を参照してください。

  • モデル「test5」で「Panel」ドキュメントを開きます

  • 'panel' 要素にテキストノードを追加します。

gde1.png

前処理スクリプト

demoLang5 ジェネレーターはテキストノードをサポートしていませんが、このコンテキストのテキストノードは、'text' 属性が設定された 'label' 要素と同じ意味を持ちます。ジェネレーターにルールを追加する代わりに、入力モデルのすべてのテキストノードを「ラベル」要素に変換し、既存のルールに残りの作業を行わせる前処理スクリプトを追加します。

  • demoLang5 ジェネレーターがタイプマッピングスクリプトのルートノードを作成する場合、「main @ generator」モデル

  • 「fix_text」という名前を付けます

  • スクリプト種類の設定 = 前処理入力モデル

  • set は、model = true を変更します。これは、スクリプト内で入力モデルを変更するためです。

  • コードを入力します。これにより、入力モデル内のすべてのテキストノードの検索と置換が実行されます。

gde2.png
  • 「fix_text」スクリプトをマッピング構成「main」に前処理スクリプトセクションに追加します。

gde3.png

最初のテスト

言語を再構築し、「test5」モデルから生成されたテキストをチェックアウトします。

gde5.png

'Hello everybody' のテキスト用にラベルが正しく作成され、パネルにラベルが追加されていることがわかります。

Generator のユーティリティクラス

ここで、生成されたテキストで発生する可能性のある構文エラーとスタイルエラーを修正するアイデアを得たとしましょう。そのために post-processing スクリプトを作成します。これらの NLP アルゴリズムは非常に複雑になる傾向があるため、スクリプトに直接埋め込むのではなく、別のユーティリティクラスで開発してみましょう。

ここでの問題は、ユーティリティクラスをジェネレーターモデル 'main@generator' 内に直接作成できないことです。これは、ユーティリティクラスが、任意の 'generator'-stereotyped モデル内の他のルートノードと同様に、ルートテンプレートとして扱われるためです。

ジェネレーターモジュールで別のモデルを作成する必要があります。

  • ツリーでジェネレーターノード(demoLang5 ジェネレーター)を選択し、ポップアップメニューで新規 -> モデルを選択します。

gde6.png
  • 新しいモデル名を付けます: 「util」:

newModelUpdated101.png
  • ステレオタイプのテキストフィールドを必ずクリアしてください

  • モデル「util」でクラス「TextUtil」を作成

  • 静的メソッド「fixText()」をクラス「TextUtil」に追加します。

gde8.png

post-processing スクリプトで 'fixText()' メソッドを呼び出し、出力モデルをパラメーターとして渡します。出力モデルには、クラス、メソッド、式などが含まれます。ここでは java のような構文ツリーを操作しています。

「fixText()」メソッドは、「MPS」で始まるすべての文字列を「JetBrains MPS」で始まる文字列に置き換えます。

後処理スクリプト

これで、後処理スクリプトでこのユーティリティメソッド「fixText()」を使用できます。

  • モデル 'main @ generator'(demoLang5 ジェネレーター内)で新しいマッピングスクリプトを作成します

  • 「refine_text」という名前を付けます

  • 「generator_demo.demoLang5.generator.util」モデルをモデル「main@generator」にインポートします。モデルのインポートの詳細については、デモ 1 を参照してください。

    gde10.png
  • 「refine_text」マッピングスクリプトで、次のようにコードを入力します。

gde11.png
  • 「refine_text」スクリプトをマッピング構成「main」の後処理スクリプトセクションに追加します。

gde12.png

ジェネレーターを再構築します。

Ctrl/Cmd-F9 を使用できます(モジュール内のすべての変更されたモデルを生成します)。Shift-F9 (現在のモデルを生成)では、生成が必要なモデルが 2 つあるため、これ以上十分ではないことに注意してください。

セカンドテスト

モデル「test5」を生成し、生成されたテキストをプレビューします。

gde13.png

ラベルに「JetBrains MPS」というテキストが含まれていることに注意してください。

関連ページ:

ジェネレーターユーザガイド Demo1

Generator ユーザーガイドのデモ 1:このデモでは、入力 XML ドキュメントごとに java アプリケーションを生成するジェネレーターを作成します。以前に作成したソリューション「test_models」で「generator_demo.test1」モデルを再利用します。このモデルは「jetbrains.mps.sampleXML」言語を使用し、「ボタン」と「ラベル」の 2 つの XML ドキュメントを含みます。出力 java アプリケーションを生成するために、これらの各ドキュメントにル...

ジェネレーターユーザガイド Demo2

Generator ユーザーガイドデモ 2:このデモでは、Java Swing アプリケーションを再度生成しますが、前のデモ 1 とは異なり、今回は入力モデルごとに 1 つの Java アプリケーションになります(デモ 1 では、入力 XML ドキュメントごとに個別の Java アプリケーションを生成しました)。デモ 2 が作成する単一の Java アプリケーションには、入力モデルのすべての XML ドキュメントに記載されているすべてのコンポーネントが含まれます。新しい言語:最初に少し技術的な...

ジェネレーターユーザガイド Demo4

Generator ユーザーガイドデモ 4:このデモでは、demoLang3 ジェネレーター (デモ 3 を参照) をさらに進化させ、パネルコンポーネントのサポートを追加します。ボタンやラベルとは異なり、パネルには他のパネルを含む他のコンポーネントを含めることができます。ジェネレーターで再帰が発生します。削減がこの種の問題の解決にどのように役立つかを見ていきます。新しい言語:demoLang4 の demoLang3 ジェネレーターの大部分を再利用します。新しい言語「generator_demo...

ジェネレーターユーザガイド Demo6

Generator ユーザーガイドデモ 6:このデモは、おそらくすべてのデモの中で最もエキサイティングなものです。ここでは、この言語が実際にいくつかの高レベルの概念を定義するという意味で、「実際の」言語を作成するためです。また、この DSL を既存の言語(「jetbrains.mps.sampleXML」および「generator_demo.demoLang5」(デモ 5 で以前に作成))と簡単に統合できることも確認します。核となるアイデア:テストモデルに XML 要素を入力するためのより便利な...