在几个问题中我看到了以下建议Spirit http://www.boost.org/doc/libs/1_37_0/libs/spirit/classic/index.html解析器生成器框架来自boost.org http://www.boost.org/,但是评论中却有使用 Spirit 的人抱怨不开心。请那些人站出来向我们其他人解释一下使用 Spirit 的缺点或缺点是什么?
这是一个很酷的主意,我喜欢它;真正学习如何使用 C++ 模板特别有用。
但他们的文档建议中小型解析器使用spirit。完整语言的解析器需要很长时间才能编译。
我将列出三个原因。
无扫描仪解析。虽然它相当简单,但当需要回溯时,它可能会减慢解析器的速度。不过它是可选的 - 可能会集成词法分析器,请参阅使用 Spirit 构建的 C 预处理器。约 300 行的语法(包括 .h 和 .cpp 文件)使用 GCC 编译(未优化)为 6M 的文件。内联和最大优化可将其降至约 1,7M。
解析缓慢 - 没有对语法进行静态检查,既不提示需要过多的前瞻,也不验证基本错误,例如左递归的使用(这会导致递归下降解析器 LL 语法中的无限递归)。不过,左递归并不是一个很难追踪的错误,但过多的前瞻可能会导致指数解析时间。
大量使用模板 - 虽然这有一定的优点,但这会影响编译时间和代码大小。此外,语法定义通常必须对所有其他用户可见,这会影响更多的编译时间。
我已经能够通过使用正确的参数添加显式模板实例来将语法移动到 .cpp 文件,但这并不容易。
更新:我的回答仅限于我对 Spirit classic 的体验,而不是 Spirit V2。我仍然期望 Spirit 很大程度上基于模板,但现在我只是猜测。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)