MPS 2019.1ヘルプ

構造

MPSはあなたの意図した言語のための文法を定義することからあなたを解放するため、明らかにあなたの言語の構造を指定するための異なる方法を必要とします。これは構造言語が便利になるところです。それはあなたに言語構造を定義するためのすべての手段を与えます。前に説明したように、MPSでコーディングするときは、ASTを直接構築するのが効果的です。そのため、言語の構造は、ASTを構築するために使用する要素、ブリックを指定する必要があります。

レンガは概念と呼ばれ、構造言語は、概念概念インターフェース、並びにそれらのメンバー公開します。プロパティー参照、および子供を

concept1

概念と概念インターフェース

それでは、さらに詳しく見てみましょう。概念は、概念インスタンスの構造、つまりあなたの言語を使って書かれたコードを表す将来のASTのノードを定義します。概念は、ノードにどのプロパティーが含まれるのか、どのノードが参照されるのか、どの子ノードが許可されるのかを示します(ノードの詳細については基本的な考え方セクションを参照してください)。

概念とは別に、コンセプトインターフェースもあります。コンセプトインターフェースは独立した形質を表し、多くの異なる概念によって受け継がれ実装されることができます。通常、使用して直交概念を単一の概念にまとめます。例:概念インスタンスに識別可能な名前が付いている場合は、概念にINamedConceptインターフェースを実装して、概念nameプロパティーとそれに関連する動作および制約を追加することができます。

概念の継承

オブジェクト指向プログラミングと同様に、概念は別の概念を拡張し、多数のコンセプトインターフェースを実装することができます。コンセプトインターフェースは他の複数のコンセプトインターフェースを拡張することができます。このシステムはJavaクラスに似ています。クラスはスーパークラスを1つだけ実装することができますが、実装されたインターフェースを多数持つことができ、インターフェースは他の多くのインターフェースを拡張できます。

ある概念が別の概念を拡張したり概念インターフェースを実装したりすると、他動詞的にすべてのメンバーを継承します。(すなわち、Aがmのメンバーを持ち、AがBによって拡張され、BがCによって拡張される場合、Cもmというメンバーを持ちます。)

特別な意味を持つ概念インターフェース

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

コンセプトインターフェース

意味

IDeprecatable

概念のインスタンスが廃止される可能性がある場合に使用されます。isDeprecated動作メソッドは、ノードが非推奨であるかどうかを示します。ターゲットのisDeprecatedがtrueを返す場合、エディターは参照セルに取り消し線スタイルを設定します。

INamedConcept

概念のインスタンスに識別名がある場合に使用されます。この名前はコード補完リストに表示されます。

タイプする

型を表すすべての概念をマークするために使用されます

Iラッパー

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

コンセプトメンバー

プロパティー

プロパティーは、コンセプトインスタンス内に格納されている値です。各プロパティーは型を持つ必要があります。これは、プロパティーでは次のように制限されます。ブール値、文字列、整数などのプリミティブ列挙。定義済みのセットからの値を持つことができます。制約付きデータ型 (正規表現で制約された文字列)概念の 制約 でプロパティーにgetterとsetterを定義できます。

参照

スカラ値を保持してもそれほど遠くはありません。私たちの言語の表現力を高めるために、ノードは他のノードへの参照を格納することが許されています。各参照には、名前種類、および基数があります。型は、参照先の許容型を制限します。カーディナリティーは、ノードがこの種の参照をいくつ持つことができるかを定義します。参照は2つのタイプの基数を持つことができます:1:0..1および1:1。

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

スマートリファレンス

1:1の基数の単一参照を含み、別名が定義されていないノードは、スマート参照と呼ばれます。これらはやや特別な参照です。言語の作成者がそれらのエイリアスを指定していない場合、彼らは言語のユーザーから隠れるように最善を尽くし、できるだけ透過的になります。MPSはノードを実際の参照そのものであるかのように扱います。これにより、コード編集とコード補完が簡単になります。例:デフォルトの補完項目は、補完メニューが必要なときはいつでも作成されます。可能な参照ターゲットごとに、ターゲットノードの表示と等しいテキストが一致するメニュー項目が作成されます。

自動的にスマートとして扱われるという上記の基準を満たしていないときに参照をスマートにするには、概念宣言に@smartリファレンス属性を付けて注釈を付ける必要があります。典型的なユースケースは、オブジェクトの表示をカスタマイズする概念です。追加の参照を保持または保持します。

SmartRef1

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

