有什么方法可以防止boost :: fusion在某些输入上溢出堆栈?我的语法类似于
S -> S OR S
S -> a
并且在巨大的输入(> 1500 OR'd项目)上它崩溃了。我不想解析这么大的输入,但我需要以某种方式防止进程崩溃。
我可以将字符串限制为一定长度,但这并不能解决我的问题,因为a
可能很长。
答案 0 :(得分:1)
这通常通过将右递归重写为迭代形式来解决,例如
myrule = something >> -(',' >> myrule); // right recursion
到
myrule = something *(',' >> myrule); // iteration
当然,这是一个微不足道的案例。在真正的语法中,你经常需要以某种方式保持运算符的优先级。
在没有代码的情况下,请参阅此处,了解重构语法在堆栈和分配上 更轻的示例: