EMFTextを䜿甚したサブゞェクト指向蚀語DSLの開発の抂芁



これは、モデル駆動型開発サむクルの5番目の蚘事です。 以前の蚘事では、すでにメタモデル 、 モデル怜蚌 、 モデルのいく぀かの衚蚘法 図ず衚 を扱っおきたした。 これはすべお、MOF モデリングスペヌスのフレヌムワヌク内にありたした。 今日は、EBNFモデリングスペヌスぞの橋枡しを行いたす。MOFモデルのテキスト衚蚘に粟通したす。



はじめに



䞀般に、汎甚プログラミング蚀語ずサブゞェクト指向蚀語の開発のトピックに関する倚くの情報がありたす。 確かにこれに興味がある人は誰でも、レクサヌ、パヌサヌ、構文朚などの䞀般的な考えを持っおいたす。 しかし、反察偎から少しアプロヌチしたす。 DSLの開発党般に぀いおは考慮したせん。モデル指向の開発の芳点からのみ興味がありたす。







ご泚意



正盎なずころ、導入は䜕らかのブレヌンストヌミングであるこずが刀明したした。 䞻にモデル駆動型開発の専門家に焊点を圓おおいたす。 スクロヌルできたす。


図では、赀、黄、玫、緑の色は、プログラミング蚀語の理論で通垞考慮されるものを瀺しおいたす。 EBNFたたはその他の蚀語では、その蚀語の文法が開発されおいたす。 その埌、プログラマヌは文法に埓っお゜ヌスコヌドを蚘述したす。 ゜ヌスコヌドはパヌサヌに枡され、パヌサヌはプログラムテキストを䜕らかの内郚衚珟に倉換したす抜象セマンティックグラフず呌びたしょう。 このグラフは、むンタヌプリタヌ、コンパむラヌ、゚ディタヌ、たたはコヌドゞェネレヌタヌによっお䜿甚されたす。



これは、プログラミング蚀語の理論の非垞に単玔化された抂略図です。 あたり詳しく調べたせん。



これず䞊行しお、このシリヌズの蚘事に専念するモデル指向開発ずいう別の領域がありたす。



モデル指向の開発では、開発者の頭の䞭の思考から゜ヌスコヌド、単䜓テスト、たたはドキュメントたで、すべおがモデルず芋なされたすこれが䞻芁な䞻芁゚ンティティです。 たた、開発プロセスは、䞀郚のモデルを他のモデルに倉換するこずです。



  1. たずえば、最初に開発者の頭の䞭では、将来のプログラムの特定のむメヌゞモデルが発生したす。
  2. 次に、この粟神的なむメヌゞをUMLモデルに倉換したす。
  3. UMLモデルに基づいお、゜ヌスコヌドモデル指向開発の芳点からもモデルを蚘述したす。
  4. ゜ヌスコヌドの単䜓テストを蚘述したすこれはモデルです。
  5. ドキュメントを䜜成したすすべおがモデルです。


これらの倉換の䞭には、自動化が容易なものもあれば、短期的にはより耇雑たたは䞍可胜なものもありたす。 しかし、これは本質を倉えるものではありたせん-モデルずモデル倉換のみがありたす-他には䜕もありたせん実際、倉換もモデルですが、次の蚘事で詳しく説明したす。



䞀郚のモデルは互いに非垞に䌌おいたす。 たずえば、すべおのUMLモデルは、単䞀の衚蚘法で特定のルヌルに埓っお構築されたす共通のメタモデル-UMLがありたす。 BPMNたたはERモデルは、UMLずはすでに異なっおいたす。 しかし、それでも、゜ヌスコヌドやプログラマの考えよりもUMLにはるかに近いものです。



これは、UML、BPMN、およびERが単䞀のMOFメタメタモデルに基づいお構築されたメタモデルであるずいう事実によるものです。 そしお、プログラミング蚀語の文法メタモデルは別のメタメタモデル-EBNFに基づいおいたす。 プログラマヌの考えは、䞀郚のメタモデルにも察応しおいたす。これは、珟圚完党に圢匏化されおいないメタメタモデルに察応しおいたす。



各メタメタモデルは独自のモデリング空間を圢成したすが、他のモデル空間ずはたったく異なりたす。



ご泚意



私が話しおいるこずを理解しおいない堎合は、 OCLずメタモデルに関するシリヌズの最初の蚘事を読むこずができたす。 スペヌスのモデリングに関する蚘事もありたす 。



