在Bison发生错误后释放指针留在堆栈上

时间:2013-03-13 07:54:00

标签: c malloc bison flex-lexer

我正在研究一种脚本语言,其解析器在Bison中实现。我没有关于语法的问题 - 它功能齐全,而且语言有效,但它不会像我想要的那样处理错误。

问题在于:我已经实现了解析器,以便在规则减少时逐个构建堆栈中的表达式树。我的想法是,当读入整个脚本时,我将在堆栈上留下一个表达式树,然后我可以直接将其转换为字节码。该特定规则的语法如下所示:

script: block { pp_write_block($1); pp_free_tree($1); fputc(CODEEND,ppbcout); YYACCEPT; } ;

这里,pp_free_tree($1)以递归方式释放整个表达式树。这很好 - 直到我遇到错误。如果Bison在解析期间的任何时候都失败了,那么我就会在堆栈上留下一堆堆分配的树。

所以,我的问题是:如果我在Bison中遇到解析错误,如何释放这些位于堆栈中的malloc树?真的,我只需要一种循环堆栈的方法,在其中的每个指针上调用pp_free_tree;然而,我不确定如何做到这一点。

tl,dr :如何在Bison中循环堆栈以释放我放在那里的指针?

1 个答案:

答案 0 :(得分:1)