boost :: fusion解析长字符串会导致堆栈溢出

时间:2014-11-27 14:40:35

标签: c++ parsing boost grammar boost-spirit

有什么方法可以防止boost :: fusion在某些输入上溢出堆栈?我的语法类似于

S -> S OR S
S -> a

并且在巨大的输入(> 1500 OR'd项目)上它崩溃了。我不想解析这么大的输入,但我需要以某种方式防止进程崩溃。

我可以将字符串限制为一定长度,但这并不能解决我的问题,因为a可能很长。

1 个答案:

答案 0 :(得分:1)

这通常通过将右递归重写为迭代形式来解决,例如

myrule = something >> -(',' >> myrule); // right recursion

myrule = something *(',' >> myrule); // iteration

当然,这是一个微不足道的案例。在真正的语法中,你经常需要以某种方式保持运算符的优先级。


在没有代码的情况下,请参阅此处,了解重构语法在堆栈和分配上 更轻的示例: