言語拡張はプログラミングにおいて少し曲技飛行であるという確固たる信念があります。 この主題に関する出版物の数は絶えず増加していますが、それらの間でロシア語を話すことの割合は当然無視できるほど小さいです。 このシリーズの記事の目的は、Jetbrains MPSに基づいた開発環境で利用可能な言語拡張機能を使用して、一般的な日常のタスクを自動化する簡単で効果的な方法を示すことです。
私たちの場合、そのような環境はRealaxy ActionScript Editorであり、ベータ版は
こちらからダウンロードでき
ます 。 ただし、以下のすべては、いくつかの小さな詳細とともに、
MPSエディターでのJavaの言語拡張機能の作成にも適用できます。
どこから始めますか?
プラットフォームの可能性の最も単純で手頃な価格のアプリケーションは、対象言語の開発用に特別に調整されており、文字列の使用例を使用してコンテキスト拡張を作成することです。 トライアル拡張機能は、次のような場合に異なる引用符をスマートにシールドする問題を解決します。
文字列には一重引用符と二重引用符の両方が含まれます。 トレーニング言語拡張機能では、コンテキストに応じて、競合の原因となるエスケープ文字を提供する必要があります(二重引用符のエスケープは、シングルで囲まれた行に対してのみ適切であり、その逆も同様です)。 このようなデモンストレーションタスクは、単純な自動化スクリプトの作成からプラグインアーキテクチャの使用まで、さまざまな方法で解決できるという点で優れています。 この記事では、MPSの言語拡張機能の1つである
Intentionsを使用して解決します。
意図とは何ですか?
Intentionsメニューは、IDEAベースのエディターで最も一般的に使用される機能の1つです。 これは、言語の構文構造に適用可能な最も一般的な操作(たとえば、「
例外の追加 」、「
条件の反転 」、「
変数をフィールドに変換 」など)に簡単かつ迅速に状況に応じてアクセスできます。 意図メニューは、線の左側に表示される電球アイコンで示されます。
日常の作業では、何らかの形ですべての最新のIDEにデフォルトで存在するため、常に同様の機能に遭遇します。 RASE(実際、MPSまたはIDEA)では、現在の位置で利用可能なインテンションのリストは、キーボードショートカット
Alt-Enterを使用して呼び出すのが最も簡単です。
Jetbrains MPS Webサイトの公式ドキュメントから、その性質についてさらに
学ぶこと
ができます 。
言葉から行為に移る
1.最初に、新しいプロジェクトを作成します。
Main()関数に2行を挿入します。1行は一重引用符で囲み、もう1行は二重引用符で囲みます。
2.エディターにはいくつかの表示モードがあります。 デフォルトの
ActionScriptビューは比較的厳格で、開発者はASに直接集中できます。
MPSビューでは、同じ名前のプラットフォームから「継承によって」エディターによって継承され、非常に多くの可能性が明らかになります(特に、言語拡張機能を作成する場合)。
3.次に、プロジェクトのコンテキストメニュー(マウスの右クリックで開きます)で、新しい言語を追加します。
4.言語名(
myLanguages.escapedStrings )を入力し、[OK]をクリックします。
5.これらのアクションの後、
myLanguages.escapedStringsという名前の言語がプロジェクトの新しいルートとして正常に表示されます。
myLanguages.escapedStringsには、いわゆる
アスペクト (スクリーンショット:
structure 、
editor 、
constrains 、
typesystemなど)が既に含まれていることが
わかります。 後でそれらの使用方法について詳しく説明します。
6.キーボードショートカット
Alt-Enter を使用するか、
myLanguages.escapedStrings languageのコンテキストメニューから、[
言語のプロパティ ]ダイアログボックスを呼び出します。
7.表示されるウィンドウの[
依存関係 ]タブの[
拡張言語]フィールドで、
com.realaxy.actionScriptを選択し、[
OK ]をクリックします。 これは、ActionScript専用のこの教育言語拡張機能を作成することを意味します。
8.
意図のアスペクトを追加します。
Intentionは、選択した言語要素に対して特定のアクションを実行する一種の自動スクリプトです(この場合、
文字列リテラルで引用符をエスケープします)。
9.
意図宣言を作成します。
10.
EscapeQuotesという名前を付けて、
StringLiteralにバインドし
ます 。 次に、ブロックの
説明に 「エスケープクオート」という行
を書きます
11.重要な瞬間が来ています。
isApplicableコンストラクトの代わりに、
意図が準拠する条件を配置する必要があります。 このため、特別なトリックは不要です。オープンソース環境で作業し、エラーの強調表示と警告を処理するメカニズムがエディターでどのように機能するかを確認するだけです。 私たちの目標は、車輪を再発明することではなく、すでに正常に機能するコードを使用することです。 少し脱線し、それをのぞき見できる場所について考えてみましょう。 これを行うには、修正するエラーに目を向けます。
Main()の引用の多い行にカーソルを移動して、コンテキストメニューを表示します。
12.コンテキストメニューまたはキーボード
ショートカットShift-Ctrl-T (Mac-
Shift-Cmd-T )を使用して、[
タイプの表示]ダイアログボックスを呼び出します。 ほとんどすべてのシステムメッセージ(警告、情報、エラー)が何らかの形で型システムに関連しているため、AS開発で最も有用なものの1つと見なすことができます。
13.したがって、表示されるウィンドウには、オブジェクトの種類、タイプ、およびタイプ階層内の位置に関する情報が表示されます。 [
エラーの原因となったルールに移動 ]ボタンをクリックします(前のスクリーンショットからわかるように、時間を節約するために、このIDE機能にすぐに移動できます)。 表示されるタブに移動して、デザインを確認します。デザインから、
isCorrectが呼び出されたときに、関心のあるコードが実行される可能性が高いことが
わかります。 それにどうやって行くの?
14.
Ctrl (または
Cmd )ボタンを押したままメソッドの名前にカーソルを
合わせると、ハイパーテキストリンクを思い出させる下線が表示されます。 クリックすると、コードの開始点に進みます。 必要です。
15.次に、
isCorrectメソッドのコードをコピーし、
IntentionDeclarationタブに移動して
isApplicableメソッドに貼り付けて、必要に応じて条件を単純化および変更します。
16.ここで、
Intentionが呼び出されたときに実行されるコードを追加します。
executeメソッドで、
ノードの変更を記述し
ます。 価値17.停止します。 便宜上、正規表現を使用しないのはなぜですか? すぐに言ってやった。
Ctrl-L (Macでは
Cmd-L )の組み合わせを使用して、言語
regexpをインポートします。
18.その結果、次の構造が得られます...
19. ...適切な正規表現を挿入するためだけに残ります。
意図宣言全体は次のとおりです。
20.最後に、
意図をコンパイルできます。
Ctrl-F9 (Mac-
Cmd-F9 )を押すか、メインメニューで[
ビルド]> [モジュールの作成]を選択し、
メイン()に移動して、エラーを含む行で
Alt-Enterを押して言語拡張を実行します...何も起こらない。 問題は何ですか?
21.簡単です。言語拡張機能をコンパイルしましたが、プロジェクトにインポートしませんでした。 既によく知られている
Ctrl-L (Macの
Cmd-L )の組み合わせによると、この誤解を修正します。
22.繰り返しますが、「faulty」行の組み合わせ
Alt-Enterをクリックします。
23.そして、望ましい結果が得られます。
24.次にすべきことは好みの問題です。 これまでのところ、拡張機能は二重引用符で囲まれた文字列でのみ機能します。 単一引用符にもすばやく適用できるようにするため、最も簡単な方法は、Intention
Escape Quotes宣言を
Ctrl-D (
Cmd-D )で複製し、その中のデータ型、名前、引用符のみを変更することですする必要があります。
25.コードを少し調整します。
もちろん、よりコンパクトなコードを実現し、たとえば、引用符ごとに2つのルートではなく1つのルートを省くことができました。 ただし、主な目標がルーチンアクションの高速かつ効率的な自動化を得ることであったことを忘れてはなりません。この場合、この問題は簡単かつエレガントに解決されました。
26.ミッションが完了しました。
Ctrl-F9 (Mac-
Cmd + F9 )を使用してルートを再コンパイルした後、引用符をエスケープするための既製のスクリプトを取得します。 これが彼の仕事の結果です。
結論の代わりに
ご覧のとおり、Jetbrains MPSベースのエディターを使用して日常のタスクを自動化するのは簡単です。 結果として得られるソリューションは、他のプロジェクトに簡単に移行でき、言語拡張機能をプロパティに追加できます。
この記事で説明する機能は、LOPとDSLの世界への最初の一歩にすぎません。 それにもかかわらず、Intentions言語だけで、開発者が自分のタスクのために「今ここで」独自の本番インフラストラクチャを編成するには十分です。
そこで停止するつもりはなく、言語拡張機能の作成方法をさらに詳しく知りたい読者のために、更新プログラムに従うことをお勧めします。 次の記事では、さまざまな言語の側面をより広範囲に使用して、同じ問題を別の方法で解決します。
プロジェクトソースへのリンク。
Eugene Potapenko(
potapenko )に感謝します。この資料を書く際のあらゆる面での支援とサポートに感謝します。