制約
構造言語は、言語構造に対する高度な制約を表現するには不十分な場合があります。制約アスペクトは、そのような追加の制約を定義する方法を提供します。
デフォルトの具体的な概念
抽象概念の場合、制約アスペクトを使用して、抽象概念のノードを作成する必要がある場合に代わりにどの概念を使用するかを示すことができます。
例: 子コレクションが AbstractCommands を保持することになっていて、ユーザーが Enter キーを押して新しい子をコレクションに挿入すると、EmptyLine コンセプトのノードが作成されて挿入されます。
同様に、新しいノードを作成し、<default> パラメーターを受け入れる smodel コマンドは、抽象的な概念ではなく具体的な概念のノードを正しく作成します。
子 / 親 / 祖先 / ルートにすることができます
これらは、概念の制約を定義するときに回す最初のノブです。これらは、この概念のインスタンスを他のノードの子(親、祖先)ノードまたはモデル内のルートノードとしてフックできるかどうかを決定します。ブール値を返すクロージャとして指定します。これは、AST 内のノードの許可された位置を評価するときに MPS が毎回呼び出すものです。
インポートする言語
jmbaselanguage と jmlang.smodel 言語 - 制約を定義することができるようにするために、制約の態様では、インポート少なくとも二つの言語で最も可能性が高い必要があります。
子供になることができます
コンセプトのインスタンスが特定のノードの子になることが許可されていない場合、false を返します。
パラメーター | description |
---|---|
ノード | チェックしている子ノード (この概念の実例) |
parentNode | チェックしている親ノード |
childConcept | 子ノードの概念 (この概念のサブコンセプトになることができます) |
リンク | 子ノードの LinkDeclaration (そこから子供のロールを果たすことができます) |
親になることができます
概念のインスタンスが特定の概念ノード(特定のロール内)の親になることが許可されていない場合、false を返します。
パラメーター | description |
---|---|
childNode | チェックしている子ノード |
ノード | チェックしている親ノード (この概念の実例) |
childConcept | チェックしている子ノードの概念 |
リンク | 子ノードの LinkDeclaration |
先祖になれます
コンセプトのインスタンスが特定のノードの祖先になることが許可されていない場合、false を返します。
パラメーター | description |
---|---|
childNode | チェックしている子ノード |
ノード | チェックしている先祖ノード (この概念の実例) |
childConcept | 子孫ノードの概念 |
ルートになることができます
この制約は、ルート可能なコンセプトにのみ使用できます(インスタンスは、ルートがコンセプト構造の説明で true である場合があります)。概念のインスタンスが特定のモデルのルートになれない場合は false を返します。
パラメーター | description |
---|---|
モデル | ルートのモデル |
インスタンスアイコン
指定されたコンテキストで概念のノードを表すアイコンを返します。
パラメーター | description |
---|---|
ノード | アイコンを描画するノード。 |
プロパティの制約
技術的に言えば、「純粋な」概念プロパティは、本来の意味でのプロパティではなく、パブリックフィールドにすぎません。プロパティ制約を使用すると、実際のプロパティにすることができます。これらの制約を使用して、概念のプロパティの動作をカスタマイズできます。各プロパティ制約は、指定された単一のプロパティに適用されます。
property- この制約が適用されるプロパティ。
get- このメソッドは、プロパティにアクセスするたびにプロパティ値を取得するために実行されます。
パラメーター | description |
---|---|
ノード | プロパティを取得するノード |
set- このメソッドは、書き込みごとにプロパティ値を設定するために実行されます。プロパティ値は有効であることが保証されています。
パラメーター | description |
---|---|
ノード | プロパティを設定するノード |
propertyValue | 新しいプロパティ値 |
有効 - このメソッドは、プロパティの値が有効かどうかを判断する必要があります。このメソッドは値を変更する前に毎回実行され、false を返す場合、set() メソッドは実行されません。
パラメーター | description |
---|---|
ノード | プロパティをチェックするノード |
propertyValue | チェックする値 |
サンプル - 補完メニューの説明のカスタマイズ
完了メニューには、利用可能なノードと追加の説明情報が一覧表示されます。
追加情報をカスタマイズし、完了メニューにリストされている個々のオプションの詳細を提供するために、ターゲットコンセプトの shortDescription プロパティの getter をオーバーライドできます。
参照先の制約
このタイプの制約は、概念のリンクに動作を追加し、よりプロパティのように見えるようにできます。
リファレントセットハンドラー - 指定されている場合、このメソッドはこのリンクのすべてのセットで実行されます。
パラメーター | description |
---|---|
referenceNode | リンクを含むノード。 |
oldReferentNode | 参照の古い値 |
newReferentNode | 参照の新しい値 |
スコープ - このリンクが指すことができるノードのセットを定義します。このメソッドは Scope インスタンスを返します。詳細については、スコープドキュメントを参照してください。スコープ参照制約には 2 つのタイプがあります。
継承
参照
継承スコープは単にターゲット概念を宣言するだけですが、参照スコープはパラメーターからその場でスコープを計算する関数を提供します。
パラメーター | description |
---|---|
referenceNode | 実際のリンクを含むノードスマート参照を使用する概念のために新しいノードが作成されているときは null になる可能性があります。この状況では、enclosingNode のコンテキストで作成するノードの種類を決定するためにスマート参照が使用されるため、検索スコープメソッドは null referenceNode で呼び出されます。 |
contextNode | 参照を持つノード、または最も近い非 null コンテキストノード |
containmentLink | contextNode と作成中の存在しない子との親子関係を記述する SContainmentLink (referenceNode が存在する場合、このパラメーターは意味を持ちません。) |
linkTarget | このリンクが参照できる概念通常それは参照の概念のため、静的に知られています。subconcept で参照を特殊化し、特殊化参照の検索範囲を定義しない場合は、linkTarget パラメーターを使用して、どの参照の特殊化が必要かを判断できます。 |
位置 | contextRole のターゲットインデックス |
範囲が参照に設定されていない場合は、参照されている概念のデフォルトの範囲が使用されます。デフォルトのスコープも設定されていない場合は、「グローバル」スコープが使用されます。インポートされたすべてのモデルからの参照概念のすべてのインスタンスです。
プレゼンテーション (非推奨 - エディターアスペクトで参照のプレゼンテーションが指定されるようになりました。「エディター」を参照してください)) - ここでは、エディターおよび補完リストで参照がどのように表示されるかを指定します。コンテキストに応じて異なる方法で参照を表示すると便利な場合があります。例: Java では、インスタンスフィールド f へのすべての参照は、フィールドが同じ名前のローカル変数宣言によってシャドウされている場合、this.f として表示される必要があります。デフォルトでは、プレゼンテーションが設定されていない場合、参照ノードの名前がプレゼンテーションとして使用されます(INamedConcept の場合)。
パラメーター | description |
---|---|
モデル | 参照を含むノードのモデル |
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() メソッドの契約がわずかに変更されました。詳細...