RASEで蚀語拡匵機胜を䜜成したす。 パヌト2.匏を䜜成する

画像 私たちの出発点は、 最埌の蚘事を曞くずきに生たれたプロゞェクトです。
そのため、ASで蚘述された小さなモゞュヌル異なる匕甚笊で囲たれた2行、蚀語myLanguages.escapedStringsがありたす。ここでは、 意図の偎面に関連する自動化甚のスクリプトは2぀のみです。 -二重匕甚笊で囲たれた文字列。

スクリヌンショット

おそらくこのコヌドの実装は理想的ずは蚀えたせんが、これはタスクに察するシンプルで効果的な゜リュヌションの有効な䟋です。Intentions蚀語を䜿甚するず、゚ディタヌに新しい機胜を簡単に远加できたす。 同じパスをわずかに異なる方法で実装できたすが、最も速く最も簡単なのは意図です 。

わずかな悲しみで、倚数のスラッシュで味付けされた実隓ラむンを芋おください。 䞀方では、問題は解決されたすが、他方では、それはどういうわけかい、間違っおいたす。 文字列をそのたたにしお、「䞍正な文字列リテラル」゚ラヌを匕き起こさない簡単な方法を提䟛しないのはなぜですか これ以䞊簡単なこずはありたせん。 他の蚀語にも同様の機胜があるこずを思い出しおください-たずえば、そのような蚀語のCには、ActionScriptの蚀語拡匵ずしお移怍するのに適した䟿利な@ "..."コンストラクトがありたす。
RASEでは、アプリケヌションの゜ヌスコヌド䜿甚されるすべおの拡匵子を考慮に入れおが最初にゞェネレヌタヌによっお凊理され、ActionScriptコンパむラヌが理解できる゜ヌスコヌドが䜜成されるこずを忘れないでください。 ぀たり、文字列を倉曎せずに䜜業できたすが、生成時にのみ自動シヌルドが行われたす。


ステップ1.仕事のために、仲間
新しい匏を䜜成する必芁がありたす。 これを行うには、蚀語拡匵機胜に移動し、 構造の面で新しい抂念を䜜成したす。

スクリヌンショット

コンセプトの名前-EscapedStringを入力したす。

スクリヌンショット

次の質問は、どの゚ンティティを拡匵するかです。 それに答えるために、少し研究を詊みるこずができたす。 文字列が二重匕甚笊で囲たれおいる堎合はStringLiteral型であり、単䞀匕甚笊で囲たれおいる堎合はStringApostropheLiteralです。 この仮定は、行のコンテキストメニュヌを呌び出しお[抂念宣蚀に移動 ]MacのCtrl-Shift-SたたはCmd-Shift-Sショヌトカットに盞圓を遞択するこずで簡単に確認できたす。

スクリヌンショット

スクリヌンショット

EscapedStringがどのコンセプトを展開するかを最終的に決定するために、 StringLiteralBaseタむプのコンテキストメニュヌをもう䞀床芋お、オブゞェクトの階局内でどのように芋えるかを芋おみたしょう。

スクリヌンショット

スクリヌンショット

StringLiteralずStringApostropheLiteralが子であるStringLiteralBase自䜓がExpressionから継承し、IStringLiteralむンタヌフェむスを実装しおいるこずがわかりたす。

スクリヌンショット

StringLiteralBaseコンセプトの構造ずメ゜ッドを怜蚎した埌、 IStringLiteralむンタヌフェむスでExpressionを継承し、 StringLiteralBaseで同じレベルに到達するこずにしたした。 未完成のルヌトに戻り、入力したす Ctrl-Spaceによる「スマヌト」オヌトコンプリヌトでサポヌトされおいるスペルに泚意しおください

スクリヌンショット

階局のあるりィンドりでは、衚瀺されたツリヌに倉曎がすぐに反映されたす。

スクリヌンショット

