MPS 2020.1ヘルプ

パターン

パターン言語

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

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

パターン表現

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

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

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

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

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

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

サンプル

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

pattern0

取得した変数:

$methodName

ひも

メソッド名

#statementList

ノード<StatementList>

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

取得した変数:

* l

nlist <タイプ>

クラス型のパラメータ

#ignored

ノード<タイプ>

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

パターンを使う

マッチステートメント

Patterns are typically used as conditions in match statements. Pattern variables can be referenced from inside of the match statement.

例:
Pattern2

This piece of code examines a node n and checks whether it satisfies the first or the second condition. Then the statement in the corresponding (matching) block is executed. A pattern variable $name is used in a first block to print out the name of a node. In our case the node holds a variable declaration.

その他の用法

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

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

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

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

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

You can also use patterns in your own languages.
Basically what happens is that a class is generated from a パターン表現 and the expression itself is reduced to a constructor of this class. This class extends GeneratedMatcher and has a boolean method match(SNode) , which returns a boolean value indicating whether the node matches the pattern. It also holds a method getFieldValue(String) to get the values stored in pattern variables after a successful match.
To develop your own language constructs using patterns, you can call these two methods in the generator template for your constructs.

光のパターン (pattern builders)

Pattern language, which allows the user to match code against a parametrized structure, is based on quotations and has its counterpart based on light quotations. Using light patterns helps to avoid problems like bootstrap dependency and confusing node editors. They have some additional advantages:

  • Light patterns are better integrated into baseLanguage. Nodes can be matched against light patterns via the pattern switch statement. Light patterns can be written directly in place inside the switch clause or declared independently as class members and then used from the switch clause.

    lightpattern1

  • Only those node properties and links should be mentioned that need to be checked during matching. If any value should match (wildcard behavior), the property or link can be omitted.

    lightpattern2

  • Pattern variables can be used inside the switch clauses to retrieve nodes and properties from the matched node. They can be used inside the pattern initializers as well, to create patterns matching self-referencing subtrees or duplicated property values. If there is no node to match with the variable, the variable may hold a null value.

    lightpattern3

  • If a list of nodes is defined in a light pattern then the order defined in the list is strictly followed during matching. While this is desired for ordered child collections, which is the default in MPS, it may give surprising results when matching against unordered collections, since the light pattern language always considers the order in its definition. An explanatory info message is shown to the user to indicate situations when matching against an unordered collection is detected.

    lightpattern5

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

関連ページ:

型システム

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

Using_typesystem

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

マイグレーション

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

引用符

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

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

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

ビルド言語

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