MPS 2019.2ヘルプ

生成プログラム

導入

Generatorは、言語仕様の一部であり、言語の概念の表示(英語)セマンティクスを定義します。

MPSはモデル間変換アプローチに従います。MPSジェネレータは、入力言語でエンコードされた構成から出力言語でエンコードされた構成への変換を指定します。モデル間変換のプロセスには多くの中間モデルが含まれ、最終的にはsn 出力モデルが生成されます。このモデルでは、すべての構成はすでに意味が別の場所で定義されている言語になります。

たとえば、baseLanguageのほとんどの概念(クラス、メソッドなど)は「マシンで理解可能」であるため、baseLanguageが出力言語としてよく使用されます。

ターゲットアセットは、出力言語でサポートされている必要があるモデルからテキストへの変換を適用して作成されます。モデルからテキストへの変換を定義するための言語の側面TextGenと呼ばれ、コンセプトのエディターの別のタブとして利用できます。MPSは生成されたアセットの破壊的な更新のみを提供します。

たとえば、baseLanguageTextGenアスペクトは次の場所に*.javaファイルを生成します。
< ジェネレータ出力パス > \ < モデル名 > \ <クラス名> .java
ここで、
ジェネレーター出力パス - 入力モデルを所有するモジュールで指定されています。
モデル名 - 「。」を置き換えることによって作成されたパスセグメントです。入力モデルの名前にはファイル区切り文字を使用します。

概要

ジェネレーターモジュール

他の言語の側面とは異なり、ジェネレータの側面は単一のモデルではありません。ジェネレーター仕様は、実用新案だけでなく多くのジェネレーターモデルを含むことができます。ジェネレーターモデルには、テンプレートマッピング構成、およびその他のジェネレータ言語の構成が含まれています

ジェネレーターモデルは、モデルステレオタイプ - ' generator '(モデル名の後に< name > @ generatorと表示されています )によって通常のモデルと区別されます。
下のスクリーンショットは、例としてsmodel言語のジェネレータモジュールを示しています。

gug generator module

新しいジェネレータを作成する

言語のポップアップメニューの新規->ジェネレーターコマンドを使用して新しいジェネレータが作成されます。

技術的には、1つの言語に対して複数のジェネレータを作成することは可能ですが、これを書いている時点ではMPSはこの機能を完全にはサポートしていません。そのため、言語には通常1つの(またはなしの)ジェネレータしかありません。そのため、ジェネレータの名前は重要ではありません。MPS GUIのどこでもジェネレータモジュールはその言語名で識別できます。

新しいジェネレータモジュールを作成するとき、MPSは空のマッピング設定ノードを含むジェネレータモデル 'main @ generator'も作成します。

ジェネレーターのプロパティー

モジュールとして、generatorは他のモジュールに依存したり、言語使ったり、devkits使ったりしましたモジュールメタ情報を参照)。

ジェネレータのプロパティーダイアログには、2つの追加プロパティーがあります。

  • ジェネレータに依存 - 他のジェネレータへの依存関係を指定します。これにより、従属ジェネレータは別のジェネレータで定義されたテンプレートを参照することができます。

  • マッピング制約 - マッピング規則間の優先順位関係を指定できます。そのような関係が他のジェネレータルールを含む場合、そのジェネレータへの依存関係を宣言することも必要です。

ジェネレーター

MPSジェネレータエンジン(またはジェネレータ言語ランタイム)は変換の実行に混合コンパイル/解釈モードを使用します。

テンプレートは実行時に解釈および入力されますが、ルール、マクロ、およびスクリプト内のすべての関数は事前にコンパイルされている必要があります。

混乱を避けるために、必ずこの規則に従ってください。ジェネレータモデルを変更した後は、モデルを再生成する必要があります。(Shift+F9)。Ctrl+F9を使用することをお勧めします。これにより、ジェネレータモジュール内のすべての修正モデルが再生成されます。

変換

変換はテンプレートによって記述されます。テンプレートは出力言語を使って書かれているため、通常その言語で '通常のコード'を書くのに使われるのと同じセルエディターで編集することができます。追加の労力なしで、「テンプレートエディター」は、構文/エラーの強調表示、自動補完など、すぐに同じレベルのツーリングをサポートします。テンプレートは、入力モデルを参照することによってパラメータ化されます。