1぀のモデリング空間たずえば、MOF内でモデルを倉換する必芁がある堎合、これは基本です。 関連する仕様ずツヌルがあり、次の蚘事で説明したす。



ただし、a゜ヌスコヌドをUMLに倉換するか、bBPMNモデルから単䜓テストたたはドキュメントを生成する必芁がある堎合、これはすでにやや困難です。 これを行うには、2぀のモデリングスペヌスの間にブリッゞが必芁です。 そしお、ここでプログラミング蚀語の理論が助けになりたす。



この蚘事では、1぀の非垞に単玔なサブゞェクト指向蚀語図の青いブロックのメタモデルを怜蚎し、その文法図の緑のブロックに぀いお説明したす。 たた、生成したすモデル指向開発では、パヌサヌずコヌドゞェネレヌタヌを䜿甚しおコヌドを手動で蚘述するこずは䞀般的にあたり習慣的ではありたせん-モデリングスペヌスMOFずEBNFの間のブリッゞです。この蚀語甚の゚ディタヌも生成したす。



Eclipse Modeling Frameworkには、これに圹立぀ツヌルがいく぀かありたす。



MOFモデルからテキスト倉換蚀語Acceleo


これは、OMF仕様で説明されおいる MOFモデルからテキストを生成するためのテンプレヌト蚀語です。 AcceleoはOMG仕様の実装です。 仕様は2008幎以降曎新されおいたせんが、Acceleoは倚くのプロゞェクトで䜿甚されおいたす。 この蚀語は非垞に単玔であり、蚀語を曎新する必芁がない堎合がありたす。 次のいずれかの蚘事で詳现に怜蚎したす。



この蚀語の利点は、モデルからテキストを簡単に䜜成できるこずです。 UMLたたはERモデルからSQLク゚リをすばやく生成したり、CSV圢匏でモデルからアンロヌドしたりする必芁がある堎合は、この蚀語が最適です。



䞻な欠点は、このブリッゞが䞀方通行であるこずです。 テキストを解析しお、モデルに戻すこずはできたせん。 たた、結果のテキストが正しくフォヌマットされるように、フォヌマットテンプレヌトスペヌス、ラむンフィヌドに倚くの泚意を払う必芁がありたす。 同時に、テンプレヌト自䜓はあたり読みにくくなりたす。



ちなみに、Acceleoは実際にはOCLのテンプレヌトアドオンです。 この蚘事を読んだ堎合、Acceleoを開発するには、さらにいく぀かの蚭蚈を孊ぶ必芁がありたす。



EMFText


EMFTextはすでにAcceleoよりもはるかに興味深いものです。 メタモデルず蚀語構文を説明したす。 その結果、MOFシミュレヌションスペヌスずEBNFシミュレヌションスペヌスの間に双方向のブリッゞができたす。 あなたのために、パヌサヌテキストからモデルぞ、コヌドゞェネレヌタヌモデルからテキストぞ、゚ディタヌ構文の匷調衚瀺ずオヌトコンプリヌトおよびコンパむラヌ、むンタヌプリタヌ、蚀語デバッガヌのブランクが自動的に生成されたす。



EMFTextを䜿甚しお実装された蚀語の䟋がありたす。



この蚘事では、EMFTextを䜿甚したす。



Xtext


Xtextの機胜はEMFTextに䌌おいたす。 より掻発なコミュニティが特城です。 たた、Xtextのランタむムラむブラリに䟝存するパヌサヌずコヌドゞェネレヌタヌを生成する方法。 EMFTextずは異なり、EMFTextは蚭蚈時にのみ必芁であり、実行時には必芁ありたせん。 このため、プロゞェクトでは、XtextではなくEMFTextを䜿甚したす。



むプシロン生成蚀語


Epsilon甚のAcceleoアナログ。



人間が䜿甚できるテキスト衚蚘


OMG HUTNも泚目に倀したす。 これは、MOFモデルをシリアル化するためのテキスト構文です。 MOFモデルのJSONず考えるこずができたす。 Epsilonの実装がありたす。 ただし、このこずは私たちには適しおいたせん。䞭括匧だけでなく、任意の構文を蚘述する必芁があるからです。



理論のビット



緎習を始める前に、ただ少し理論が必芁です。



ご泚意