プログラム的に、node.childrenは現在のノードの子であるすべてのノードを取得します。node.childrenの逆はnode.parentまたはnode.ancestor(s)です。

特別な参考文献と子供

ある概念が別の概念を拡張するときに、そのすべてのメンバーを継承したいだけでなく、その特性の一部をオーバーライドしたい場合もあります。これは子供や参照の専門化で可能です。子供や参照を専門にするとき、そのターゲットタイプを絞り込みます。例:Bを拡張する概念Aがあり、概念Cのターゲット型Bの参照rがある場合、Cのサブコンセプトで参照rの型を絞り込むことができます。コンセプトの子供たちにも同じように働きます。

エイリアス

コードからconceptAliasと呼ばれる別名は、MPSによって概念の表現として認識されるストリングをオプションで指定します。エイリアスは、完了ボックスに表示され、エイリアスまたはその一部がユーザによって入力されるたびにMPSは、概念をインスタンス化します。

制約付きデータ型

制約付きデータ型を使用すると、正規表現で制約された文字列ベースの型を定義できます。MPSは、この制約付きデータ型を持つすべてのプロパティー値が、制約と一致する値を保持していることを確認します。

CustomDataType

列挙データ型

列挙型データ型を使用すると、事前定義セットの値を保持するプロパティーを使用できます。

Enum1

各列挙型データ型のメンバーは、表現を持ちます。オプションで識別子を明示的に指定できます。

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

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

  • - 型がmember typeプロパティーによって設定されているこの値は、コード内のenumメンバーを表します。

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

  • 名前 - コードからenumデータ型のメンバーにアクセスするとき、nameはどのオプションメンバー識別子がアクティブかに応じて、表示、または識別子のいずれかを参照します。

識別子の自動導出

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

プログラムによるアクセス

列挙データ型とそのメンバーにプログラムでアクセスするには、jetbrains.mps.lang.smodel言語で定義されている列挙操作を使用します。

Enum32

enumデータ型の値に対してプロパティーの値をチェックすることは、is操作で行うことができます。プロパティー値の表示を印刷するには、まず対応する列挙型メンバーを取得する必要があります。

Enum33

属性

注釈とも呼ばれる属性を使用すると、言語設計者は直交言語の構成要素を表現し、変更することなく既存の言語に適用できます。例:ジェネレータテンプレートでは、LOOP->$$[]などの特別なジェネレータマークをターゲット言語に埋め込むことができます。

Generator1

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

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

  • LinkAttribute - 参照に注釈を付ける

  • NodeAttribute - 個々のノードに注釈を付ける

  • PropertyAttribute - プロパティーに注釈を付ける

これらを拡張することで、既存の言語に独自の追加を導入することができます。使用中の属性の良い例については、説明コメントクックブック要求追跡言語クックブックを調べてください。

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

関連ページ:

基本的な考え方

この章では、MPSの基本的な概念(ノード、概念、および言語)について説明します。これらはMPSがどのように機能するかを正しく理解するための鍵です。それらはすべて他のものと組み合わされたときに意味をなさないため、それらについてすべて一緒に話さなければなりません。このセクションでは、各要素の本質について...

制約

構造言語では、言語構造に対する高度な制約を表現するのに不十分な場合があります。制約アスペクトはあなたにそのような追加の制約を定義する方法を与えます。デフォルトの具体的な概念:抽象概念については、制約アスペクトを使用して、抽象概念のノードを作成する必要があるときにはどの概念を使用するべきかを示すことが...

説明コメント

ノードに属性を追加する機能を活用する方法を学びます。この機能は、構造の章の属性のセクションで詳しく説明されています。このクックブックでは、電卓チュートリアル言語に簡単な追加機能を作成して、電卓定義の入力フィールドと出力フィールドに説明的なコメントを付けることができます。これらの説明コメントは、入力フ...

要求追跡言語

This cookbook will guide you through the Requirement tracking sample project. This sample projects implements language-agnostic requirement tracking.

言語定義

言語はアスペクトモデルを使って定義されます。言語定義の個々の側面に関する詳細については左側のパネルをチェックしてください。最終更新日: 2019年5月29日言語プラグインのインストール方法構造

エディター

言語のための構造が定義されたら、おそらく行って、開発者がそれを使って便利にASTを構築できるようにするための手段を作成するでしょう。ASTを直接操作しても、直感的にも生産的にもなりません。ASTを隠してユーザーに快適で直感的な対話を提供することは、言語エディターにとっての役割です。ASTを直接操作す...