MPS 2019.1ヘルプ

パターン

パターン言語

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

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

パターン表現

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

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

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

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

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

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

サンプル

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

pattern0

取得した変数:

$methodName

ひも

メソッド名

#statementList

ノード<StatementList>

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

取得した変数:

* l

nlist <タイプ>

クラス型のパラメータ

#ignored

ノード<タイプ>

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

パターンを使う

マッチステートメント

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

Pattern2

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

その他の用法

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

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

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

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

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

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


最終更新日: 2019年7月5日

関連ページ:

型システム

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

Using_typesystem

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

マイグレーション

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

オープンAPI - コードからモデルにアクセスする

言語レポジトリ、プロジェクトモジュール、言語、およびモデルは、Open APIを介してプログラム的に便利にアクセスできます。Open APIを使用すると、モデルへのアクセスを制御したり、永続化などのいくつかの側面について独自の実装を提供したりすることもできます。これら2つの使用箇所の種類について個別...

ビルド言語

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