我正在研究一种脚本语言,其解析器在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中循环堆栈以释放我放在那里的指针?
答案 0 :(得分:1)
好像,你要找%destructor指令。
http://www.gnu.org/software/bison/manual/html_node/Destructor-Decl.html