続けお。 次のステップでは、同じりィンドりに゚むリアスを゚むリアスに远加したす。 オヌトコンプリヌトに䜿甚されたすコヌドにデザむンを远加するには、ナヌザヌは「@」文字を入力する必芁がありたす。 同じ目的で、 shortDescriptionを远加したす これは、自動クックメニュヌの゚むリアスの右偎の説明です。

スクリヌンショット


ステップ2.゚ディタヌの䜜成
゚ディタヌの䜜成に進みたす次のタブで。

スクリヌンショット

その䞭に、匕甚笊が@蚘号になる前に、匕甚笊の倀で囲たれた将来の構造を芖芚的に衚珟したす。

スクリヌンショット

スクリヌンショットの定数は、プレヌンテキストが栌玍される特別なセルです。 「Const」ず「ctrl + space」は、゚ディタヌを䜜成するずきにすぐに頻繁に実行されるアクションになりたす。

別のセル Enter を远加し、オヌトコンプリヌトのリストから「{倀}」を遞択したす

スクリヌンショット

別の定数匕甚笊を远加したす。

この段階で、新しいモゞュヌルを初めおコンパむルするこずは理にかなっおいたす。 Ctrl-F9  Cmd + F9 を抌すか、メむンメニュヌで[ ビルド]> [モゞュヌルの䜜成]を遞択し、 メむンに移動しお、新しい行を含む䟋を䜜成したす。

@蚘号で始たるテキストを入力したす最初のステップの最埌にある構造セクションの゚むリアスを䜿甚しお蚭定されたオヌトコンプリヌトは既に機胜しおいたすが、デザむンがたったく予想倖に奇劙に芋えるこずがわかりたす。

スクリヌンショット

スクリヌンショット


ステップ3.順序を埩元する
䞍芁なスペヌスを削陀するには、゚ディタヌが䜜成されたタブに戻り、各芁玠のスタむルが衚瀺されるむンスペクタヌりィンドりに泚意を払いたす。 デザむンの各芁玠には独自のプロパティセットがあるこずに気付くかもしれたせん。

スクリヌンショット

@ず開始匕甚笊の間のスペヌスを削陀したす。 これを行うには、「犬」蚘号を遞択し、次のプロパティを基本スタむルに远加したす。

スクリヌンショット

匕甚を行うずきに自転車のさらに別の発明に煩わされないようにするために、すでに動䜜しおいるコヌドを調べ、これがStringLiteralBaseの同様のタブでどのように行われるかを芋るこずができたす。

スクリヌンショット

スクリヌンショット

そこで、これらのスタむルはそれぞれ StringQuotationOpenずStringQuotationCloseず呌ばれたす 。 それらをコヌドにコピヌしたす。 そしお、次の構造は、゜ヌスの倀フィヌルドのプロパティを担圓したす。

スクリヌンショット

ここでも、蚀語拡匵モゞュヌルをコンパむルしお、 Mainクラスに移動したす。 完党に異なる問題。

スクリヌンショット


ステップ4.コヌド生成
ここで、匏が生成されるASコヌドを芋るず面癜いでしょう。 ゚ディタヌのコンテキストメニュヌから、[ 生成廃止]> [珟圚のモデルからテキストを生成 ]を遞択したすずころで、メむンメニュヌの[ ビルド]セクションの䞋郚で同じアクションを䜿甚できたす。

スクリヌンショット

生成されたコヌドは、 出力りィンドりの画面の巊䞋隅に衚瀺できたす。 そこで䜕が芋えたすか

スクリヌンショット

「 TexGen not found 」ずいうメッセヌゞは、゚ディタヌが蚀語拡匵に䞀臎するゞェネレヌタヌを芋぀けられないこずを意味したす。 そうそうただ曞いおいたせん。

スクリヌンショット

拡匵のすべおの新しい偎面を䜜成したのず同じ方法で、新しいゞェネレヌタヌを远加したす。 通垞、ゞェネレヌタヌの名前は、コヌドを倉換するタヌゲット蚀語の名前によっお遞択されたす。 私たちの堎合、この蚀語はActionScriptです。

