パターン
パターン言語
パターン言語には、モデル構造のパターンを定義するという単一の目的があります。これらのパターンは、マッチングしたいノードの視覚的表現を形成します。ノードのプロパティ値がパターンで指定された値と等しい場合、パターンはノードと一致し、ノードの参照はパターンのものと同じターゲットを指し、対応する子はパターンの適切な子と一致します。
また、パターンにはノード、参照、プロパティの変数を含めることができます。これらの変数は、任意のノード / 参照 / プロパティに一致します。それに加えて、変数はマッチが成功したときに実際の値を保持します。
PatternExpression
パターン言語の最も重要な概念は PatternExpression です。単一の任意のノードとしてパターンが含まれています。また、ノードは次の変数を指定できます。
#name - ノード変数、ノードのプレースホルダー。一致するノードを格納します
#name - 参照変数、参照のプレースホルダー。参照のターゲット、つまりノードを格納します。
$name - プロパティ変数、プロパティ値のプレースホルダ。プロパティ値、つまり文字列を格納します。
* name - リスト変数。同じロール内のノードのプレースホルダー。ノードの一覧を格納します。
アンチクォーテーションは、引用符内と同様に、パターン内で使用する場合に特に便利です ( 反引用符を参照)。
サンプル
1. 次のパターンは、パラメーターと戻り型のない InstanceMethodDeclaration と一致します。
取得した変数:
$methodName | 文字列 | メソッド名 |
#statementList | ノード <StatementList> | 文 |
2. 次のパターンは、引用符で囲まれていない式内で指定された実際の分類子と、任意の量の任意の型パラメーターを持つ ClassifierType と一致します。
取得した変数:
* l | nlist <タイプ> | クラス型のパラメーター |
#ignored | ノード <タイプ> | ワイルドカードとして使用すると、その内容は無視されます。パラメーターが任意であることを意味します |
パターンを使う
マッチステートメント
パターンは通常、一致ステートメントの条件として使用されます。パターン変数は、match ステートメント内から参照できます。
例:
このコードは、ノード n を調べて、ノードが最初の条件を満たしているか、2 番目の条件を満たしているかを確認します。次に、対応する(一致する)ブロック内のステートメントが実行されます。パターン変数 $name は、ノードの名前を出力するために最初のブロックで使用されます。この場合、ノードは変数宣言を保持します。
その他の使用箇所
パターンは MPS の他のいくつかの言語構成要素でも使われています。それらは現れるかもしれません:
型システム / 置き換え / サブタイプ / その他の型システム言語の規則の該当するノードに関する条件として ( 推論ルールを参照)
強制ステートメントおよび強制式のスーパータイプパターンとして ( 強制を参照)
ジェネレータールールのノードの条件として
言語移行を定義するために使用される TransformStatement のパターンとして ( マイグレーションを参照)
自分の言語でパターンを使用することもできます。
基本的に何が起こるかというと、クラスは PatternExpression から生成され、式自体はこのクラスのコンストラクターに還元されます。このクラスは GeneratedMatcher を拡張し、ノードがパターンに一致するかどうかを示すブール値を返すブールメソッド match(SNode) を持っています。また、一致が成功した後にパターン変数に格納されている値を取得するためのメソッド getFieldValue(String) も保持しています。
パターンを使用して独自の言語構成要素を開発するには、構成要素のジェネレーターテンプレートでこれら 2 つのメソッドを呼び出すことができます。
ライトパターン (パターンビルダー)
ユーザーがコードをパラメーター化された構造と照合できるようにするパターン言語は、引用に基づいており、対応するものは軽い引用に基づいています。ライトパターンを使用すると、ブートストラップの依存関係やノードエディターの混乱などの問題を回避できます。それらにはいくつかの追加の利点があります:
ライトパターンは baseLanguage に統合されています。ノードは、パターンスイッチステートメントを使用してライトパターンと照合できます。ライトパターンは、switch 句の内部に直接書き込むか、クラスメンバーとして個別に宣言して、switch 句から使用できます。
マッチング中にチェックする必要があるノードのプロパティとリンクのみを記載する必要があります。いずれかの値が一致する必要がある場合(ワイルドカードの動作)、プロパティまたはリンクは省略できます。
パターン変数をスイッチ句内で使用して、一致したノードからノードとプロパティを取得できます。これらは、パターン初期化子の内部でも使用でき、自己参照サブツリーまたは重複するプロパティ値と一致するパターンを作成できます。変数と一致するノードがない場合、変数は null 値を保持する可能性があります。
ノードのリストが明るいパターンで定義されている場合、リストで定義されている順序は、照合中に厳密に従います。これは、MPS のデフォルトである順序付けされた子コレクションに必要ですが、ライトパターン言語は常にその定義で順序を考慮するため、順序付けされていないコレクションと照合すると、驚くべき結果が得られる場合があります。順序付けられていないコレクションとの一致が検出された状況を示す説明情報メッセージがユーザーに表示されます。
関連ページ:
型システム
言語のための型システムを定義する:このページでは、MPS 型システムについて詳しく説明します。最初の型システムの規則を定義する際に、さらに簡単に導入したい場合は、型システムクックブックをチェックしてください。コードから型システムを使用する方法をよく知りたい場合は、型システムを使うの章も参照してください。型システムとは:型システムは、言語を使用して書かれたモデル内のノードに型を割り当てる言語定義の一部です。型システム言語は、ノードとそのタイプに対する特定の制約をチェックするためにも使用されます
Using_typesystem
言語の型システムを定義した場合、タイプチェッカーは自動的にそれをエディターで使用して、開いているノードをエラーと警告でハイライトします。また、エディターアクションやジェネレータークエリなど、クエリの型に関する情報を使用することもできます。ノードの型を使用することも、特定の型が別の型のサブタイプかどうかを知りたいこともあります。または、与えられた形式を持つ型のスーパータイプを見つけたいと思うかもしれません。タイプ操作:type 操作を使用して、クエリでノードのタイプを取得できます。<expr...
マイグレーション
言語が公開され、ユーザーがそれを使い始めた後、言語の作者は言語定義へのさらなる変更に注意しなければなりません。特に、概念を削除したり、プロパティ、子、概念への参照を追加および削除すると、前の言語バージョンと次の言語バージョンの間に互換性がなくなります。次の言語バージョンに更新すると、言語のユーザーに影響があります。自分のモデルが言語定義と一致しなくなり、適切なエラーがモデルから報告されるためです。MPS はプロジェクトで使用されている言語のバージョンを追跡し、言語の使用箇所を最新のバージョンにア...
引用符
引用は、必要な構造を持つノードを簡単に作成できるようにする言語構造です。もちろん、smodelLanguage を使用してノードを作成し、同じ smodelLanguage を使用して、適切な子、プロパティ、参照を手動で入力することができます。ただし、これを実現するためのより簡単で視覚的な方法があります。2 つの以下の構築物は、最初のものは、第二の計画モデルの API を引用を使用して、同じノードを構築します。node<IntegerType> node = <int>; n...
ビルド言語
MPS ビルド言語とは何ですか? :ビルド言語は宣言的な方法でビルドを定義するための拡張可能なビルド自動化 DSL です。Ant に生成された、Ant の実行機能を活用しながら、ソースをクリーンで無駄のない詳細情報から解放します。一番下に ANT がある MPS 言語のスタックとして編成されているため、ビルド手順の各部分を異なる抽象化レベルで表現することができます。(MPS プラグインのような)複雑なアーティファクトを構築することは、言語の慣習に従えば、たった 1 行のコードで指定できますが、同時...