我正在研究一种脚本语言,其解析器是在 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 中的堆栈以释放我放在那里的指针?