我有一个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
文件的基本名称);该文件包含语法的副本和每个状态的描述。语法没有动作,每行有一个生产。但是你需要做一些工作:
-
每件作品都有编号。您需要删除这些数字。
-
如果有中间规则操作,它们将显示为名称奇怪的空非终端。名称将类似于
$@8
或@2
.您需要删除这些令牌及其相应的空作品。 -
空作品(至少在野牛的一个最新版本中)显示为
/* empty */
.这可能不是您的偏好。 -
它不会
:
更改为::=
我以这种方式从 yacc/bison 文件中提取语法,非常简单;您可以使用简单的sed
或awk
脚本进行上述所有更改。