1

現在のプロジェクトでは、優れた機能を備えた Xtext で文法を記述しました。たとえば、私の文法のコード スニペット

Device:
     deviceName =  ID ':'

     ('region' ':' ( deviceRegions += DeviceRegions)+ )* ;

DeviceRegions:
     regionLabel = [RegionLabel] ';'  
     // It stores a List of  regionLabel functionalities
;

RegionLabel: name = ID ;

上記の文法を使用して、次の高レベル仕様を記述します。

 DeviceOne : 
         region : 
              Room ;
              Floor ;
              Building; 
    DeviceTwo: 
         region : 
              Room ;
              Floor ;
              Building;

xText で記述された文法の同等の BNF 文法を見たいと思います。同等の文法は、たとえば次のようになります。

Device = ID ':'
     ( 'region' ':'  (deviceRegions = DeviceRegions)+)*  ;

 DeviceRegions : 
       regionLabel = RegionLabel ';'  ;

 RegionLabel = 'room' | 'Floor' | 'Building' ;

  ID  = 'A'..'Z' ('a' ..'z' | 'A' ..'Z')* ;

私の質問は、「xText で書かれた文法を同等の BNF 文法に変換する方法はありますか、それとも手動で行うべきですか?」

xText の文法は非常に簡単に習得して記述できることを知っています。ただし、BNF 文法が必要です。

4

2 に答える 2

3

ドキュメンテーション (鉄道図を使用した xText 文法の視覚化) のために同じことを行う必要があり、最初は手作業で行いましたが、文法が進化するにつれて退屈になり、次の 2 つの有用な記事を見つけました: シンプルなソリューション - http://fornax-sculptor.blogspot. nl/2010/05/generating-syntaxrailroad-diagrams-from.html よりしっかりしたものhttp://xtexterience.wordpress.com/2011/05/13/an-ebnf-grammar-in-xtext/

于 2013-04-04T15:11:21.283 に答える
2

Xtext 文法から「同等の」EBNF を生成することはできないことに注意してください。Xtext 文法は、生成規則ではなく生成されたインスタンスを参照する相互参照の概念をサポートします。これは EBNF では表現できません。いずれにせよ、Xtext 文法から出力を生成するジェネレーター フラグメントを作成することは可能です。たとえば、Antlr 文法はそのように作成されます。詳細については、ドキュメントを参照してください。

于 2013-04-03T08:09:14.680 に答える