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



我有一个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

Bison可以提供帮助,如果你准备做一些后期处理。

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

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

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

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

  4. 它不会:更改为::=

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

相关内容

  • 没有找到相关文章

最新更新