<分区>
我正在研究一种脚本语言,其解析器是在 Bison 中实现的。我对语法没有疑问——它功能齐全,语言也能用,但它没有按照我想要的方式处理错误。
这里是问题所在:我已经实现了解析器,以便随着规则的减少,它会在堆栈上逐个构建表达式树。我的想法是,当整个脚本都被读入后,我将在堆栈中留下一个表达式树,然后我可以将其直接转换为字节码。该特定规则的语法如下所示:
脚本:
block { pp_write_block($1); pp_free_tree($1);
fputc(代码,ppbcout); YY接受; }
;
这里,pp_free_tree($1)
递归地释放了整个表达式树。这很好——直到我遇到错误。如果 Bison 在解析期间的任何时候失败,那么我将在堆栈中留下一堆堆分配的树。
所以,我的问题是:如果我在 Bison 中遇到解析错误,我如何才能释放这些位于堆栈上的 malloc
树?实际上,我所需要的只是一种遍历堆栈的方法,对其中的每个指针调用 pp_free_tree
;但是,我不确定我将如何去做。
tl,dr:我如何在 Bison 中遍历堆栈以释放放在那里的指针?