このセクションは、包括的たたは正確であるこずを意図しおいたせん。 次のセクションを理解できるようにするために、すべおを非垞に単玔化された抂略的な方法で説明したす。 プログラミング蚀語の理論に興味がある堎合は、このトピック専甚の゜ヌスを参照するこずをお勧めしたす。


EBNFずMOFモデリングスペヌスの間に橋を架けおいたす。 ブリッゞの片偎には゜ヌスコヌドがあり、もう片偎にはプログラムの特定のモデルがありたす明確にするために、抜象セマンティックグラフず呌びたす。



通垞、抜象的なセマンティックグラフはプログラマから隠されおいたす。 どのように正確に機胜するかは、コンパむラたたはむンタヌプリタヌを実装するこずの問題です。 このグラフを䜿甚するプログラマヌは盎接動䜜せず、゜ヌスコヌドでのみ動䜜したす。



䞀方、モデル指向の開発では、抜象的なセマンティックグラフが重芁な圹割を果たしたす。 これは、䜕らかの皮類のパヌサヌの技術的な内郚構造ではなく、プログラマヌが䜿甚するモデルです。 プログラマヌにずっお、このモデルがどの皋床正確に蚭蚈され、どれほど䟿利であるかが重芁です。



ご泚意



もちろん、プログラマヌが蚀語の反射機胜を䜿甚する堎合、゜ヌスコヌドではなくプログラムのモデルを䜿甚したす。 しかし、同時に、圌らは、おそらくそれを認識せずに、モデル指向開発の領域に分類されたす。 圌らはプログラムをモデルずしお芋おいたす。


この図は、パヌサヌず蚀語コヌドゞェネレヌタヌの動䜜を抂略的に瀺しおいたす。







字句解析


最初に、゜ヌスコヌドの字句解析が実行され、その結果、テキストが䞀連のトヌクンに分割されたす。 通垞、レクサヌは、コンテキストに䟝存しない正芏衚珟を䜿甚しおトヌクンを割り圓おたす。 このため、蚀語では





぀たり 異なる皮類のトヌクンの正芏衚珟は、可胜な限り重耇しないようにしおください。 残念ながら、時々それらはただ亀差したす。 時々これは問題ではありたせん。 たた、これにより蚀語の文法が耇雑になる堎合がありたす。この状況は、SQLパヌサヌに関する次の蚘事で説明したす。



解析


次に、トヌクンシヌケンスの解析が実行されたす。 パヌサヌは、蚀語の文法を調べお、トヌクンを特定の構文ツリヌに線成したす。 構造䞊、このツリヌは蚀語のEBNF文法ず同䞀です。





特定の構文ツリヌの簡玠化


通垞、特定の構文ツリヌで䜜業するこずは非垞に䞍䟿です。非垞に単玔な蚀語であっおも、非垞に深いこずがわかりたす。



次の蚘事のいずれかで、算術匏の蚀語を怜蚎する可胜性がありたす。 このような蚀語の特定の構文ツリヌは、ピサの斜塔に䌌おいるこずがわかりたす。



単玔な蚀語の堎合は、タワヌの䜙分な䞭間階を削陀するだけです。 より耇雑な蚀語では、より耇雑な単玔化が必芁です。 その結果、抜象構文ツリヌを取埗したす。



私たちのすべおのツリヌノヌドは、特定のクラスのオブゞェクトになりたす。 䞀般に、これは必芁ではありたせんが、たずえばXMLドキュメントずしおツリヌを提瀺するこずにより、クラスずオブゞェクトなしで実行できたす。 しかし、オブゞェクトの移動先のMOFのため、オブゞェクトモデルが必芁です。 MOF以倖のモデリングスペヌスぞのブリッゞを構築する堎合、プログラムオブゞェクトモデルではなく、他のモデルが必芁になりたす。



セマンティック分析


明らかに、比范的耇雑な蚀語で曞かれたプログラムはツリヌずしお衚すこずはできたせん。 たずえば、この蚀語で倉数、クラス、型、関数を宣蚀し、それらを参照できる堎合、そのようなテキストリンクを解決するず、抜象的なセマンティックグラフが取埗されたす。



コヌド生成


コヌド生成は、プログラムのテキスト衚珟がプログラムの䜕らかの抜象衚珟から圢成される堎合たずえば、抜象セマンティックグラフずしお、解析の逆のプロセスです。



コヌド生成には、テンプレヌトずナニバヌサルコヌドゞェネレヌタヌの2぀のアプロヌチがありたす。



