MPS 2020.3 ヘルプ


Since MPS frees you from defining a grammar for your intented languages, you obviously need different ways to specify the structure of your languages. This is where the Structure Language comes in handy. It gives you all the means to define the language structure. As we discussed earlier, when coding in MPS you're effectively building the AST directly, so the structure of your language needs to specify the elements, the bricks, you use to build the AST.

The bricks are called Concepts and the Structure Language exposes concepts and concept interfaces as well as their members: properties, references, and children.



Now let's look at those in more detail. A Concept defines the structure of a concept instance, a node of the future AST representing code written using your language. The Concept says which properties the nodes might contain, which nodes may be referred to, and what children nodes are allowed (for more information about nodes see the 基本的な考え方 section).

Apart from Concepts, there are also Concept Interfaces. Concept interfaces represent independent traits, which can be inherited and implemented by many different concepts. You typically use them to bring orthogonal concepts together in a single concept. For example, if your Concept instance has a name by which it can be identified, you can implement the INamedConcept interface in your Concept and you get the name property plus associated behavior and constraints added to your Concept.


Just like in OO programming, a Concept can extend another Concept, and implement many Concept Interfaces. A Concept Interface can extend multiple other Concept Interfaces. This system is similar to Java classes, where a class can have only one super-class but many implemented interfaces, and where interfaces may extend many other interfaces.

ある概念が別の概念を拡張したり概念インターフェースを実装したりすると、他動詞的にすべてのメンバーを継承します。(i.e if A has member m, A is extended by B and B is extended by C, then C also has the member m)


MPS には、概念によって実装されたときに特別な意味または動作を持つ概念インターフェースがいくつかあります。これは最も有用なもののリストです:




Used if instances of your concept can be deprecated. It's isDeprecated behavior method indicates whether or not the node is deprecated. The editor sets a strikeout style for reference cells if isDeprecated of the target returns true.




Used if instances of your concept have an identifying name. The interface extends INamedConcept and adds constraints that guarantee a valid Java identifier to be used as the name. Belongs to BaseLanguage and should only be utilized in BaseLanguage extensions.


言語定義のある側面の一部である名前付き概念に使用されます。インターフェースは、有効な Java 識別子が使用されることを保証します。



I ラッパー

直接の親が IWrapper のインスタンスであるノードを削除すると、親ノードも削除されます。



Property is a value stored inside a concept instance. Each property must have a type, which for properties is limited to: primitives, such as boolean, string and integer; enumerations, which can have a value from a predefined set; and constrained data types (strings constrained by a regular expression). You may define a getter and setter for a property in the 制約 of a concept.


Holding scalar values would not get as far. To increase expressiveness of our languages nodes are allowed to store references to other nodes. Each reference has a name, a type, and a cardinality. The type restricts the allowed type of a reference target. Cardinality defines how many references of this kind a node can have. References can only have two types of cardinalities: 1:0..1 and 1:1.

参照のために逆方向に横断する直接的な方法はありません。そのためには、jetbrains.mps.lang.findUsages 言語と execute finder を使用する必要があります。(これらは生成中は確実には機能しません)。


A node containing a single reference of 1:1 cardinality and with no alias defined is called a smart reference. These are somewhat special references. Provided the language author has not specified an alias for them, they do their best to hide from the language user and be as transparent as possible. MPS treats the node as if it was a the actual reference itself, which simplifies code editing and code-completion. For example, default completion items are created whenever the completion menu is required: for each possible reference target, a menu item is created with matching text equal to the presentation of a target node.

In order to make a reference smart when it does not meet the above mentioned criteria for being treated as smart automatically, the concept declaration has to be annotated with the @smart reference attribute: A typical use-case would be a concept that customizes the presentation of the reference or holds additional references.

Smart ref1

ノードを木に組み立てるために、子供たちがそれらにつながれることを可能にする必要があります。各子宣言は、ゴール概念、そのロールおよび濃度を保持します。ターゲットコンセプトは子供の種類を指定します。ロールは、この子グループの名前を指定します。最後に、カーディナリティは、このグループの子を 1 つのノードに含めることができる数を指定します。1:1、1:0..1、1:0..n、1:1..n の 4 種類のカーディナリティがあります。

Programatically, node.children retrieves all nodes that are children to the current node. The reverse of node.children is node.parent or node.ancestor(s) .


Sometimes, when one concept extends another, we not only want to inherit all of its members, but also want to override some of its traits. This is possible with children and references specialization. When you specialize a child or reference, you narrow its target typ and possibly also change its name. For example, if you have concept A which extends B, and have a reference r in concept C with target type B, you might narrow the type of reference r in C's subconcepts. It works the same way for concept's children.

You need to add the specializes: section to your link declaration and refer to the link from a super-concept that you are modifying.


The alias, referred to from code as conceptAlias, optionally specifies a string that will be recognized by MPS as a representation of the Concept. The alias will appear in completion boxes and MPS will instantiate the Concept, whenever the alias or a part of it is typed by the user.


Constrained Data Type allows you to define string-based types constrained with a regular expression. MPS will then make sure all property values with this constrained data type hold values that match the constraint.

Custom data type




