【问题标题】:equivalent BNF-grammar of grammar written in XText用 XText 编写的语法的等效 BNF 语法
【发布时间】:2013-04-04 23:11:21
【问题描述】:

在我当前的项目中,我用 Xtext 编写了具有很好功能的语法。比如我的语法代码sn-p

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 语法的要求。

【问题讨论】:

    标签: xtext


    【解决方案1】:

    需要对文档做同样的事情(使用铁路图可视化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/

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 2010-10-09
      相关资源
      最近更新 更多