10

我有一个描述某种语言的 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
4

1 回答 1

11

如果您准备进行一些后期处理,Bison 可以提供帮助。

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

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

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

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

  4. 它不会更改:::=

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

于 2013-10-20T14:12:38.083 回答