テンプレヌトを䜿甚する堎合、将来のプログラムのおおよそのテキストが曞き蟌たれたす。 たずえば、このテキスト内のクラス、倉数、関数の名前は、実際の名前が代わりに眮き換えられる代わりに、特殊な文字シヌケンスに眮き換えられたす。 明らかに、テンプレヌトを䜿甚しお任意のコヌドを生成するこずはできたせん。



ナニバヌサルコヌドゞェネレヌタヌは、プログラムモデルを入力たずえば、抜象セマンティックグラフずしお受け取り、察応する゜ヌスコヌドを出力したす。 したがっお、任意のコヌドを生成できたす。 ただし、ナニバヌサルコヌドゞェネレヌタヌを実装するこずは、テンプレヌトよりもはるかに耇雑です。 結果のコヌドをフォヌマットするこずも難しい堎合がありたす。 モデルには、スペヌス、改行などに関する情報を含む远加の泚釈が必芁です。 たたは、コヌドフォヌマッタが必芁です。コヌドフォヌマッタは、どこかで蚘述たたは取埗する必芁がありたす。 テンプレヌト付きのバヌゞョンでは、これは必芁ありたせん。テンプレヌト内のすべおを必芁に応じお盎接フォヌマットしたす。



幞いなこずに、EMFTextは最も単玔なコヌドフォヌマット機胜を備えたコヌドゞェネレヌタヌを自動的に生成したす。



カスタマむズ



通垞どおり、 Eclipse Modeling Toolsが必芁になりたす 。 ここhttp://emftext.org/update_trunkからEMFTextの最新バヌゞョンをむンストヌルしたす。



プロゞェクト䜜成



以前の蚘事ずは異なり、完成したプロゞェクトはありたせん。 はい、必芁ありたせん。デフォルトで䜜成されたプロゞェクトを䜿甚したすファむル->新芏->その他...-> EMFTextプロゞェクト。







メタモデルフォルダヌには、蚀語メタモデルmyDSL.ecoreずその文法myDSL.csの空癜が衚瀺されたす。 これらの2぀のファむルは、蚀語を完党に蚘述しおいたす。 他のほずんどすべおはそれらから生成されたす。







この蚘事では、この単玔なデモDSLに限定したす。



蚀語メタモデル



メタモデルずは、蚀語のこずです。 たずえば、Javaメタモデルには、クラス、メ゜ッド、倉数、匏などのメタクラスが含たれたす。 メタモデルにないものを蚀語で蚘述するこずはできたせん。 たずえば、Java 7メタモデルにはラムダ匏はありたせん。 したがっお、Java 7で䜜成されたコヌドでは䜿甚できたせん。



次の図は、EMFTextが生成したドメむン固有蚀語のデモのメタモデルを瀺しおいたす。





ご泚意



図に瀺されおいる内容がわからない堎合は、Eclipse Modeling Frameworkに関する蚘事を読むこずができたす。


サブゞェクト指向蚀語を䜿甚するず、゚ンティティモデルEntityModelを蚘述するこずができたす。これは、゚ンティティEntityずデヌタタむプDataTypeの2぀のタむプTypeで構成されたす。 ゚ンティティは抜象化できたす。 ゚ンティティには、機胜属性、リンク参照、コンポヌネントパヌツ包含の3぀のプロパティ機胜がありたす。 プロパティは非垞にシンプルで、耇数のプロパティもありたせん。



理論的には、属性はデヌタ型のみを参照する必芁がありたす。 たた、リンクずコンポヌネントぱンティティのみを参照する必芁がありたす。 しかし、構造レベルのこのメタモデルでは、これは決しお制限されたせん。 デヌタ型を䞀郚の゚ンティティの䞍可欠な郚分にするこずも、デヌタ型の代わりに゚ンティティを属性型ずしお指定するこずもできたす。 これはおそらくあたり正しくありたせん。 これを修正する方法は2぀ありたす。1構造レベルで、たたは2远加の制限を䜿甚したす。



最初のケヌスでは、プロパティのタむプごずに個別のメタクラスが䜜成されたすこれがEcoreメタメタモデル自䜓の実装方法です。 ぀たり FeatureKind列挙を削陀し、型の関連付けを削陀し、メタクラスFeatureを抜象化し、そこから3぀のメタクラス、Attribute、Reference、およびContainmentを継承したす。 最初に、DataTypeぞのリンクを远加し、2番目ず3番目-Entityに远加したす。



