在我目前的项目中,我在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语法。
答案 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语法是这样创建的。查看文档以了解更多相关信息。