インタープリタークックブックの作成
バージョン 3.1 以降 MPS にバンドルされている Shapes サンプルプロジェクトを確認してください。エディターでいくつかの凝ったトリックを行うことができます。
デフォルトでは、エディターは、キャンバス上に指定されたサイズと色の視覚的形状を描画するためのコマンドで構成されるプレーンコードを表示します。
コードを Java に生成して実行することができます。これにより、上記のコードから生成されたばかりのアプリケーションを実行する新しい Java プロセスが起動します。
ただし、MPS は Java を生成せずにコードを解釈することもできます。コード内の任意の場所で Alt+Enter を押してインテンションポップアップメニューを呼び出し、「シーンのプレビュー」を選択します。コードを解釈しているシーンを含む新しいフレームが表示されます。
インスタントプレビュー
コードを解釈する機能により、エディターはインタープリターの結果をエディターを通じて開発者に返すことができます。個々の図形を解釈して、それぞれの図形を定義するコードの横にあるエディターで描画できます。
または、シーン全体をコードの横に描画して、コードに加えられた変更に即座に対応することもできます。
これらの機能を試してみるには、エディターを右クリックして Push Editor Hints を選択し、エディターに有効にするプレビュー機能を示すヒントを選択します。
これは簡単なお誘いでした。そのような単純な解釈機能をあなたの言語に組み込む方法を見ることができます。
インタープリターの定義
MPS は主にコード生成に焦点を当てています。AST として表されるプログラムは、ターゲット言語のコードに翻訳され、それがコンパイルされて実行されることがあります。しかしながら、あなたのコードを直接解釈することがより良い選択肢であるかもしれない状況があります。開発者に、コードが何をするのかのある種のプレビューを与えることができ、それによって彼らのコード変更への即時のフィードバックを提供することができます。実行時にのみ表示されるエラーを検出して報告することも、生成フェーズとコンパイルフェーズを迂回してコード実行修正サイクルの所要時間を短縮することもできます。
MPS には、現時点ではインタープリターを構築するためのインフラストラクチャは付属していませんが、言語の動作の側面により、独自にインタープリターを構築することができます。理想的には、コードジェネレーターと同様に、インタープリターのランタイムクラスを保持するランタイムソリューションを作成します。言語概念の動作の側面は、ランタイムクラスと連携して AST を適切に移動し、モード内のすべてのノードを解釈します。
Shapes 言語がどのようにコードの解釈を可能にしたかを見ていきます。
全シーンインタープリター
ユーザーがインテンションによって明示的にインタープリターを呼び出すシナリオから始めましょう。まず、インテンションを作成する必要があります。
インテンションキャンバスの行動態様に定義されているキャンバスノードに interpret() メソッドを呼び出します。
このメソッドは、カスタマイズされた paintComponent() メソッドでパネルを保持する新しいフレームを作成します。パネルは他のプレビュー機能で再利用されているため、別のヘルパークラス PreviewFactory に抽出されています。些細な場合を除いて、クラスはランタイムソリューションに配置する必要がありますが、ここでは、言語の動作の側面に直接配置しました。
現在のモデルは次のコードでトラバースされます: thisCanvas.shapes.forEach({ 〜 it => it.drawShape(graphics)});。ここでインタープリターが行われます。drawShape() メソッドは、各 Shape サブコンセプトによって実装されているため、画面にレンダリングできます。モデルへの読み取り権限が保証されるように、トラバーサルコードが ReadAction 内にラップされていることに注意してください。
drawShape() メソッドは、すべてのシェイプで実装する必要があります。
これで私たちの小さなインタープリターが立ち上がるのに十分です。
形状プレビュー
コード内の定義の横にある個々の図形をプレビューするには、エディターを変更するか、異なるエディターヒントを使用して新しいエディターを定義し、図形の視覚化を含むスイングコンポーネントを保持する必要があります。サンプルでは、複数の射影を活用することを選択しました (複数の射影が MPS でどのように機能するかについては、マルチ射影ビデオ(英語)を参照してください)。そのため、ヘッダーに ShapePreview ヒントを指定して新しいエディターを作成しました。ユーザーが ShapePreview ヒントを有効にした場合にのみ、デフォルトのテキストのみのエディターの代わりにこのエディターが使用されます。
スイングコンポーネント は JPanel を定義します。これは、paintComponent() メソッドでモデルの読み取りロックを取得し、特定の場所に現在のシェイプノードを描画します。新しい drawShapeAt() 方法は、キャンバス内でのそれらの定義された位置を無視して図形を描画する図形に追加されていることに注意してください。
シーンプレビュー
シーン全体をプレビューするには、Canvas コンセプトの新しいエディターを作成し、ScenePreview エディターのヒントにフックする必要があります。
スイングコンポーネントセルには、カスタマイズされた JPanel が含まれています。これは、以前に明示的なユーザーリクエストで解釈したときと同じように、PreviewFactory クラスによって再度作成されます。
これで終わりです。それを好きだったことを望みます。
関連ページ:
クックブック
推論ルール:このクックブックは、言語の型を設計する際の簡単な答えとガイドラインを提供するものです。型システムの詳細な説明については、ユーザーガイドの型システムセクションを参照してください。等価ノードのタイプが常に特定の具体的なタイプである必要がある場合は、タイプ方程式を使用します。typeof コマンドを使用して、目的のノードのタイプが特定のタイプと等しくなければならないことを宣言します。rule typeof_StringLiteral { applicable for concept = S...
カスタム言語アスペクトクックブック
構造、エディター、型システムなどの通常の言語アスペクトと並んで、言語生産者はカスタム言語アスペクト(たとえば、インタープリター、代替型システムなど)を作成し、言語ランタイムに生成してから実行することができます。コードからこれらの生成されたアスペクトを使用してください。カスタムアスペクトとは何ですか? MPS の言語定義は、構造、エディター、型システム、ジェネレーターといったアスペクトの集まりと考えることができます。各アスペクトは、対応するアスペクトサブシステムによって使用される宣言で構成されていま...