我有一个描述某种语言的yacc文件,我使用IMP(eclipse项目)开发编辑器。我使用LPG作为解析器生成器,所以我需要从yacc文件中提取BNF规则。我收到的yacc文件包含规则和操作。但是,我想只提取要在LPG中使用的语法描述的规则。一种方法是通过手动提取规则并将其重新格式化为BNF语法(或者可以编写程序将其转换为我想要的方式)。我想知道是否有自动执行此操作的方法。我在一些博客中读到野牛可以提供帮助,但我无法找到合适的命令。有谁知道如何处理这个问题。
我无法发布我所拥有的yacc文件,因为它是保密的。但我可举个例子如下
argExprList:
assignExp
{
// some rules here
}
| assignExpList ',' assignExp
{
//some other rules here
}
;
我想要将其转换为简单的
argExpList ::= assignExp|assignExpList ',' assignExp
答案 0 :(得分:10)
如果您使用-v
选项运行bison,它将生成一个名为filename.output
的文件(其中filename
是.y
文件的基本名称);该文件包含语法的副本和每个州的描述。语法没有动作,每行有一个生产。但是你需要做一些工作:
每个作品都有编号。您需要删除这些号码。
如果存在中规则操作,它们将显示为奇怪命名的空非终端。名称将类似于$@8
或@2
。您需要删除这些令牌及其相应的空制作。
空制作(至少在最近的一个版本的野牛中)显示为/* empty */
。这可能不是你的偏好。
它不会将:
更改为::=
我以这种方式从yacc / bison文件中提取语法,而且非常简单;您可以使用简单的sed
或awk
脚本进行上述所有更改。