我正在尝试编写一个可以解析最终用户文件的库,用于将一些简单的用户生成的内容添加到项目中,我想尝试使该库尽可能灵活。我将递归用于“对象”的标记化过程,该过程通过四个函数链,但我对如何处理最终用户对嵌套对象感到满意的潜在情况感到矛盾。我知道我可以对程序可以递归的次数设置一个硬性限制,但我想让它尽可能灵活。有什么方法可以计算此进程可以执行的(最大 - 1)次,以便我可以抢占堆栈溢出错误并返回错误或要处理的内容?
最佳答案
Is there any way that I can calculate the (maximum - 1) number of times that this [recursive] process can execute ...
没有。甚至不能保证调用链中的每个堆栈帧大小相同。
将递归实现转换为迭代实现相当简单且定义明确:您只需
- 用显式状态容器替换隐式调用堆栈(和函数调用操作),例如
std::stack<State>
- 不是递归调用,而是推送新调用的
State
到你的堆栈,并继续循环 - 循环不是被调用,而是从弹出当前的
State
开始关闭堆栈,并处理它,这可能需要推送另一个新的State
如果您之前已经进行了另一个递归调用,就在那里
或者,您可以将当前的递归下降解析器拆分为分词器和 LALR(或类似)解析器,它们首先都是迭代的。例如,您可以使用 Flex 和 Bison (Lex/Yacc) 生成它们。
关于C++ 运行时抢占堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45788043/