MPS 2019.3ヘルプ

制約

構造言語は、言語構造に関する高度な制約を表現するには不十分な場合があります。制約アスペクトは、このような追加の制約を定義する方法を提供します。

デフォルトの具体的な概念

抽象概念の場合は、制約アスペクトを使用して、抽象概念のノードを作成する必要があるときに代わりに使用する概念を示すことができます。

image2018 9 12 15 43 19

例:子コレクションがAbstractCommandsを保持することになっている場合、ユーザーがEnterキーを押して新しい子をコレクションに挿入すると、EmptyLineコンセプトのノードが作成されて挿入されます。

同様に、新しいノードを作成し、<デフォルト>パラメーターを受け入れるsmodelコマンドは、抽象ノードではなく、具体的なコンセプトのノードを正しく作成します。

image2018 9 12 15 50 5

子/親/祖先/ルートにすることができます

これらは、コンセプトの制約を定義するときに最初に回すノブです。これらは、この概念のインスタンスを他のノードの子(親、祖先)ノードまたはモデル内のルートノードとしてフックできるかどうかを決定します。boolean-returningクロージャーとして指定します。MPSは、AST内のノードの許可された位置を評価するたびに呼び出します。

Constraintsx1

インポートする言語

ほとんどの場合、制約を定義できるようにするためには、制約アスペクトでインポートされた少なくとも2つの言語(j.m.baselanguageおよびj.m.lang.smodel言語)が必要です。

子供になることができます

コンセプトのインスタンスが特定のノードの子になることが許可されていない場合、falseを返します。

パラメーター

説明

operationContext

IOperationContext

ノード

チェックしている子ノード (この概念の実例)

parentNode

チェックしている親ノード

childConcept

子ノードの概念 (この概念のサブコンセプトになることができます)

リンク

子ノードのLinkDeclaration (そこから子供のロールを果たすことができます)

親になることができます

概念のインスタンスが特定の概念ノード(特定のロール内)の親になることが許可されていない場合、falseを返します。

パラメーター

説明

operationContext

IOperationContext

childNode

チェックしている子ノード

ノード

チェックしている親ノード (この概念の実例)

childConcept

チェックしている子ノードの概念

リンク

子ノードのLinkDeclaration

先祖になれます

コンセプトのインスタンスが特定のノードの祖先になることが許可されていない場合、falseを返します。

パラメーター

説明

operationContext

IOperationContext

childNode

チェックしている子ノード

ノード

チェックしている先祖ノード (この概念の実例)

childConcept

子孫ノードの概念

ルートになることができます

この制約は、ルート可能なコンセプトにのみ使用できます( インスタンスは、ルートがコンセプト構造の説明でtrueである場合があります)。概念のインスタンスが特定のモデルのルートになれない場合はfalseを返します。

パラメーター

説明

operationContext

IOperationContext

モデル

ルートのモデル

プロパティの制約

技術的には、「純粋」コンセプトプロパティは元の意味のプロパティではなく、パブリックフィールドのみです。プロパティ制約により、実際のプロパティにすることができます。これらの制約を使用して、コンセプトのプロパティの動作をカスタマイズできます。各プロパティ制約は、指定された単一のプロパティに適用されます。

property-この制約が適用されるプロパティ。

get-このメソッドは、プロパティにアクセスするたびにプロパティ値を取得するために実行されます。

パラメーター

説明

ノード

プロパティを取得するノード

set-このメソッドは、書き込みごとにプロパティ値を設定するために実行されます。プロパティ値は有効であることが保証されています。

パラメーター

説明

ノード

プロパティを設定するノード

propertyValue

新しいプロパティ値

有効 -このメソッドは、プロパティの値が有効かどうかを判断する必要があります。このメソッドは値を変更する前に毎回実行され、falseを返す場合、set()メソッドは実行されません。

パラメーター

説明

ノード

プロパティをチェックするノード

propertyValue

チェックする値

サンプル - 補完メニューの説明のカスタマイズ

完了メニューには、利用可能なノードと追加の説明情報が一覧表示されます。

sd1

追加情報をカスタマイズし、補完メニューにリストされている個々のオプションの詳細を提供するために、ターゲットコンセプトのshortDescriptionプロパティのgetterをオーバーライドできます。

sd2
sd3

参照先の制約

このタイプの制約は、概念のリンクに動作を追加し、よりプロパティのように見えるようにできます。

リファレントセットハンドラ -指定されている場合、このメソッドはこのリンクのすべてのセットで実行されます。

パラメーター

説明

referenceNode

