MPS 2023.3 ヘルプ

説明コメント

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

計算機の言語

実験のテストベッドとして計算機のチュートリアル言語を選択しました。MPS ディストリビューションに付属するサンプルプロジェクトのセットに含まれている電卓チュートリアルプロジェクトを見つけることができます。続行する前に、チュートリアルをざっと読んで言語に慣れることをお勧めします。

フィールドへの変更

入力フィールドと出力フィールドに説明的なコメントを追加するための機構の構築を始めましょう。私たちのアプローチは、生成されたコードだけでなくノードに追加されたときにそれらの外観に影響を与えるアノテーションに基づいています。私たちの望む機能を可能にするいくつかの重要な要素があります。

  • どのノードが説明コメントを保持できるかを示すマーカーインターフェース

  • ノードが説明コメントを保持しているかどうか、および説明が何であるかを示すためのアノテーション自体

  • キャレット配下のノードに説明コメントをすばやく追加および削除するためのキーボードショートカットを提供するアクション

  • 記述されたコンポーネントの視覚的な「ツールチップ」を生成するためにコード生成プロセスを更新する

すべてのコメント可能なノードをマークするための新しいインターフェースから始めます。

Marking the nodes

ここで、InputFieldOutputField の両方の概念で、新しい ICanHaveDescription インターフェースを実装する必要があります。

Implementing the ICanHaveDescription interface

DescriptionAnnotation のコンセプト

パズルの核心部分、つまり説明のコメントを指定するための入力フィールドと出力フィールドに起因する実際のアノテーションはまだ欠落しています。今それを作成しましょう:

Creating the description

コンセプトに NodeAttribute を拡張させると、MPS は、属性の詳細を示す詳細情報を提供するようにヒントを提供します。Alt+Enter を介してクイックフィックスを呼び出すと、カスタマイズに必要な情報が追加されます。

Invoking a quick-fix

ロール属性付きの概念の値を設定して、新しいアノテーションの追加の品質を指定する必要があります。アノテーションのロール を descriptionComment として設定します。これは、ノードに DescriptionAnnotation のアノテーションが付けられているかどうかを確認するために、クエリで使用する名前です。また、アノテーションは ICanHaveDescription を実装するノード(この場合は InputFieldOutputField)に のみ帰属できることも示しています。

Specifying additional qualities

DescriptionAnnotation には、説明の実際のテキストも保存する必要があります。これには、文字列プロパティ descriptionText を使用します。

Adding the description text

DescriptionAnnotation のエディターは、説明コメントが添付されたノードの視覚的な動作を定義する重要な要素です。アノテーションが付けられたノードの先頭に「described」定数を追加し、括弧で囲まれた実際の説明テキストを追加します。属性付きノードセルは、属性が添付されているノードである実際のノードのエディターを表します。

Attaching to a node

さらなるエディターの機能強化

ノードの説明コメントのオンとオフを切り替えるために、新しい KeyMap を作成します。

Creating a new key map

コードを編集するには、BaseLanguagesmodel の概念を使用します。これらは、デフォルトで使用可能になっているはずです。そうでない場合は、Ctrl+L を介してインポートします。初期化されたノードを簡単に作成するために、アクション言語も必要になります。これはおそらく明示的にインポートする必要があります(Control + L)。

Adding an import statement

これでアクションを完了できます。

Completing the action

ICanHaveDescription を実装しているノードで Control + Alt + Shift + D を押すと、アクションはノードとの間で DescriptionAnnotation を追加または削除します。

KeyMap は、Control + Alt + Shift + D に反応する必要があるすべてのフィールドに追加する必要があります。この場合、これは InputField と OutputField に対するものです。Control + Alt + Shift + D キーの組み合わせに反応するエディターセルには、keycap プロパティで指定されたキーマップが必要です。

Adding the key map to all fields

これまでどのようにしていますか?

コンパイル後、入力フィールドと出力フィールドの両方で Control + Alt + Shift + D を使用して、説明コメントを切り替えることができます。

Toggling the description comment

ジェネレーターを更新する

現在、DescriptionAnnotation は生成プロセス中に失われます。代わりに、コメント化された入力フィールドと出力フィールドを表すテキストフィールドの Swing「ツールチップ」を生成したいと考えています。

Updating the generator

コードを生成するときは、現在電卓のすべての入力フィールドまたは出力フィールドを受け取り、それらのフィールドの JTextField を生成します。コンストラクターでは、生成された JTextField ごとに初期化コードも生成します。これが、説明コメント付きの入力フィールドまたは出力フィールドを表す JTextField に Swing "tooltip" をアタッチできる場所です。

Creating JTextFields

$IF$ ノードマクロは、DescriptionComment アノテーションが添付されたノードに対してのみ「ツールチップ」が生成されるようにします。

Adding a macro

「ツールチップ」のテキストのプロパティマクロは、現在のノードに添付されている DescriptionAnnotationdescriptionText を設定します。

Property macro

言語とサンドボックスソリューションを再構築すると、生成された Calculator フォームには、DescriptionAnnotation でマークされたフィールドに「ツールヒント」が添付されます。

Resulting tooltip

要約

ここでツアーを終了できます。入力フィールドと出力フィールドは両方とも、DescriptionAnnotation で記述でき、生成されたコードには、それぞれの記述の「ツールヒント」が含まれます。

関連ページ:

構造

MPS を使用すると、目的の言語の文法を定義する必要がなくなるため、言語の構造を指定するためのさまざまな方法が明らかに必要になります。ここで構造言語が役に立ちます。それはあなたに言語構造を定義するためのすべての手段を与えます。前に説明したように、MPS でコーディングする場合、AST を直接効果的に構築しているため、言語の構造では、AST の構築に使用する要素であるブリックを指定する必要があります。プロパティ、参照、および子供: レンガをコンセプトと構造言語が公開の概念と概念インターフェースだけ...

汎用プレースホルダーと汎用コメント

汎用プレースホルダー:汎用プレースホルダーは、2 つのノード間の空白を表し、任意のノードコレクションに追加できます。キーの組み合わせは、コレクション内の現在の位置にプレースホルダーを挿入します。プレースホルダーは透過的に動作します。プレースホルダーノードの補完メニューを呼び出してノードを置き換えるか、Enter キーを押して通常のノードを次の兄弟の位置に追加することができます。たとえその言語がそのような概念をサポートしていなくても、どの言語の汎用プレースホルダーユーザーを使用しても、任意の視...

MPS 電卓言語チュートリアル

このチュートリアル導入、テンプレートの実装、導入このチュートリアルでは、MPS での言語デザインのさまざまな分野について説明します。単純なスタンドアロン言語の抽象的な構造を定義し、そのためのエディターを設計し、タイプを制限し、スコープを作成し、最後に Java コードを生成するジェネレーターを準備します。以前の MPS への露出に応じて、このチュートリアルでは完了までに約 1 日かかります。このチュートリアルでは、主に MPS を評価する必要のある言語デザイナーを対象とし、ベアボーンの例以外のも...

要求追跡言語

このクックブックでは、要件追跡サンプルプロジェクトについて説明します。このサンプルプロジェクトは、言語にとらわれない要求追跡を実装しています。その過程で、いくつかの便利な言語構成要素が例示されています。異なる言語のノードにアノテーションを付けるノード属性、コンセプトごとの複数のエディター(プレゼンテーション)とエディターヒントによるそれらの切り替え、選択されたエディターへのプログラムによるアクセスヒントとエディターのプログラムによる選択、参照のコレクションでの繰り返しを避けるための参照スコープ、...

スコープ

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