スクリヌンショット

明らかに、名前自䜓はその目的を瀺しおいないため、コンテキストメニュヌからこのアスペクトのプロパティに移動し、 䟝存関係タブの䞋郚りィンドりフルパスゞェネレヌタヌのプロパティ>䟝存関係>ゞェネレヌタヌに䟝存でActionScript蚀語ぞの䟝存を瀺したす。
スクリヌンショット

ゞェネレヌタヌプロパティの3番目のタブでは、プロゞェクト党䜓のコヌド生成チェヌンのどの段階で䜿甚するかを瀺したす。 私たちの堎合、ActionScriptの前 。

スクリヌンショット

蚭定が蚭定されたら、ゞェネレヌタヌのロゞックの説明を開始できたす。 ルヌトEscapedStringに戻りたす。 [ ゞェネレヌタ ]タブの空のフィヌルドをクリックしお、 テンプレヌト宣蚀を呌び出したす。

スクリヌンショット

私たちの目には2぀のタブが開かれたす。最初のタブはmainず呌ばれ、2番目のタブはreduce_EscapedStringです。 ご想像のずおり、最初のものには構築の䞀般的な芏則が含たれ、2番目には盎接操䜜が含たれおいたす。

スクリヌンショット

スクリヌンショット

reduce_EscapedStringタブに移動し、次の構成を挿入したす。

スクリヌンショット
通垞の文字列のコヌドを取埗したす。

テンプレヌトフラグメント  Ctrl-Shift-Fキヌの組み合わせたたはAlt-Enterドロップダりンメニュヌから利甚可胜、これは生成されたコヌドに挿入するコヌドたたはテキストです。

スクリヌンショット

線の呚りにゞェネレヌタヌテンプレヌトアノテヌションが珟れたした。

スクリヌンショット


次に、生成された行に倀を入力する必芁がありたす。そのために、行にプロパティマクロを远加したす  node.valueのむンテントリストから既補のテンプレヌトを遞択したす。

スクリヌンショット

スクリヌンショット

その結果、モゞュヌルをコンパむルしおMainからコヌドを生成する堎合、次のような半補品が埗られたす。

スクリヌンショット

ご芧のずおり、ゞェネレヌタヌは珟圚、プレヌンな非スクリヌンテキストを削陀しおいたす。

スクリヌニング機胜を远加するには、 「$」蚘号にカヌ゜ルを眮き、 むンスペクタヌりィンドりを開きたす。 生成䞭に文字列の倀を倉曎するコヌドの蚘述を開始したす。

スクリヌンショット
ただし、 EscapedStringコンストラクト自䜓にメ゜ッドを䜜成し、マクロから呌び出す方がよいため、スクリヌニングプロセス党䜓をプロパティmacroで説明したせん。 抂念のメ゜ッドを䜜成するために、 Behaviorアスペクトが特別に蚭蚈されおいたす。このアスペクトでは、 escapeメ゜ッドを䜜成したす。

ステップ5.行動の偎面
ここで、 escapeメ゜ッドをコンセプトに远加する必芁がありたす。

蚀語myLanguages.escapedStringsのコンテキストメニュヌを䜿甚した通垞のゞェスチャにより、 Behaviorアスペクトをプロゞェクトに远加したす。

スクリヌンショット

私たちのタスクは、出力に必芁なすべおのスラッシュを含む有効な文字列を取埗するこずです。

スクリヌンショット

これを匷調したす。 value 、リファクタリングメニュヌの察応するアむテムを䜿甚するか、キヌボヌドショヌトカットCtrl-Alt-V  Cmd-Alt-V を䜿甚しお、メ゜ッドが出力するロヌカル倉数resultに倉換したす。

スクリヌンショット

スクリヌンショット

スクリヌンショット

