从yacc文件中提取BNF语法规则

lfe*_*asu 10 grammar parsing yacc bnf imp

我有一个描述某种语言的yacc文件,我正在使用IMP(eclipse项目)开发一个编辑器.我使用LPG作为解析器生成器,所以我需要从我的yacc文件中提取BNF规则.我收到的yacc文件包含规则和操作.但是,我想只提取要在LPG中使用的语法描述的规则.一种方法是通过手动提取规则并将其重新格式化为BNF语法(或者可以编写程序将其转换为我想要的方式).我想知道是否有自动执行此操作的方法.我在一些博客中读到野牛可以提供帮助,但我无法找到合适的命令.有谁知道如何处理这个问题.

我不能真正发布我所拥有的yacc文件,因为它是保密的.但我可举个例子如下

argExprList:
       assignExp
          {
            // some rules here 
          }
        | assignExpList ',' assignExp
            {
              //some other rules here
            }
        ;
Run Code Online (Sandbox Code Playgroud)

我希望它被转换成简单的样子

argExpList ::= assignExp|assignExpList ',' assignExp
Run Code Online (Sandbox Code Playgroud)

ric*_*ici 11

如果你准备做一些后期处理,野牛可以提供帮助.

如果你使用该-v选项运行bison ,它将生成一个名为的文件filename.output(其中filename.y文件的基名); 该文件包含语法的副本和每个州的描述.语法没有动作,每行有一个生产.但是你需要做一些工作:

  1. 每个产品都有编号.你需要删除这些数字.

  2. 如果存在中规则操作,它们将显示为奇怪命名的空非终端.名字将是$@8或类似的@2.您需要删除这些令牌及其相应的空制作.

  3. 空作品(至少在最近的一个版本的野牛中)显示为/* empty */.这可能不是你的偏好.

  4. 它并没有改变:,以::=

我用这种方式从yacc/bison文件中提取了语法,而且非常简单; 您可以使用简单sedawk脚本进行上述所有更改.