Each enumeration member has an name and an optional presentation.

  • 名前(左の列)- この文字列値は、プログラムでこのメンバーを参照するために使用されます。

  • プレゼンテーション(右の列)- この文字列値は、ユーザーモデル(完了メニュー、エディター)の列挙型メンバーを表すために使用されます。プレゼンテーションが明示的に定義されていない場合は、代わりに名前が使用されます。



To access enumerations and their members programmatically, use the enum operations and the enummember type defined in the jetbrains.mps.lang.smodel language.


Enumeration members can be queried for their name and presentation. Checking a value of a property against an enum data type value can be done with the is operation.


Handy from name, from presentation and members operations on an enumeration give you access to the members.


An enum switch statement provides a convenient control structure - given an enumeration member, it ’ s easy to switch over to a particular member instances using the enum switch statement:


or the enum switch expression:


If some enumeration members are omitted and no otherwise branch is specified, a warning reporting a non-exhaustive switch is raised. Similarly, an error is raised when a single value occurs more than once in a switch.


列挙データ型 (非推奨、代わりに列挙を使用)



Each enumeration data type member has a value and a presentation. Optionally an identifier can be specified explicitly.

プレゼンテーション vs: 価値 vs: 識別子

  • プレゼンテーション - この文字列値は、UI で列挙型メンバーを表すために使用されます (補完メニュー、エディター)

  • - この値は、そのタイプがメンバータイププロパティによって設定され、コード内の列挙型メンバーを表します

  • 識別子 - このオプションの値は、生成された Java 列挙型の名前として使用されます。この値は、言語ユーザーに対して透過的であることが意図されており、言語では意味がないため、通常、プレゼンテーションまたは値のいずれかから導出されます。ID 派生プロセスが一意の有効な識別子を生成できない場合にのみ指定する必要があります。

  • Name - when accessing enum data type's members from code, name refers to either presentation , value or identifier, depending on which option member identifier is active


表示または値から識別子を派生させるとき、MPS は Java 識別子で許可されていない文字を排除するために最善の努力をします。複数の enum データ型メンバーの派生識別子が同じになると、エラーが報告されます。そのような場合は、明示的な識別子を指定する必要があります。


To access enumeration data types and their members programmatically, use the enum operations defined in the jetbrains.mps.lang.smodel language.


Checking a value of a property against an enum data type value can be done with the is operation. To print out the presentation of the property value, you need to obtain the corresponding enum member first:



Attributes, sometimes called Annotations, allow language designers to express orthogonal language constructs and apply them to existing languages without the need to modify them. For example, the generator templates allow for special generator marks, such as LOOP, ->$ and $[], to be embedded within the target language:


ターゲット言語(この例では BaseLanguage)は MPS ジェネレーターについて何も知る必要はありませんが、ジェネレーターマクロは抽象モデル(AST)に追加してエディターで編集できます。同様に、アンチクォーテーションとパターンは、BaseLanguage の概念に起因する可能性があります。

MPS は 3 種類の属性を提供します。

  • LinkAttribute - to annotate references

  • NodeAttribute - to annotate individual nodes

  • PropertyAttribute - to annotate properties




この章では、基本的な MPS の概念(ノード、概念、および言語)について説明します。これらは、MPS がどのように機能するかを正しく理解するための鍵です。それらはすべて他のものと組み合わせたときにのみ意味をなすため、それらすべてについて一緒に話し合う必要があります。このセクションは、各要素の本質を説明することを目的としています。詳細については、ノード、概念(構造言語)、言語(プロジェクト構造)に関するセクションを確認することを検討してください。抽象構文ツリー (AST):MPS は、テキスト形式...


構造言語は、言語構造に関する高度な制約を表現するには不十分な場合があります。制約アスペクトは、このような追加の制約を定義する方法を提供します。デフォルトの具体的な概念:抽象概念の場合は、制約アスペクトを使用して、抽象概念のノードを作成する必要があるときに代わりに使用する概念を示すことができます。例: 子コレクションが AbstractCommands を保持することになっている場合、ユーザーが Enter キーを押して新しい子をコレクションに挿入すると、EmptyLine コンセプトのノードが作成さ...


ノードに属性を追加する機能を活用する方法を学びます。この機能は、構造の章の属性のセクションで詳しく説明されています。このクックブックでは、計算機チュートリアル言語に簡単な追加機能を作成して、電卓定義の入力フィールドと出力フィールドに説明的なコメントを付けることができます。これらの説明コメントは、入力フィールドと出力フィールドに対応する Swing テキストフィールドに添付された「ポップアップツールチップ」の形式で、生成された Java コードに伝達されます。MPS 2018.2 ドキュメントのコ...






言語のための構造が定義されたら、おそらく行って、開発者がそれを使って便利に AST を構築できるようにするための手段を作成するでしょう。AST を直接操作しても、直感的にも生産的にもなりません。AST を隠してユーザーに快適で直感的な対話を提供することは、言語エディターにとってのロールです。AST を直接操作する必要がある場合もあります。例: 利用可能なエディター定義でノードのすべてのプロパティにアクセスできない場合。リフレクティブエディターを使用すると、選択したノードのエディターを終了して代わ...