MPS 2019.1ヘルプ

パターン

The Pattern language

The pattern language has a single purpose - to define patterns of model structures. Those patterns form visual representations of nodes you want to match. A pattern matches a node if the node's property values are equal to those specified in the pattern, node's references point to the same targets that the ones of the pattern do and the corresponding children match the appropriate children of the pattern.

Also patterns may contain variables for nodes, references and properties, which then match any node/reference/property. On top of that the variables will hold the actual values upon a successful match.

PatternExpression

The single most important concept of the pattern language is PatternExpression . It contains a pattern as its single arbitrary node. Also, the node can specify the following variables:

  • #name - a node variable, a placeholder for a node. Stores the matching node

  • #name - a reference variable, a placeholder for a reference. Stores the reference's target, i.e. a node.

  • $name - a property variable, a placeholder for a property value. Stores the property value, i.e. a string.

  • *name - a list variable, a placeholder for nodes in the same role. Stores the list of nodes.

Antiquotations may be in particular useful when used inside a pattern, just like inside quotations (see 反引用符 ).

サンプル

1。The following pattern matches against any InstanceMethodDeclaration without parameters and a return type:

pattern0

Captured variables:

$methodName

string

method's name

#statementList

node<StatementList>

statements

2。The following pattern matches against a ClassifierType with the actual classifier specified inside an antiquotation expression and with any quantity of any type parameters:
pattern

Captured variables:

*l

nlist<Type>

class type's parameters

#ignored

node<Type>

used as wildcard, its contents is ignored. Means that parameters are arbitrary

Using patterns

Match statement

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

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.

Other usages

Patterns are also used in several other language constructs in MPS. They may appear:

  • as conditions on applicable nodes of typesystem/replacement/subtyping/other rules of typesystem language (推論ルールを参照 )

  • as supertype patterns in coerce statement and coerce expression (Coerceを参照 )

  • as conditions on node in generator rules

  • as pattern in TransformStatement used to define language migrations (See マイグレーション )

You can also use patterns in your own languages.
Basically what happens is that a class is generated from a PatternExpression and the expression itself is reduced to a constructor of this class. This class extends GeneratedMatchingPattern 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(Stirng) to get the values stored in pattern variables after a successful match.
So to develop your own language constructs using patterns, you can call these two methods in the generator template for your constructs.


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

関連ページ:

型システム

言語のための型システムを定義する:このページではMPS型システムについて詳しく解説しています。最初の型システムの規則を定義するためにより軽い入門書を好むことを望むなら、型システムクックブックをチェックすることを検討してください。コードから型システムを使用する方法をよく知りたい場合は、型システムを使う...

Using_typesystem

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

マイグレーション

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

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

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