個々のテンプレートの適用性は#ジェネレータルールによって定義され、それらは#マッピング設定に分類されます。

マッピング設定

マッピング設定は最小単位で、単一の生成ステップを形成できます。これは#ジェネレータルールを含み、マッピングラベルを定義し、プレ後処理スクリプトを含みます。

ジェネレータルール

各変換の適用可能性は生成規則によって定義されます。
ジェネレータルールには6種類あります。

  • 条件付きルート規則

  • ルートマッピング規則

  • 製織規則

  • 削減ルール

  • パターンルール

  • ルートルールを放棄する

  • 属性ルールの削除 ( 3.3の新機能 )

各ジェネレータルールは、前提結果から構成されます(ユーザが指定できない事前定義済みの結果を伴う、破棄ルートルールドロップ属性ルールを除く)。

条件付きルート規則を除くすべての規則には、その前提内に入力ノードの概念(または単に入力概念)への参照が含まれています。すべてのルール前提には、オプションの条件関数も含まれています。

ルール結果には通常、外部テンプレート (つまり、同じモデルまたは異なるモデルでルートノードとして宣言されたテンプレート)への参照、またはいわゆるインラインテンプレート(条件付きルートルールおよびルートマッピングルールは外部テンプレートへの参照しか持てません)が含まれます。結果には他にもいくつかのバージョンがあります。

次のスクリーンショットは、ジェネレータモデルの内容とマッピング設定の例を示しています。

gug mapping configuration

マクロ

テンプレート内のコードはマクロを通してパラメータ化することができます。ジェネレータ言語は3種類のマクロを定義します。

  • プロパティーマクロ - プロパティー値を計算します。

  • 参照マクロ - 参照のターゲット(ノード)を計算します。

  • ノードマクロ - 生成時にテンプレートの埋め込みを制御するために使用されます。ノードマクロにはいくつかのバージョンがあります。- LOOPマクロはその一例です。

マクロは特別な種類のいわゆる注釈概念を実装しており、テンプレートコード内で(マクロの種類に応じて)プロパティーセル、参照セル、またはノードセルをラップできます。

コードの折り返し(つまり、新しいマクロの作成)は、Ctrl+Shift+Mを押すか、または 'Create macro' インテンションを適用することによって行われます。

次のスクリーンショットは、プロパティーマクロの例を示しています。

gug property macro sample

マクロ機能やその他のパラメータ設定オプションは、インスペクタビューで編集します。たとえば、プロパティーマクロでは、生成時にプロパティーの値を提供するvalue関数を指定する必要があります。上記の例では、出力クラスノードは、入力ノードと同じ名前になります

ジェネレータ言語のすべての関数のノードパラメータは常に、変換が現在適用されているコンテキストノード( 入力ノード )を表します

いくつかのマクロ(LOOPおよびSWITCHマクロなど)は入力ノードを新しいものと置き換えることができるため、後続のテンプレートコード(たとえばそれらのマクロによってラップされるコード)は新しい入力ノードに適用されることになる。

外部テンプレート

外部テンプレートは、ジェネレータモデルのルートノードとして作成されます。

MPSには2種類の外部テンプレートがあります。

その1つがルートテンプレートです。ジェネレータモデルで作成されたルートノードは、このノードがジェネレータ言語の一部でない限り、ルートテンプレートとして扱われます(つまり、マッピング設定はルートテンプレートではありません)。ルートテンプレートは通常のルートノードとして作成されます(モデルのポップアップのルートノードを作成するメニューを介して)。

次のスクリーンショットは、ルートテンプレートの例を示しています。

gug root template sample

このルートテンプレートは入力ノード(文書)をクラスbaseLanguage )に変換します。ルートテンプレートヘッダは作成時に自動的に追加されますが、入力ノードの概念はユーザによって指定されます。

MPSはマクロ関数のコード内で静的型チェックを実行できるため、入力の概念を指定することをお勧めします。

ルートテンプレート(参照)は、条件付きルート規則およびルート・マッピング規則の結果として使用できます。(条件付きルートルールで使用されている場合、入力ノードは利用できません)。

