用XText编写的等效BNF语法语法

时间:2013-04-02 15:47:23

标签: xtext

在我目前的项目中,我在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语法语法。 Equivallent语法例如如下:

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

 DeviceRegions : 
       regionLabel = RegionLabel ';'  ;

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

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

我的问题是“有没有办法将xText编写的语法转换成等效的BNF语法,还是我应该手动完成?

我知道xText语法很容易学习和编写。但是,我要求有BNF语法。

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:2)

请注意,无法从Xtext语法中生成“等效”EBNF。 Xtext语法支持交叉引用的概念,其中您不引用生产规则但生成实例。这不能用EBNF表示。无论如何,可以编写一个生成器片段来生成Xtext语法的输出,例如: Antlr语法是这样创建的。查看文档以了解更多相关信息。