用GDB检查Bison的$$变量

时间:2009-11-08 21:45:06

标签: c gdb yacc bison

如果我在Bison .y文件中设置断点,有没有办法可以检查该断点处的$$伪变量的内容?

3 个答案:

答案 0 :(得分:6)

$$是语义值堆栈的顶部。解释可能有点困难。如果你真的需要,堆栈指针可能被称为yyssp,堆栈可能被称为yyvsa,所以像yyvsa [yyssp]这样的东西可能会给你你想要的东西,这取决于你正在使用的野牛的版本。查看生成的.tab.c代码。

答案 1 :(得分:3)

Bison将堆栈保存为动态分配的yyparse()中的局部变量。

解决临时调试问题的最简单方法可能是修补y.tab.c,以便行*++yyvsp = yylval也删除全局中的副本。您可能还想破解YYPOPSTACK()做同样的事情。

答案 2 :(得分:0)

我使用yylval重新定义了%union的类型:

%union {
  int int_val;
  double double_val;
}

我得到的是yyval.int_valyyval.double_val,具体取决于$$的类型。

但正如Richard Pennington所说,最好的方法是查看生成的.tab.c代码。