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 语法),第一次手工做,但是随着语法的发展变得无聊,找到了两篇有用的文章:简单的解决方案 - 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 回答