其实我的问题很简单。我目前正在开发一种语言解析器,它可以解析带有嵌入式 DSL 的元语言。这对我来说非常有趣,因为它可以解析带有 HTML 和嵌入式 JavaScript/CSS 的网站。我想为特定用例设计一些具有最少 DSL 的类似系统。
boost::spirit 能够做类似的事情吗?我只是不知道 boost::spirit 如何处理词法分析器生成,或者它是否是一个无扫描器解析器。
提前致谢!
最佳答案
Spirit Qi 可以与扫描仪 (Spirit Lex) 一起使用,也可以不与扫描仪一起使用。
以我的愚见,Spirit 在无需扫描仪的情况下使用时会表现出色。原因主要是当你避免复杂性时,Spirit 会发光,而使用 Spirit Lex 就相当于你的 Spirit Qi 语法定义的复杂性乘数。
不碍事,
- 是的,您可以切换到不同的嵌入式语法。 Nabialek trick实际上是实现这种切换的一种著名方法。
- 从技术上讲,使用 Spirit Lex 时也可以切换词法分析器状态以实现相同的切换,但您必须记住此方法的局限性(词法分析器状态不能根据解析器层中的条件进行操作,这可能与该区域中存在未记录的解析器指令所建议的事情)
- 您的问题似乎没有讨论临时/即时语法,但由于“DSL”建议这样做,我将添加适当的警告:Spirit Qi 是一个解析器生成器框架,可生成 PEG 解析器< em>在编译时。在它目前的版本中,它不适合在运行时生成规则/语法(主要是由于其背后的 Boost Proto/Boost Phoenix 的限制)。 Spirit X3 可能会消除其中许多限制,但那是 future 。
也就是说,我强烈建议为此目的查看现成的解析器/标记器。我的立场通常概括为:使用 Spirit 进行快速开发和临时解析。
一旦你的语法变得足够复杂并且你知道语法是固定/稳定的,我相信你可以使用手写解析器或使用更繁琐的解析器生成器之一(如 ANTLR、CoCo/R、Flex/)获得最佳结果野牛等,这需要更多的设置成本。
1 旁注:我认为“DSL”对于 HTML 中的脚本来说不是一个合适的术语。 “嵌入”性质只是切线相关的,例如ECMAScript 几乎不是“特定领域”,所以我在这里坚持“嵌入式语法”
关于C++ boost::spirit 解析嵌入式语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28874410/