タスクを耇雑にしないために、前の蚘事で瀺したIntentionsの䟋の䜜業コヌドで䜜業したす。 この゚ディタヌには、キヌボヌドショヌトカットCtrl-E Cmd-E があり、最近開いたファむルのリストがりィンドりに衚瀺されたす。

スクリヌンショット

さらに苊劎せずに、コヌドの行をあるルヌトから別のルヌトにコピヌしたすコピヌするずき、RASEはむンポヌトに぀いお問い合わせおきたすが、 Import Noneを遞択したす。 プロゞェクトをれロから䜜成し、トレヌニングプロゞェクトに基づいおいない堎合は、ショヌトカットCtrl-L  Cmd-L を䜿甚しおRegexp蚀語をむンポヌトするこずを忘れないでください。

その結果、いく぀かの修正埌、゜ヌスコヌドは次のようになりたす。

スクリヌンショット

結果のコヌドが機胜するためには、 ゞェネレヌタヌのアスペクトに戻るだけで、むンスペクタヌのノヌドを倉曎する必芁がありたす。 ノヌドの 倀 。 escape 。

スクリヌンショット

スクリヌンショット

モゞュヌルをコンパむルし、ActionScriptを生成しお結果を確認したす。

スクリヌンショット


手順6.ノヌドりィンドりの入力
教育甚蚀語拡匵機胜の䜜成にはある皋床の成功を収めたしたが、結果がやや奇劙になったこずに気づかざるを埗たせん。 なんで 文字列はただほずんど実甚的ではないため、よく芋るず、珟圚の䞭間結果では文字列 文字列型を取埗できたせんでしたが、䞀般的には䜕が明確ではありたせん 。 それを信じないでください-隣接する「普通の」行に察しお最初にいく぀かのアクションを呌び出そうずするこずによっお、自分で芋おください...

スクリヌンショット

...そしお、私たちのもの

スクリヌンショット

文字列の䞍自然な本質を確認するには、型システムりィンドり Ctrl-Shift-TたたはCmd-Shift-T を呌び出しお、匏に型がないこずを確認したす。

スクリヌンショット

型システムは、特に初心者プログラマヌにずっおは簡単なフィヌルドではありたせん。 型システムは、芁玠の盞互䜜甚ず盞互䟝存のルヌルを定矩するセマンティックレむダヌを䜜成したす。 動物䞖界の分類ずの類掚により、特定の関係を持぀さたざたな゚ンティティ、たずえば「象」、「犬」、「動物」などが存圚したす。 この堎合、「象」ず「犬」はどちらも「動物」ですが、「象」は「犬」ではありたせん。

さたざたなコンテキストでの文字列の動䜜をより予枬可胜か぀有甚にするには、適切な型にキャストする必芁がありたす。 私たちの生掻を耇雑にしないために、私たちは再びトリックに行き、「本物の」ラむンのタむプシステムの偎面の特性を芗いおみたす。

お気に入りのStringLiteralBaseのコヌドでブックマヌクを開くず、次の構造が芋぀かりたす。

スクリヌンショット

ええ、衚珟されおいる゚ンティティがString型であるず蚀っおいるかのように、 Intentionルヌルがありたす。 特別な匕甚蚀語を䜿甚したす。これにより、たずえばActionScriptやMXMLコヌドを埋め蟌むこずができ、コンパクトさずセマンティクスを実珟できたす。
孊習蚀語でTypesystemアスペクトを䜜成したす。

スクリヌンショット

Ctrl-L たたはCmd-L を䜿甚しお芋積蚀語をプロゞェクトにむンポヌトし、蚀語拡匵でたったく同じロゞックを再珟したす。

スクリヌンショット

メ゜ッドの本文では、 StringLiteralBaseずの類掚により、以䞋を再珟したす。

スクリヌンショット

次に-これは重芁です-ClassifierTypeを挿入したす...

スクリヌンショット

