1

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

4

1 回答 1

1

似乎,您正在寻找 %destructor 指令。

http://www.gnu.org/software/bison/manual/html_node/Destructor-Decl.html

于 2013-03-13T08:39:25.130 回答