リンクを含むノード。

oldReferentNode

参照の古い値

newReferentNode

参照の新しい値


scope - このリンクが指すことができるノードのセットを定義します。メソッドはスコープインスタンスを返します。スコープの詳細についてはスコープドキュメントを参照してください。スコープ参照制約には2つのタイプがあります。

  • 継承

  • 参照

継承スコープは単にターゲット概念を宣言するだけですが、参照スコープはパラメータからその場でスコープを計算する関数を提供します。

パラメーター

説明

referenceNode

実際のリンクを含むノードスマート参照を使用する概念のために新しいノードが作成されているときはnullになる可能性があります。この状況では、enclosingNodeのコンテキストで作成するノードの種類を決定するためにスマート参照が使用されるため、検索スコープメソッドはnull referenceNodeで呼び出されます。

contextNode

参照を持つノード、または最も近い非nullコンテキストノード

containmentLink

contextNodeと作成中の存在しない子との親子関係を記述するSContainmentLink (referenceNodeが存在する場合、このパラメータは意味を持ちません。)

linkTarget

このリンクが参照できる概念通常それは参照の概念のため、静的に知られています。subconceptで参照を特殊化し、特殊化参照の検索範囲を定義しない場合は、linkTargetパラメータを使用して、どの参照の特殊化が必要かを判断できます。

位置

contextRoleのターゲットインデックス

範囲が参照に設定されていない場合は、参照されている概念のデフォルトの範囲が使用されます。デフォルトのスコープも設定されていない場合は、「グローバル」スコープが使用されます。インポートされたすべてのモデルからの参照概念のすべてのインスタンスです。


presentation(廃止予定 - エディターのアスペクトが参照の表示を指定するようになりました。エディターを参照してください) - ここでは、エディターと補完リストでの参照の外観を指定します。状況に応じて参照を異なるように表示すると便利なことがあります。例:Javaでは、フィールドが同じ名前のローカル変数宣言によって隠されている場合、インスタンスフィールドfへの参照はすべてthis.fとして表示されます。デフォルトでは、プレゼンテーションが設定されていない場合、参照ノードの名前がそのプレゼンテーションとして使用されます(INamedConceptである場合)。

パラメーター

説明

モデル

参照を含むノードのモデル

parameterNode

提示されるノード (referenceNodeはlinkTarget型のparameterNodeへの参照を持っています)

位置

contextRoleのターゲットインデックス

存在する

参照が作成されているときはfalse

見える

true - 既存ノードの表示、false - 新しいノード用 (完了メニューで選択した後に作成されます)

smartReference

true - ノードはスマートリファレンスに表示されます

inEditor

true - エディターへのプレゼンテーション、false - 補完メニュー

contextNode

参照を持つノード、または最も近い非nullコンテキストノード

contextRole

contextNode内のターゲットロール

referenceNode
enclosingNode
linkTarget
containingLink

非推奨

デフォルト・スコープ

概念Cのインスタンスを指すリンクがあり、参照制約内でこのリンクに対して定義された範囲がないとします。このリンクを編集すると、インポートされたすべてのモデルからの概念Cのすべてのインスタンスがデフォルトで表示されます。すべてのリンクの可視インスタンスのセットを概念Cに制限したい場合は、その概念のデフォルトの範囲を設定できます。参照制約と同様に、検索範囲バリデータ、および表示方法を設定できます。すべてのパラメータは同じです。

スコープの詳細についてはスコープドキュメントを参照してください。

最終更新日: 2020年2月28日

関連ページ:

スコープ

カスタム言語要素のスコープを定義する2つの方法、継承 (階層)と参照アプローチを見ていきます。実験用のテストベッドとして計算機のチュートリアル言語を選択しました。MPSディストリビューションに付属のサンプルプロジェクトのセットにcalculator-tutorialプロジェクトが含まれています。2

エディター

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

エディター言語生成API

エディター言語は多くのMPSユーザによって拡張されることになっているため、エディター言語用のジェネレータを、使いやすいように設計しました - わかりやすいテンプレート、人間が読めるコード、および実行時よりも生成時のメタ情報の使用-時間。新しいセルタイプを提供するために、いずれかの言語でエディターの言...

振る舞い

構文木の操作中、タスクを単純化し機能を再利用するために、一般的な操作がユーティリティメソッドに抽出されることがよくあります。そのようなユーティリティを静的メソッドに抽出したり、仮想メソッド内にユーティリティコードを保持するノードラッパーを作成することが可能です。しかし、MPSではより良い解決策が利用...