MPS 2020.3 ヘルプ

カスタム言語アスペクトクックブック

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

カスタムアスペクトとは何ですか?

Language definitions in MPS can be thought of as a collection of aspects: structure, editor, typesystem, generator. Each of the aspects consists of declarations used by the corresponding aspect subsystem. For example, the type-system aspect consists of type-system rules and is used by the type-system engine.

Each aspect of a language is now defined in a separate aspect model. For example, the editor aspect of language L is defined in the L.editor model.

Each aspect is described using a set of アスペクトの主な言語 . E.g. there's the j.m.lang.editor language to describe the editor aspect.

アスペクトモデル内の宣言は、何らかの概念に結び付けられていてもいなくてもかまいません(概念のエディターが概念に結び付けられているように、ジェネレーターアスペクトのマッピング構成は結び付けられていません)。

アスペクトは、実行時、つまり言語が使用されるときにこのアスペクトを表す言語のアスペクトランタイムに生成できます。

バージョン 3.3 以降、MPS では言語の作者はその言語の新しい側面を定義することができます。

カスタムアスペクトの開発サイクル

  1. Create a language to describe the aspect - you may reuse existing languages or create ones specific to the needs of the aspect. For example, each of the core MPS aspects uses its own set of languages, plus a few common ones, such as BaseLanguage or smodel .

  2. この言語(そしておそらく他の言語)が他の言語の何らかの側面を記述していることを宣言する - アスペクト記述子を作成する

  3. 作成した言語でジェネレーターを開発してアスペクトの実行時クラスを生成する (必要な場合)

  4. アスペクトのランタイムを使用するアスペクトサブシステムを開発する

各ステップを詳細に説明します。

サンプルプロジェクトを見回す

If you open the customAspect sample project, you will get five modules.

Screen shot 2015 09 10 at 04 27 51

The documentation language and its runtime solution are used to define new documentation aspects for any other language, sampleLanguage utilizes this new aspect - it uses it to document its concepts. The the sandbox solution shows the sampleLanguage 's usage to view its documentation ability. The aspect subsystem is represented by the pluginSolution, which defines an action that shows the documentation for the concept of the currently focused node.

言語ランタイム

