MPS 2023.3 ヘルプ

制約

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

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

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

image2018-9-12-15-43-19.png

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

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

image2018-9-12-15-50-5.png

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

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

Constraintsx1.png

インポートする言語

jmbaselanguagejmlang.smodel 言語 - 制約を定義することができるようにするために、制約の態様では、インポート少なくとも二つの言語で最も可能性が高い必要があります。

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

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

パラメーター

説明

ノード

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

parentNode

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

childConcept

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

リンク

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

親になることができます

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

パラメーター

説明

childNode

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

ノード

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

childConcept

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

リンク

子ノードの LinkDeclaration

先祖になれます

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

パラメーター

説明

childNode

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

ノード

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

childConcept

子孫ノードの概念

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

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

パラメーター

説明

モデル

ルートのモデル

インスタンスアイコン

指定されたコンテキストで概念のノードを表すアイコンを返します。

パラメーター

説明

ノード

アイコンを描画するノード。

プロパティの制約

技術的に言えば、「純粋な」概念プロパティは、本来の意味でのプロパティではなく、パブリックフィールドにすぎません。プロパティ制約を使用すると、実際のプロパティにすることができます。これらの制約を使用して、概念のプロパティの動作をカスタマイズできます。各プロパティ制約は、指定された単一のプロパティに適用されます。

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

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

パラメーター

説明

ノード

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

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

パラメーター

説明

ノード

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

propertyValue

新しいプロパティ値

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

パラメーター

説明

ノード

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

propertyValue

チェックする値

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

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

sd1.png

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

sd2.png
sd3.png

参照先の制約

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

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

パラメーター

説明

referenceNode

リンクを含むノード。

oldReferentNode

参照の古い値

newReferentNode

参照の新しい値

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

  • 継承

  • 参照

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

パラメーター

説明

referenceNode

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

contextNode

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

containmentLink

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

linkTarget

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

位置

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

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

プレゼンテーション (非推奨 - エディターアスペクトで参照のプレゼンテーションが指定されるようになりました。「エディター」を参照してください)) - ここでは、エディターおよび補完リストで参照がどのように表示されるかを指定します。コンテキストに応じて異なる方法で参照を表示すると便利な場合があります。例: Java では、インスタンスフィールド f へのすべての参照は、フィールドが同じ名前のローカル変数宣言によってシャドウされている場合、this.f として表示される必要があります。デフォルトでは、プレゼンテーションが設定されていない場合、参照ノードの名前がプレゼンテーションとして使用されます(INamedConcept の場合)。

パラメーター

説明

モデル

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

parameterNode

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

位置

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

存在する

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

見える

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

smartReference

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

inEditor

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

contextNode

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

contextRole

contextNode 内のターゲットロール

referenceNode

enclosedNode

linkTarget

containsLink

非推奨

デフォルトスコープ

概念 C のインスタンスを指すリンクがあり、指示対象制約でこのリンクにスコープが定義されていないとします。このリンクを編集すると、インポートされたすべてのモデルのコンセプト C のすべてのインスタンスがデフォルトで表示されます。すべてのリンクの表示可能なインスタンスのセットをコンセプト C に制限する場合は、コンセプトのデフォルトスコープを設定できます。指示対象制約と同様に、スコープ表示方法を設定できます。すべてのパラメーターは同じです。

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

追加の方法

下部の追加メソッドセクションでは、繰り返しを避けるために制約定義内から呼び出すことができるユーティリティメソッドを定義できます。追加のメソッドは通常、計算を実行したり、制約定義の複数の場所で必要なタスクを実行したりします。追加のメソッドは、含まれているノード内からのみ表示されるようにプライベートにする必要があります。

関連ページ:

制約規則

制約言語には、個々の制約のエラーメッセージを指定できないことや、同じ種類の制約に対して複数の個別のルールを定義できないことなど、いくつかの欠点があります。実験的な制約規則言語は、これらを克服しようとしています。これは、RulesConstraintsRules ルートの制約の側面で利用できます。子 / 親 / 祖先 / ルートルールを指定できます:RulesConstraintsRules ルートは、最小限の視覚的なガイダンスを選択します。定義はルールブロックに分割されます。これらのルールブロック...

スコープ

カスタム言語要素のスコープを定義する 2 つの方法、つまり継承された(階層的)アプローチと参照アプローチについて見ていきます。実験のテストベッドとして計算機のチュートリアル言語を選択しました。MPS ディストリビューションに付属するサンプルプロジェクトのセットに含まれている電卓チュートリアルプロジェクトを見つけることができます。2 つの方法:すべての参照は許可されたターゲットのセットを知る必要があります。これにより、ユーザーが参照の値を入力しようとしているときはいつでも MPS が完了メニュー...

エディター

言語の構造が定義されたら、開発者がそれを使用して AST を簡単に構築できるようにする手段を作成することになるでしょう。AST を直接操作することは、あまり直感的でも生産的でもないでしょう。AST を非表示にして、ユーザーに快適で直感的な操作を提供するのが、言語エディターのロールです。エディターの概要:ノードのエディターは、そのビューおよびそのコントローラーとして機能します。エディターにノードが表示され、ユーザーはそれを変更、置換、削除などできます。異なる概念のノードは異なるエディターを持ちま...

エディター言語生成 API

エディター言語は多くの MPS ユーザによって拡張されることになっているため、エディター言語用のジェネレーターを、使いやすいように設計しました - わかりやすいテンプレート、人間が読めるコード、実行時よりも生成時のメタ情報の使用 - 時間。新しいセルタイプを提供するために、いずれかの言語でエディターの言語を拡張している場合は、このドキュメントが役立ちます。API: EditorCell 契約:EditorCell.setBig()/.getBig() メソッドの契約がわずかに変更されました。詳細...