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

Parsing 从yacc文件中提取BNF语法规则,parsing,grammar,yacc,bnf,imp,Parsing,Grammar,Yacc,Bnf,Imp,我有一个描述某种语言的yacc文件,我正在使用IMP(eclipse项目)为其开发一个编辑器。我使用LPG作为解析器生成器,所以我需要从我的yacc文件中提取BNF规则。我收到的yacc文件包含规则和操作。但是,我只想提取LPG中使用的语法描述规则。一种方法是手动提取规则并将其重新格式化为BNF语法(或者编写程序将其转换为我想要的方式)。我想知道是否有一种自动化的方法来做这件事。我在一些博客上读到bison可以提供帮助,但我找不到合适的命令。有人知道如何处理这个问题吗 我不能发布我的yacc文件

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

我不能发布我的yacc文件,因为它是保密的。但我可以举一个例子如下

argExprList:
       assignExp
          {
            // some rules here 
          }
        | assignExpList ',' assignExp
            {
              //some other rules here
            }
        ;
我想把它转换成的是

argExpList ::= assignExp|assignExpList ',' assignExp

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

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

  • 每件作品都有编号。你需要删除这些号码

  • 如果有中间规则操作,它们将显示为奇怪的空非终端。这些名称类似于
    $@8
    @2
    。您需要删除这些令牌及其相应的空产品

  • 空产品(至少在最新版本的bison中)显示为
    /*Empty*/
    。那可能不是你喜欢的

  • 它不会将
    更改为
    :=

  • 我用这种方法从yacc/bison文件中提取语法,非常简单;您可以使用一个简单的
    sed
    awk
    脚本进行上述所有更改