先に進む前に、実行時に言語の側面がどのように機能するのかを考えてみましょう。

  • For each language in MPS, a language descriptor is generated (the class is called Language.java ).

  • Given an aspect interface, the language descriptor returns a concrete implementation of this aspect in this language (let's call it AspectDescriptor ).

  • The AspectDescriptor can be any class with any methods, the only restriction is that it should implement a marker interface ILanguageAspect. We suggest that an AspectDescriptor contains no code except getters for entities described by this aspect.

これは典型的な言語ランタイムがどのように見えるかです:

Screen shot 2015 09 10 at 00 33 07

The createAspect() method checks the type of the parameter expecting one of interfaces declared in aspects and returns a corresponding newly instantiated implementation.

これは、アスペクトで定義されたインターフェースがどのように見えるかです(この例はインテンションアスペクトで定義されています)。

Screen shot 2015 09 10 at 00 30 32

言語の側面を使う

Now, let's suppose we would like to use some of the aspects. E.g. while working with the editor, we'd like to acquire a list of intentions, which could be applied to the currently selected node.

  1. 最初に、インポートされた言語に対応するすべての言語ランタイムを見つけます。

  2. それから、それらそれぞれのインテンション記述子を取得します。

  3. そして最後にディスクリプタからすべてのインテンションを取得し、それらが現在のノードに適用可能かどうかをチェックします。

全体的なスキームは: 言語 - > LanguageRuntimes-> 必要なアスペクト - > このアスペクトから欲しいものを入手

そのため、呼び出し側がそれを把握できるようにするために、カスタムアスペクトをこの検出メカニズムにフックする必要があります。

カスタムアスペクトの実装

Let's look in detail into the steps necessary to implement your custom aspect using the customAspect sample project:

  1. To make MPS treat some special model as a documentation aspect (that is our new custom aspect), an aspect declaration should be created in the documentation language. To do so, we create a plugin aspect in the language and import the customAspect language.

    Screen shot 2015 09 09 at 23 55 58

  2. 言語のプラグインモデルにアスペクト宣言を作成し、そのフィールドに入力します。これは MPS にこの言語が他の言語のための新しいカスタムアスペクトを実装するために使われることができることを伝えます。undefined

    Screen shot 2015 09 10 at 00 01 41

  3. After making/rebuilding the documentation language, it's already possible to create a documentation aspect in the sample language and create a doc concept in it.

    Screen shot 2015 09 10 at 00 05 02

  4. Screen shot 2015 09 10 at 00 09 41

  5. Now, we should move to the language runtime in order to specify the functionality of the new aspect as it should work inside MPS. In our example, let's create an interface that would be able to retrieve and return the documentation for a chosen concept. To do so, we create a runtime solution, add it as a runtime module of our documentation language and create an interface in it. Note that the runtime class must implement the ILanguageAspect interface. To satisfy our needs, the method must take a concept as a parameter and return a string with the corresponding documentation text.

    Screen shot 2015 09 10 at 00 17 23

  6. In the generator for the documentation language we now need to have an implementation of the interface from above generated. A conditional root rule and the following template will do the trick and generate the documentation descriptor class:

    Screen shot 2015 10 27 at 17 57 32

    The condition ensures that the rule only triggers for the models of your custom aspect, i.e. in our case models that hold the documentation definitions (jetbrains.mps.samples.customAspect.sampleLanguage.documentation ).
    The useful feature here is the concept switch construction, which allows you to ignore the concept implementation details. It simply loops through all documented concepts (the LOOP macro) and for each such concept creates a matching case (exactly ->$[ConceptDocumentation]) that returns a string value obtained from the associated ConceptDocumentation.

  7. So we have an interface and an implementation class. Now, we need to tie them together - we have to generate the part of the LanguageRuntime class, which will instantiate our concept, i.e. whenever the documentation aspect is required, it will return the DocumentationDescriptor class. To understand how the following works, look at how the class Language.java is generated (see Language class in model j.m.lang.descriptor.generator.template.main ). The descriptor instantiation is done by a template switch called InstantiateAspectDescriptor, which we have to extend in our new aspect language so that it works with one more aspect model:

    Screen shot 2015 10 27 at 18 00 22

    Essentially, we're adding a check for the DocumentationAspectDescriptor interface to the generated Language class and return a fresh instance of the DocumentationDescriptor, if the requested aspectClass is our custom aspect interface.

  8. 残っているのは私たちの新しい側面を使うことだけです。そのためには、カーソルがオンデマンドでオンになっているノードの概念に関するドキュメントを表示するアクションを作成する必要があります。undefined

    Clx202


    The model must be imported in order to be able to specify the context parameters. The action must be created as part of a (newly created) plugin solution (more on plugin solutions at プラグイン ) with a StandalonePluginDescriptor and hooked into the menu through an ActionGroupDeclaration:
    Clx201

  9. Clx200

    This way the IDE コード menu will be enhanced.

  10. Let's now try it out! Rebuild the project, create or open a node of the DocumentedConcept concept in the sandbox solution and invoke the ドキュメントの表示 action from the コード menu:

    Screen shot 2015 09 10 at 04 22 19

関連ページ:

プラグイン

プラグインは、コードを MPS IDE 機能と統合する方法です。jetbrains.mps.lang.plugin および jetbrains.mps.lang.plugin.standalone 言語は、プラグインで使用できるいくつかのルート概念を提供します。この章では、それらすべてについて説明します。プラグインのインスタンス化:プラグインを開発している間、プラグインを保持するソリューションがあり、その効果を確認するために各変更の後に MPS を再起動する必要がないようにプラグインクラスを自動的に...

インタープリタークックブックの作成

バージョン 3.1 以降 MPS にバンドルされている Shapes サンプルプロジェクトを確認してください。エディターでいくつかの凝ったトリックを行うことができます。サンプルプロジェクトは、最初の実行時に MPS によって自動的にインストールされ、$USER_HOME/ MPSSamples に配置する必要があります。デフォルトでは、エディターは、キャンバス上に指定されたサイズと色の視覚的形状を描画するためのコマンドで構成されるプレーンコードを表示します。コードを Java に生成して実行するこ...

カスタム持続クックブック

このドキュメントでは、MPS にバンドルされている xmlPersistence サンプルを使用して、独自の永続化形式を定義、デプロイ、使用する方法を説明します。カスタム永続性とは何ですか? :MPS は通常、モデルを独自の XML ベースの形式で保存します。ただし、独自の形式でモデルファイルをロードまたは保存する場合があります。スタブモデルこれらは読み取り専用モデルであり、通常はライブラリコードを表します。たとえば、MPS を利用して既存の言語の 1 つを記述したいとします。たとえば、BaseLan...