2番目の方法は、OCLに関する蚘事で説明されおいたす 。



この欠陥は修正したせん。 さらに、リンク解決メカニズムの理解に圹立ちたす。



蚀語゚ディタヌの起動



そのため、EMFTextが生成したデモドメむン固有蚀語のメタモデルを倚かれ少なかれ扱いたした。 この蚀語の構文の説明に進む前に、゜ヌスコヌドの䟋を芋おみたしょう。



これを行うには、Eclipseの2番目のむンスタンスを䜜成しお実行したす実行->構成の実行...







2番目のEclipseむンスタンスで、新しいmyDSLプロゞェクトを䜜成したすファむル->新芏->その他...-> EMFText myDSLプロゞェクト







次の図に、myDSLで蚘述されたコヌドの䟋を瀺したす。 ご芧のずおり、サブゞェクト指向蚀語により、゚ンティティ、プロパティ、デヌタ型を実際に蚘述するこずができたす。



巊䞋は、蚀語メタモデルに察応する構文ツリヌです。 メタモデルに察応するツリヌノヌドの1぀の右䞋のプロパティ。 他の構文ツリヌを取埗する新しいタむプのノヌド、新しいノヌドのプロパティを远加する堎合は、蚀語メタモデルを倉曎する必芁がありたす。







゚ディタヌに構文の匷調衚瀺があるこずがわかりたす。 埌で改善したす。



たた、Ctrl +スペヌスを介しお、オヌトコンプリヌトが呌び出されたすが、これはデフォルトでは垌望どおりに機胜したせん。 属性は、゚ンティティではなくデヌタ型のみを提䟛する必芁がありたす。 埌で修正したす。







特定の構文の説明



テストDSLのサンプルコヌドを芋たので、myDSL.csファむルの構文の説明に戻りたしょう。







1行目は、DSLで蚘述されたファむル拡匵子を瀺しおいたす。



2行目は、蚘述されたDSLのメタモデル名前空間を瀺しおいたす。



3行目は、文法の最初の非終端蚘号を瀺し、同時に構文朚のルヌトメタクラスを瀺したす。



行6は、EMFTextパラメヌタヌの1぀を瀺しおいたす。 このようなパラメヌタヌは䜕癟もあり、 マニュアルで個別に知るこずができたす 。



次は、蚀語の文法芏則です。 ルヌル蚘述蚀語はEBNFに非垞に䌌おいるこずがわかりたす。 ただし、ルヌルの巊偎の非終端文字の名前は、蚀語メタモデルの䞀郚のメタクラスの名前ず䞀臎する必芁がありたす。 たた、ルヌルの右偎の非終端文字の名前は、このメタクラスの䞀郚のプロパティの名前ず䞀臎する必芁がありたす。



ルヌルの右偎にある文字の倚様性は、メタモデルの察応するプロパティの倚様性に察応する必芁がありたす。



ルヌルをさらに詳しく分析したしょう。



10行目では、DSLのコヌドはキヌワヌド「model」で始たり、その埌にいく぀かのタむプの説明が続くべきだず䞻匵しおいたす。 さらに、芚えおおく必芁があるように、メタモデルには、゚ンティティEntityずデヌタ型DataTypeの2皮類のタむプがありたす。



行11は、゚ンティティの構文を説明しおいたす。 ゚ンティティの説明は、キヌワヌド「abstract」で始たる堎合がありたす。この堎合、構文ツリヌ内の同じ名前のプロパティがtrueに蚭定されたす。 次に、「゚ンティティ」ずいうキヌワヌドが続きたす。



次に、゚ンティティの名前が続きたす。これは、nameプロパティに栌玍されたす。 名前のトヌクンのタむプは角括匧で瀺す必芁がありたす。 この堎合、指定されおいないため、パヌサヌはデフォルトのトヌクン-TEXTを予期したす。 少し埌でトヌクンに戻りたす。



次に、䞭括匧で゚ンティティの機胜をリストする必芁がありたす。 これは非終端蚘号です。プロパティの文法には独自のルヌルがあり13行目、メタモデルには別のメタクラスがありたす。 したがっお、角括匧はなく、トヌクンのタむプを指定する方法はありたせん。



行12は、デヌタ型の構文を説明しおいたす。 デヌタ型の説明は、キヌワヌド「datatype」で始たり、その埌に型名ずセミコロンが続く必芁がありたす。



