c - 在 Bison 出错后释放留在堆栈上的指针

标签 c malloc bison flex-lexer

<分区>

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

最佳答案

看来,您正在寻找 %destructor 指令。

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

关于c - 在 Bison 出错后释放留在堆栈上的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15379702/

相关文章:

c - 编译器中的抽象语法树 : how exactly to represent a function?

c - Switch 语句 C 中的无限循环

java - 任何人都可以解释 C C++ Java 关于动态或静态语言

c - 使用 free() 会产生段错误

c++ - 如何为 flex/bison 实现更好的错误消息

c - yacc/bison 操作的范围是什么?

c - strstr() 不适用于 C

c - 在消息队列环境中一般处理通信所需的帮助——多个客户端!

c - 如何确定我的系统上 malloc() 结果的最小对齐?

c - C 中的动态分配 - 分配到函数中