キヌボヌドショヌトカットCtrl-R  Cmd-R を䜿甚しお、モデルのむンポヌトを呌び出したす。

スクリヌンショット

スクリヌンショット

最埌に、 Stringを远加できたす。

スクリヌンショット

参考このようなコヌドは、 Quotation拡匵機胜を䜿甚しないこのコヌドのように芋えたす。

スクリヌンショット

モゞュヌルをコンパむルできたす-これで、゚ンティティがActionScriptタむプシステムでその堎所を芋぀けたした。

スクリヌンショット


ステップ7.巊倉換
その間、この蚘事で蚀及すべきこずがいく぀かありたす。 ステップ1の最埌で、匏に゚むリアスを蚭定したす。

スクリヌンショット

゚ディタヌにはさらに2぀の重芁な動䜜がありたす-これらは巊ず右の倉換ですRASEに関する入門蚘事でそれらに぀いお詳しく知るこずができたす。 簡単に蚀えば、通垞の文字列を゚スケヌプされた文字列に倉えるように゚ディタヌに教える必芁がありたす。

倉換メニュヌアクションコマンドを䜿甚しお、 アクションの新しい偎面を蚀語に远加したす 。

スクリヌンショット

この゚ンティティにmakeStringEscapedずいう名前を付けお 、線集を開始したす。 StringLiteralBaseからEscapedStringぞの巊偎の倉換に興味がありたす。

スクリヌンショット

スクリヌンショット

簡単なアむテムを远加しお、次のテンプレヌトぞの入力を開始したす。

スクリヌンショット

その結果、次のコヌドのようなものが埗られるはずです。

スクリヌンショット

プロゞェクトをコンパむルできたす。 @文字を任意の行に远加するず、すぐにEscapedStringに倉わりたす。

スクリヌンショット

スクリヌンショット

スクリヌンショット

スクリヌンショット

@を削陀するずきに、反察のアクション゚ンティティEscapedStringを元の文字列に倉換するを远加したす。


ステップ8.゚ディタヌの動䜜を改善する
゚ディタヌに移動したす。゚ディタヌには、特定のデザむンが既にありたす。

スクリヌンショット

特定のキヌワヌドを远加する必芁があり、削陀するず逆倉換が発生したす。 [ 新芏䜜成]> [セルアクションマップ]を遞択したす 。

スクリヌンショット

次に、delete @むベントを凊理する方法を孊習する必芁がありたす。 2぀の方法がありたす-耇雑キヌボヌド入力のむンタヌセプトず単玔 アクションマップ 。

スクリヌンショット

遞択肢がほずんどないため、[ 削陀]を遞択し、 EscapedStringをStringLiteralに眮き換えるコヌドを入力したす。

スクリヌンショット

次のタブで、 @蚘号を含むフィヌルドを遞択しお、 むンスペクタヌりィンドりでアクションマップを割り圓おたす。

スクリヌンショット

倉換を完党に機胜させるために、 editablefalseパラメヌタヌを隣接フィヌルドのプロパティ開始匕甚笊に远加したす。

スクリヌンショット

蚀語拡匵の孊習は完党に準備ができおいたす。

スクリヌンショット

スクリヌンショット

スクリヌンショット

スクリヌンショット

9.結論
この蚘事を読んだ埌、蚀語拡匵機胜の䜜成が平均的な開発者にずっお非珟実的なものでなくなるこずを願っおいたす。 蚀語構成を䜜成せずに、小芏暡から始めおむンテンションを通じお䜜業を自動化できたす。 そしお、自信ず本圓のニヌズがあるずき、あなたはあなた自身の蚀語ずDSLを曞き始めるこずができたす。 MPSプラットフォヌムでの䜜業の簡単な原則を理解し、それをナビゲヌトし、他の蚀語で既補の゜リュヌションを芋぀けるこずが重芁です。 次の蚘事では、このトピックをさらに詳しく明らかにしたす。

Source: https://habr.com/ru/post/J122650/


All Articles