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

クックブック - 型システム
推論ルール :このクックブックは、言語の型を設計する際の簡単な答えとガイドラインを提供するものです。型システムの詳細な説明については、ユーザーガイドの型システムセクションを参照してください。等価ノードのタイプを常に特定の具体的なタイプにする必要がある場合は、タイプ方程式を使用します。typeofコマ...

カスタム言語アスペクトクックブック
構造、エディター、型システムなどの通常の言語アスペクトと並んで、言語制作者はカスタム言語アスペクト(たとえば、インタープリター、代替型システムなど)を作成し、言語ランタイムに生成してから実行することができます。コードからこれらの生成されたアスペクトを使用してください。このドキュメントでは、MPSにバ...