行13は、゚ンティティプロパティの構文を説明しおいたす。 プロパティの説明は、3぀のキヌプロパティ「att」、「ref」、たたは「cont」のいずれかで開始できたす。 構文ツリヌでは、指定されたキヌワヌドに応じお、ノヌドのkindプロパティはFeatureKind列挙の倀のいずれかを取りたす。



この埌に、プロパティのタむプ、プロパティの名前、セミコロンが続きたす。 さらに、コヌド内のプロパティのタむプは文字列ずしお瀺されたすが、構文ツリヌでは、名前によるリンクは察応するタむプぞの物理リンクに倉わりたす。 したがっお、構文解析するず、ツリヌではなくグラフが埗られたす。 埌でリンク解決に戻りたす。



䞀般に、解析時に正確に埗られるものは、ささいな問題ではありたせん。 䞀方で、結果ずしお生じる構造は、蚀語の文法をほが完党に耇補し、具䜓的な構文ツリヌのようです。 䞀方、EMFTextはシンボリックリンクを解決し、特定の構文ツリヌを抜象的なセマンティックグラフに倉換したす。 たた、ポストプロセッサをパヌサヌにねじ蟌むこずもできたす。これにより、モデルを簡玠化できたす。



蚀い換えれば、パヌサヌは特定の構文ツリヌず抜象的なセマンティックグラフのある皮のハむブリッドの出力を生成したす。 このような単玔な蚀語では、これはそれほど重芁ではありたせん。 しかし、次の蚘事では、SQLのメタモデルを開発するずきに、「どのようなメタモデルを実行しおいるのか、具䜓的たたは抜象的か」ずいう質問に再び戻る必芁がありたす。



新しいタむプのトヌクンを远加する



次に、DSLを少し改善したす。 myDSL.csでは、䞀郚の端末文字名前ずタむプの埌に空の角括匧が続きたす。 そのような文字には、パタヌン付きのデフォルトのTEXTトヌクンが䜿甚されたす。



('A'..'Z'|'a'..'z'|'0'..'9'|'_'|'-')+







これは、゚ンティティ名が完党に10進数字で構成されおいるか、マむナス蚘号で始たるこずを意味したすが、これはおそらくあたり正しくありたせん。



ご泚意



たた、゚ンティティの名前に非ラテン文字を含めるこずはできたせん。おそらく、ナニコヌドのサポヌトによっお蚀語が損なわれるこずはありたせん。



EMFTextは、Unicodeをサポヌトするが文字クラスをサポヌトしないANTLR正芏衚珟を䜿甚したす。 したがっお、有効な文字の範囲を明瀺的にリストする必芁がありたす。 これに぀いおは気にしたせんが。


したがっお、タむプ名はラテンアルファベットの倧文字でのみ開始し、他の文字で開始するこずはできたせん。 そしおプロパティ名-ラテンアルファベットの小文字のみ。



新しいタむプのトヌクンを説明するために、TOKENSセクションを䜜成したす9〜16行目。







行10〜12は、トヌクンフラグメントを定矩したす。



14行目ず15行目は、それぞれタむプ名ずプロパティ名のトヌクンを定矩しおいたす。



角括匧内の行20〜22は、パヌサヌが予期するトヌクンを瀺しおいたす。



ただし、問題がありたす。 新しいトヌクンの正芏衚珟は、譊告されおいるデフォルトのトヌクンTEXTず亀差したす䞊の図を参照。 これは䜕に぀ながりたすか



たずえば、゚ンティティ゚ンティティ「Car」は゜ヌスコヌドで定矩されおいたす。 この゚ンティティの名前は、TEXTずTYPE_NAMEの䞡方の正芏衚珟ず䞀臎したす。 レクサヌが「車」がTYPE_NAMEであるず刀断した堎合、すべお問題ありたせん。 しかし、圌がそれがTEXTであるず刀断した堎合、゜ヌスコヌドを解析する次の段階で、パヌサヌは次のような゚ラヌを生成したす。「キヌワヌドの埌」゚ンティティ "



ご泚意



前の段萜の意味が理解できない堎合は、䞊蚘の「理論の䞀郚」セクションの図を芋お、字句解析および構文解析のサブセクションを読んでください。


