解析 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 ;
我想从 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 ;