MPS 2020.3 ヘルプ

パターン

パターン言語

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

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

PatternExpression

パターン言語の最も重要な概念は PatternExpression です。単一の任意のノードとしてパターンが含まれています。また、ノードは次の変数を指定できます。

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

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

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

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

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

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

Pattern0

取得した変数:

$methodName

文字列

メソッド名

#statementList

ノード <StatementList>

ステートメント

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

取得した変数:

* l

nlist <タイプ>

クラス型のパラメーター

#ignored

ノード <タイプ>

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

パターンを使う

マッチステートメント

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

例:undefined
Pattern2

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

その他の用法

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

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

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

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

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

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

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

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

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

    Lightpattern1

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

    Lightpattern2

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

    Lightpattern3

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

    Lightpattern5

関連ページ:

型システム

言語のための型システムを定義する:このページでは、MPS 型システムについて詳しく説明します。最初の型システムルールを定義するためのより軽量な導入を希望する場合は、型システムクックブックを確認することを検討してください。コードから型システムを使用する方法をよく知りたい場合は、型システムを使うの章も参照してください。型システムとは:型システムは、言語を使用して書かれたモデル内のノードに型を割り当てる言語定義の一部です。型システム言語は、ノードとそのタイプに対する特定の制約をチェックするためにも

Using_typesystem

言語の型システムを定義した場合、タイプチェッカーは自動的にそれをエディターで使用して、開いているノードをエラーと警告でハイライトします。また、エディターアクションやジェネレータークエリなど、クエリの型に関する情報を使用することもできます。ノードの型を使用することも、特定の型が別の型のサブタイプかどうかを知りたいこともあります。または、与えられた形式を持つ型のスーパータイプを見つけたいと思うかもしれません。タイプ操作:type 操作を使用して、クエリ内のノードの種類を取得できます。<expr...

マイグレーション

言語が公開され、ユーザーがそれを使い始めた後、言語の作者は言語定義へのさらなる変更に注意しなければなりません。特に、概念を削除したり、プロパティ、子、概念への参照を追加および削除すると、前の言語バージョンと次の言語バージョンの間に互換性がなくなります。次の言語バージョンに更新すると、言語のユーザーに影響があります。自分のモデルが言語定義と一致しなくなり、適切なエラーがモデルから報告されるためです。MPS は、プロジェクトで使用されている言語のバージョンを追跡し、言語の使用箇所を最新バージョンにア...

引用符

引用符は、必要な構造を持つノードを簡単に作成できるようにする言語構成です。もちろん、smodelLanguage を使用してノードを作成してから、同じ smodelLanguage を使用して適切な子、プロパティ、参照を手動で追加することもできます。ただし、これを実現するためのより簡単で、より視覚的な方法があります。次の 2 つの構成要素は同一のノードを構築します。最初の構成要素は引用符を使用し、2 番目の計画モデル API を使用します。node<IntegerType> node = &...

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

module.getDeclaredDependencies()SDependencyScope。デフォルト、オープン API - コードからモデルにアクセスするパターン

ビルド言語

ビルド言語は、宣言的な方法でビルドを定義するための拡張可能なビルド自動化 DSL です。Ant に生成され、Ant の実行機能を活用しながら、ソースをクリーンに保ち、雑然とした無関係な詳細を排除する: 下部に ANT がある MPS 言語のスタックとして編成されているため、ビルド手順の各部分を異なる抽象化レベルで表現できます。言語規則に従えば、複雑なアーティファクト(MPS プラグインなど)の構築を 1 行のコードで指定できますが、同時に、ファイル管理やファイル管理などの詳細をさらに深く掘り下げて...