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

C++ boost::spirit parsing embedded languages

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

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

提前致谢!

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

不过,以我的愚见,Spirit 在不使用扫描仪的情况下会大放异彩。主要是因为避繁就简,灵气大放异彩,灵气语法定义的复杂度倍增。

让开,

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

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

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


¹ 旁注:我认为 "DSLs" 不适合描述 HTML 中的脚本。 "embedded" 性质只是切线相关,例如ECMAScript 很难 "Domain Specific",所以我会坚持 "Embedded Grammar" 这里