MPS 2020.1 ヘルプ

パターン

パターン言語

パターン言語には、モデル構造のパターンを定義するという単一の目的があります。これらのパターンは、マッチングしたいノードの視覚的表現を形成します。ノードのプロパティ値がパターンで指定された値と等しい場合、パターンはノードと一致し、ノードの参照はパターンのものと同じターゲットを指し、対応する子はパターンの適切な子と一致します。

また、パターンにはノード、参照、およびプロパティの変数を含めることができます。これらの変数は、任意のノード / 参照 / プロパティに一致します。それに加えて、変数はマッチが成功したときに実際の値を保持します。

パターン表現

パターン言語の最も重要な概念はパターン表現です。それはその単一の任意ノードとしてパターンを含みます。また、ノードは以下の変数を指定できます。

  • #name - ノード変数、ノードのプレースホルダー。一致するノードを格納する

  • #name - 参照変数、参照のプレースホルダー。参照のターゲット、つまりノードを格納します。

  • $name - プロパティ変数、プロパティ値のプレースホルダ。プロパティ値、つまり文字列を格納します。

  • * name - リスト変数。同じロール内のノードのプレースホルダー。ノードの一覧を格納します。

引用符の内側と同様に、引用符はパターンの内側で使用すると特に便利です(反引用符を参照)。

サンプル

1。次のパターンは、パラメーターと戻り値の型がない InstanceMethodDeclaration に対して一致します。

pattern0

取得した変数:

$methodName

ひも

メソッド名

#statementList

ノード <StatementList>

2。次のパターンは、引用符で囲まれた式の中で指定された実際の分類子と、任意の数量の任意の型パラメーターを持つ ClassifierType に対して一致します。
pattern

取得した変数:

* l

nlist <タイプ>

クラス型のパラメーター

#ignored

ノード <タイプ>

ワイルドカードとして使用すると、その内容は無視されます。パラメーターが任意であることを意味する

パターンを使う

マッチステートメント

パターンは通常、一致ステートメントの条件として使用されます。パターン変数は、match ステートメント内から参照できます。

例 :
Pattern2

このコードは、ノード n を調べ、最初の条件または 2 番目の条件を満たすかどうかを確認します。次に、対応する(一致する)ブロック内のステートメントが実行されます。パターン変数 $name は、最初のブロックでノードの名前を出力するために使用されます。私たちの場合、ノードは変数宣言を保持しています。

その他の用法

パターンは MPS の他のいくつかの言語構成要素でも使われています。それらは現れるかもしれません:

  • 型システム / 置き換え / サブタイプ / その他の型システム言語の規則の該当するノードに関する条件として ( 推論ルールを参照)

  • 強制ステートメントおよび強制式のスーパータイプパターンとして ( 強制を参照)

  • ジェネレータルールのノードの条件として

  • 言語の移行を定義するために使用される TransformStatement のパターンとして ( マイグレーションを参照)

自分の言語のパターンを使用することもできます。
基本的に何が起こるかは、クラスがパターン表現から生成され、式自体がこのクラスのコンストラクターに縮小されることです。このクラスは GeneratedMatcher を拡張し、ブールメソッド match(SNode) があり、ノードがパターンに一致するかどうかを示すブール値を返します。また、一致の成功後にパターン変数に格納された値を取得するためのメソッド getFieldValue(String) も保持します。
パターンを使用して独自の言語構成を開発するには、構成のジェネレータテンプレートでこれら 2 つのメソッドを呼び出すことができます。

ライトパターン (パターンビルダー)

ユーザーがコードをパラメーター化された構造と照合できるようにするパターン言語は、引用に基づいており、対応するものは軽い引用に基づいています。ライトパターンを使用すると、ブートストラップの依存関係やノードエディターの混乱などの問題を回避できます。それらにはいくつかの追加の利点があります:

  • ライトパターンは baseLanguage に統合されています。ノードは、パターンスイッチステートメントを使用してライトパターンと照合できます。ライトパターンは、switch 句の内部に直接書き込むか、クラスメンバーとして個別に宣言して、switch 句から使用できます。

    lightpattern1

  • マッチング中にチェックする必要があるノードのプロパティとリンクのみを記載する必要があります。いずれかの値が一致する必要がある場合(ワイルドカードの動作)、プロパティまたはリンクは省略できます。

    lightpattern2

  • パターン変数をスイッチ句内で使用して、一致したノードからノードとプロパティを取得できます。これらは、パターン初期化子の内部でも使用でき、自己参照サブツリーまたは重複するプロパティ値と一致するパターンを作成できます。変数と一致するノードがない場合、変数は null 値を保持する可能性があります。

    lightpattern3

  • ノードのリストが明るいパターンで定義されている場合、リストで定義されている順序は、照合中に厳密に従います。これは、MPS のデフォルトである順序付けされた子コレクションに必要ですが、ライトパターン言語は常にその定義で順序を考慮するため、順序付けされていないコレクションと照合すると、驚くべき結果が得られる場合があります。順序付けられていないコレクションとの一致が検出された状況を示す説明情報メッセージがユーザーに表示されます。

    lightpattern5

最終更新日 : 2020 年 6 月 18 日

関連ページ:

型システム

言語のための型システムを定義する :このページでは、MPS 型システムについて詳しく説明します。最初の型システムの規則を定義する際に、さらに簡単に導入したい場合は、型システムクックブックをチェックしてください。コードから型システムを使用する方法をよく知りたい場合は、型システムを使うの章も参照してくだ...

Using_typesystem

言語の型システムを定義した場合、タイプチェッカーは自動的にそれをエディターで使用して、開いているノードをエラーと警告で強調表示します。また、エディターアクションやジェネレータクエリなど、クエリの型に関する情報を使用することもできます。ノードの型を使用することも、特定の型が別の型のサブタイプかどうかを...

マイグレーション

言語が公開され、ユーザーがそれを使い始めた後、言語の作者は言語定義へのさらなる変更に注意しなければなりません。特に、概念を削除したり、プロパティ、子、および概念への参照を追加および削除すると、前の言語バージョンと次の言語バージョンの間に互換性がなくなります。次の言語バージョンに更新すると、言語のユー...

引用符

引用符は、必要な構造を持つノードを簡単に作成できるようにする言語構成です。もちろん、smodelLanguageを使用してノードを作成してから、同じsmodelLanguageを使用して適切な子、プロパティ、および参照を手動で追加することもできます。ただし、これを実現するためのより簡単で、より視覚的...

モデルとモジュールの依存関係を使う FAQ

module.getDeclaredDependencies()SDependencyScope。デフォルト、最終更新日 : 2020 年 6 月 18 日オープン API - コードからモデルにアクセスするパターン

ビルド言語

MPS ビルド言語とは何ですか? :ビルド言語は宣言的な方法でビルドを定義するための拡張可能なビルド自動化 DSL です。Antに生成された、Ant の実行機能を活用しながら、ソースをクリーンで無駄のない詳細情報から解放します。一番下に ANT がある MPS 言語のスタックとして編成されているため...