2番目の種類のテンプレートはジェネレータ言語で定義されており、その概念名は 'TemplateDeclaration' です。それはルートノードを作成するメニューの 'テンプレート宣言'アクションを通して作成されます。

gug new template declaration menu

次のスクリーンショットはテンプレート宣言の例を示しています。

gug template declaration sample

実際のテンプレートコードはテンプレートフラグメントに 「ラップ」されています。テンプレートフラグメントの外側のコードは変換に使用されず、コンテキストとして機能します(たとえば、Javaクラスを持つことはできますが、そのメソッドの1つだけをテンプレートとしてエクスポートできます)。

テンプレート宣言はヘッダで宣言されたパラメータを持つことができます。パラメータは#generationコンテキストを通してアクセス可能です。

テンプレート宣言は編むこと、減少およびパターン規則の結果として使用されます。これはINCLUDE-macroに含まれるテンプレートとして(パラメータのないテンプレートに対してのみ)、あるいはCALL-macroの呼び出し先としても使われます。

テンプレートスイッチ

テンプレートスイッチは、テンプレートコードの特定の場所で2つ以上の代替変換が可能な場合に使用されます。その場合、選択肢を許可するテンプレートコードは、SWITCHマクロにラップされています。これはテンプレートスイッチを参照しています。Template Switchはルートノードを作成するメニューを介してジェネレータモデルのルートノードとして作成されます(このコマンドは上の 'menu' スクリーンショットで見ることができます)。

次のスクリーンショットは、テンプレート切り替えの例を示しています。

gug template switch sample

Antから生成する

Ant MPSジェネレータタスクは、ビルドスクリプトから設定可能なプロパティー(パラレル、スレッド、インプレース、警告)を公開します。ビルド言語は、ビルドプロセス中にモデルを変換するために、Ant Generateタスクを使用します。このタスクは今ジェネレーター設定ページからおなじみのパラメータを公開します:

  • 厳格生成モード
  • 構成可能な数のスレッドによる並列生成
  • インプレース変換を有効にするオプション
  • 生成警告/エラーを制御するオプション

これらのオプションは BuildMps_GeneratorOptions の概念を使用してビルド言語でも公開されているため、ビルドスクリプトでプロセスをより細かく制御できます。

サンプル

さらに実用的な経験が必要なときは、ジェネレータデモをチェックしてください。
デモには、上記のすべての概念の使用例が含まれています。


最終更新日: 2019年8月30日

関連ページ:

ジェネレータークックブック

この文書は、MPSジェネレータに関する最も一般的な質問に対する回答を提供することを目的としています。代わりにジェネレータのドキュメントを調べてジェネレーターデモをチェックすることもできます。ジェネレータはどのようにルールを処理しますか?、一つの言語に対してさらに多くのジェネレータを使うことができます...

TextGen

TextGen 言語アスペクト:導入TextGen言語アスペクトは、テキスト変換へのモデルを定義します。モデルを直接テキスト形式に変換する必要があるたびに便利です。この言語には、テキストを出力し、ノードをテキスト値に変換し、出力に合理的なレイアウトを与えるための構成要素が含まれています。操作appe...

SModel言語

SModel言語の目的はMPSモデルを問い合わせて修正することです。あなたのモデルのノード、属性、プロパティー、リンクそして他の多くの本質的な性質を調査します。言語はあなたの言語のいくつかの異なる側面をコード化するために必要とされます - 最も顕著なものを挙げるために、行動、リファクタリング、ジェネ...

ジェネレーターデモ

ジェネレータチュートリアル:更新されたGenerator Tutorialへようこそ。MPSで言語生成プログラムを定義および拡張する手順を案内します。チュートリアルは7つの部分から成り、徐々に複雑さが増しています。すべてのデモは同じ基本的な物語 -Java SwingコンポーネントへのXMLコードの...

データ・フロー

言語のデータフローの側面では、到達不能なステートメントの検索、未使用の代入の検出、変数が読み込まれる前に初期化されていない可能性があるかどうかの確認などを行うことができます。また、「抽出メソッド」リファクタリングなど、いくつかのコード変換を実行することもできます。データフロー分析のほとんどのユーザー...