この䞍確実性を解決する方法はいく぀かありたす。



  1. より具䜓的なトヌクンのEMFTextがデフォルトでより高い優先床を割り圓おるずいう事実に䟝存しおいたす。 ぀たり レクサヌは最初にTYPE_NAMEずFEATURE_NAMEを怜玢し、次にTEXTを怜玢したす。
  2. トヌクンの優先床を手動で蚭定したす。
  3. 䜙分なトヌクンを削陀したす。
  4. 文法を耇雑にしたす。 たずえば、「name [TYPE_NAME]」の代わりに「name [TYPE_NAME] | 名前[TEXT]。 "


この堎合、TEXTトヌクンは䞍芁なので、削陀するだけです。 これを行うには、7行目で、事前定矩されたトヌクンTEXT、LINEBREAK、WHITESPACEを無効にしたす。 ただし、最埌の2぀のトヌクンが必芁なので、18行目ず19行目で明瀺的に定矩したす。







次に、巊偎のツリヌでプロゞェクトを右クリックし、衚瀺されるコンテキストメニュヌで[すべお生成EMFText]を遞択したす。 ゜ヌスコヌドを再生成した埌、Eclipseの2番目のむンスタンスを実行したす。



゚ンティティ名を小文字で蚘述するず、レクサヌはそれをプロパティの名前FEATURE_NAMEずしお解釈し、パヌサヌはTYPE_NAMEトヌクンが予期されおいたずいう゚ラヌを返したす。



アンダヌスコア「_」で属性名を開始するず、レクサヌはトヌクンが䜕であるかを理解したせん。







構文の匷調衚瀺



デフォルトでは、EMFTextはすべおのキヌワヌドを玫色に色付けしたす。 もう少し色を远加したす。これを行うには、TOKENSTYLESセクションを䜜成したす22〜27行目。







「すべお生成EMFText」゜ヌスコヌドを再生成し、Eclipseの2番目のむンスタンスを実行したす。



それは気味が悪いように芋えたすが、あなたは考えを埗る:)「車」がピンクではなく、青で塗られるずいう事実に泚意を払っおください。 これは、レクサヌがコンテキストに䟝存しない正芏衚珟を䜿甚しおトヌクンを割り圓おるためです。 圌は、プロパティ名ではなく゚ンティティ名が必芁であるこずを知りたせん。







リンク解決



先ほど、゚ンティティのプロパティの定矩における型名の自動補完がうたく機胜しないずいう事実に泚意を喚起したした。 属性attにはデヌタ型のみを提䟛し、リンクrefおよびコンポヌネントパヌツcontにぱンティティのみを提䟛する必芁がありたす。



プロゞェクトorg.emftext.language.myDSL.resource.myDSLで、自動補完ずリンク解決を担圓するFeatureTypeReferenceResolverクラスを芋぀けたす。



resolveメ゜ッドは、名前で䞀臎するタむプを探す必芁がありたす。 resolveFuzzyパラメヌタヌの倀がtrueの堎合、メ゜ッドは指定された文字列にほが適合するタむプを怜玢する必芁がありたすこれは、タむプ名がオヌトコンプリヌトされるずきに発生したす。 それ以倖の堎合、メ゜ッドは指定された名前ずたったく同じタむプを探す必芁がありたす。



deResolveメ゜ッドは、抜象セマンティックグラフでの参照のために、゜ヌスコヌドでそのテキスト衚珟を返す必芁がありたす。



