C++ boost::spirit 解析嵌入式语言

标签 c++ boost boost-spirit

其实我的问题很简单。我目前正在开发一种语言解析器,它可以解析带有嵌入式 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/

相关文章:

c++ - 在 BOOST TEST 中添加测试套件而不是测试用例

c++ - boost ASIO : do we need to keep using async_read and write inside a function called from async_read?

c++ - async_connect 在 GNU/Linux 下真的是异步的吗?

c++ - 语法意外失败 boost::spirit 语法定义

c++ - boost 灵气 搭配多种元素

c++ - 删除复制的指针

c++ - 动态内存的后期绑定(bind)

c++ - 如何使用预定义计数在 C++ 中初始化 vector<int> 数组?

c++ - Boost Spirit 在 DLL 中使用时崩溃

c++ - 基数排序算法说明