解析 Bison/YACC.y 文件而不解析所有 C 语言

Parsing Bison/YACC .y files without parsing all of the C language

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

是否有不需要解析 C 的快捷方式?

我想一种解决方法是要求 Bison 本身去除所有回调,只将语法规则留在文件中,这样就很容易解析了。

如果您 运行 bison 带有 -v 标志,它将生成一个名为 basename.output 的文件,该文件以语法(无动作)开头。解析该报告非常容易。 (basename 是输入文件的名称,如果您指定 --output 选项,则为输出文件的名称,扩展名被删除。)

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

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

识别和跳过带大括号的 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   ;