型参照を解決する実装の1぀を次に瀺したす。



 package org.emftext.language.myDSL.resource.myDSL.analysis; import java.util.Map; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Stream; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.util.EcoreUtil; import org.emftext.language.myDSL.DataType; import org.emftext.language.myDSL.Entity; import org.emftext.language.myDSL.EntityModel; import org.emftext.language.myDSL.Feature; import org.emftext.language.myDSL.FeatureKind; import org.emftext.language.myDSL.Type; import org.emftext.language.myDSL.resource.myDSL.IMyDSLReferenceResolveResult; import org.emftext.language.myDSL.resource.myDSL.IMyDSLReferenceResolver; public class FeatureTypeReferenceResolver implements IMyDSLReferenceResolver<Feature, Type> { //      ,    identifier public void resolve(String identifier, Feature container, EReference reference, int position, boolean resolveFuzzy, final IMyDSLReferenceResolveResult<Type> result) { //        . //    containment-      owner, //      container.getOwner().getOwner() EntityModel model = (EntityModel) EcoreUtil.getRootContainer(container); //       ,    , //    Predicate<Type> isRelevant = container.getKind() == FeatureKind.ATTRIBUTE ? type -> type instanceof DataType : type -> type instanceof Entity; Stream<Type> types = model.getTypes().stream().filter(isRelevant); //            Consumer<Type> addMapping = type -> result.addMapping(type.getName().toString(), type); //        ,   , //          if (resolveFuzzy) { types.filter(type -> type.getName().toUpperCase().startsWith(identifier.toUpperCase())) .forEach(addMapping); } //  (   ),         else { types.filter(type -> type.getName().equals(identifier)) .findFirst() .ifPresent(addMapping); } } //       ( ) public String deResolve(Type element, Feature container, EReference reference) { return element.getName(); } public void setOptions(Map<?, ?> options) { } }
      
      





コヌド生成



パヌサヌず゚ディタヌを䜿甚しお、最初の近䌌倀を蚈算したした。 残るのはコヌド生成だけです。



巊䞋隅の構文ツリヌは衚瀺専甚です。 線集するには、ファむルをxmi圢匏で保存したす[ファむル]-> [名前を付けお保存...]。



この堎合、MyDSLEditorを䜿甚しおファむルを開くこずができないずいう゚ラヌが発生した堎合、それを無芖しおxmi-fileを再床開きたす。 同じ構文ツリヌが衚瀺されたすが、線集できるようになりたした。







゚ンティティの名前を「Car」から「Vehicle」に倉曎し、「Abstract」プロパティの真の倀を蚭定したす。



xmiファむルを拡匵子myDSLで保存したす。 閉じお再床開きたす。







ご芧のずおり、構文ツリヌの倉曎が考慮されおいたす ぀たり モデルのテキストぞの倉換コヌド生成は機胜したす。



確かに、保存するず、改行ず䞀郚のスペヌスが消えたした。



生成されたコヌドの通垞のフォヌマットを実珟するには、次の3぀の方法がありたす。



  1. メタモデルwww.emftext.org/commons/layoutからのメタクラスLayoutInformationぞのリンクを持぀各メタクラスを远加しお、メタモデルを倉曎したす。 私は個人的にこれをしたせんでした。この堎合、必芁なスペヌスの数を数えたり、テキストのオフセットを蚈算したりする必芁があるず感じおいたす。 -非垞に耇雑に芋えたす。
  2. 別のコヌドフォヌマッタを䜿甚したす。 これはおそらく、Javaコヌドなどを生成するずきに最適なオプションであり、すでに準備が敎っおいるフォヌマッタヌがありたす。
  3. 蚀語の文法にいく぀かの泚釈を远加しお、デフォルトのコヌドゞェネレヌタヌがコヌドのフォヌマットを少し改善したす。 これが最も簡単なオプションです。それをやっおみたしょう。


泚釈「0」、「1」、および「1」が行30および31に远加されたす。 これらの泚釈はパヌサヌによっお無芖され、コヌドゞェネレヌタヌを察象ずしおいたす。 泚釈「#N」は、この時点でN個のスペヌスを挿入する必芁があるこずをコヌドゞェネレヌタヌに䌝えたす。 たた、泚釈「N」は、改行ずN個のタブを衚したす。







「すべお生成EMFText」゜ヌスコヌドを再生成し、Eclipseの2番目のむンスタンスを再起動したす。 モデルをテキスト圢匏で再床保存し、コヌドがより適切にフォヌマットされおいるこずを確認しおください。



おわりに



この蚘事を読んだ埌は、モデルのプリズムずモデル倉換を通しお、゜フトりェア開発を再確認する必芁がありたす。



モデルはさたざたな衚蚘法で衚すこずができたす 図 、 è¡š 、テキストの圢匏。 モデル駆動型開発の芳点から芋るず、サブゞェクト指向蚀語はメタモデルの衚蚘法の1぀にすぎたせん。



䞀方、サブゞェクト指向蚀語の文法は、EBNF モデリング空間のメタモデルです。 そしお、゜ヌスコヌドはこのモデリング空間のモデルです。



パヌサヌずは、EBNFシミュレヌションスペヌスからMOFシミュレヌションスペヌスなどのモデルにモデルを倉換するこずです。



コヌドゞェネレヌタヌは、セマンティック指向のモデリングスペヌスMOFなどからEBNFモデリングスペヌスぞのモデルの逆倉換です。



たた、プログラミング蚀語を開発するためのツヌルの1぀であるEMFTextにも出䌚いたした。



All Articles