【问题标题】:C++ boost::spirit parsing embedded languagesC++ boost::spirit 解析嵌入式语言
【发布时间】:2015-03-05 09:35:00
【问题描述】:

其实我的问题很简单。我目前正在研究一种可以解析带有嵌入式 DSL 的元语言的语言解析器。这对我来说很有趣,因为它可以解析带有 HTML 和嵌入的 JavaScript / CSS 的网站。我想为特定用例设计一些具有最少 DSL 的类似系统。

boost::spirit 能做类似的事情吗?我只是不知道 boost::spirit 如何处理词法分析器的生成,或者它是否甚至是无扫描仪解析器。

提前致谢!

【问题讨论】:

    标签: c++ boost boost-spirit


    【解决方案1】:

    Spirit Qi 可以与扫描仪 (Spirit Lex) 一起使用,也可以不使用。

    不过,以我的拙见,Spirit 在不使用扫描仪的情况下使用它时会发光。原因主要是当你避免复杂性时 Spirit 会发光,而使用 Spirit Lex 就像你的 Spirit Qi 语法定义的复杂性乘数一样。

    别闹了,

    • 是的,您可以切换到不同的嵌入式语法¹。 Nabialek trick 实际上是实现这种切换的著名方式。
    • 从技术上讲,在使用 Spirit Lex 时,也可以切换词法分析器状态以实现相同的切换,但您必须牢记此方法的局限性(不能根据解析器层中的条件来操纵词法分析器状态,可能与该区域中存在未记录的解析器指令所暗示的事情)
    • 您的问题似乎没有讨论 ad-hoc/on-the-fly 语法,但由于“DSLs”建议这样做,我将添加适当的警告:Spirit Qi 是一个生成 PEG 解析器的解析器生成器框架 在编译时。在它目前的版本中,它很适合在运行时生成规则/语法(主要是由于它所依据的 Boost Proto/Boost Phoenix 的限制)。 Spirit X3 可能会解除其中的许多限制,但那是未来。

    也就是说,我强烈建议为此目的查看现成的解析器/标记器。我的立场通常概括为:使用 Spirit 进行快速开发和临时解析。

    一旦您的语法变得足够复杂并且您知道语法是固定/稳定的,我相信您可以使用手写解析器或使用更繁琐的解析器生成器之一(如 ANTLR、CoCo/R、Flex/)获得最佳结果野牛等,这需要更多的设置成本。


    ¹ 旁注:我认为“DSL”不适合用于 HTML 中的脚本的情况。 “嵌入”性质仅是切线相关的,例如ECMAScript 几乎不是“特定领域”,所以我会在这里坚持使用“嵌入式语法”

    【讨论】:

    • 当然,DSL 不是 HTML 中 ECMAScript 的正确名称。但这是我想用元语言和嵌入式 DSL 实现的一个很好的例子。而且你的建议是正确的。我的目标是在我将嵌入到元语言本身的元语言中创建临时/即时语法。 boost:;spirit 的局限性对我来说没有问题,因为我正在为下面的任务编写自己的框架。并感谢您回答这个问题。我想尽可能多地了解我的竞争对手。 :)
    猜你喜欢
    • 2017-10-30
    • 1970-01-01
    • 2011-03-05
    • 2012-01-17
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多