在不解析所有C语言的情况下解析Bison / YACC .y文件

时间:2015-01-17 04:09:49

标签: parsing bison yacc

我想解析Bison / YACC .y文件中的语法定义。规则的语法非常简单(我可以忽略语法规则部分之外的所有内容),而且我不需要有关语义操作的信息。但是,即使跳过操作,似乎也需要解析任意C代码片段以确定{...}块的结束位置(因为您可以使用嵌套块等)。

是否有一个快捷方式,不需要解析C?

我想一个解决方法就是要求Bison自己删除所有回调,然后将语法规则保留在文件中,这样就可以解析了。

2 个答案:

答案 0 :(得分:3)

如果您使用bison标志运行-v,它将生成一个名为basename.output的文件,该文件以语法开头(不带操作)。解析该报告非常容易。 (basename是输入文件的名称,如果指定了--output选项,则输出文件的名称,并且剥离了扩展名。)

唯一的另一种方法是准备复制大部分野牛的解析,至少涉及 lexing C,如果没有完全解析它,以及理解如何解析所有野牛的%命令。

注意-v选项生成的语法将中规则操作转换为具有空右侧的非终端。生成的非终端具有$@<number>@<number>形式的名称,因此它们很容易识别。

答案 1 :(得分:2)

使用大括号识别和跳过C代码在flex中非常简单:

%x cblk cstr cchr ccom cppcom
%%
                       int brace_depth;
{                      brace_depth=0; BEGIN(cblk);
<cblk>{                brace_depth++;
<cblk>}                if (!brace_depth--) BEGIN(INITIAL);
<cblk>\"               BEGIN(cstr);
<cblk>\'               BEGIN(cchr);
<cblk>\/\*             BEGIN(ccom);
<cblk>\/\/             BEGIN(ccpcom);
<cstr,cchr>\\.         ;
<cstr>\"               BEGIN(cblk);
<cchr>\'               BEGIN(cblk);
<ccom>\*\/             BEGIN(cblk);
<cppcom>\n             BEGIN(cblk);
<cblk,cchr,cstr,ccom,cppcom>.|\n   ;