2009-11-08 27 views
3

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

回答

6

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

+0

非常好的答案!但是,我将如何检查$ 1,$ 2,$ 3等...? – Jack 2016-04-05 13:54:08

3

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

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

0

我重新定义了yylval类型与%union

%union { 
    int int_val; 
    double double_val; 
} 

而我得到的是无论是yyval.int_valyyval.double_val取决于$$类型。

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