我想解析Bison / YACC .y
文件中的语法定义。规则的语法非常简单(我可以忽略语法规则部分之外的所有内容),而且我不需要有关语义操作的信息。但是,即使跳过操作,似乎也需要解析任意C代码片段以确定{...}
块的结束位置(因为您可以使用嵌套块等)。
是否有一个快捷方式,不需要解析C?
我想一个解决方法就是要求Bison自己删除所有回调,然后将语法规则保留在文件中,这样就可以解析了。
答案 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 ;