C++提升::精神解析嵌入式语言

C++ boost::spirit parsing embedded languages

本文关键字:嵌入式语言 提升 C++      更新时间:2023-10-16

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

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

提前感谢!

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

不过,以我的拙见,Spirit在不使用扫描仪的情况下会发光。究其原因,主要是当你避免复杂性时,精神会发光,而使用精神力就像是你灵气语法定义的复杂性倍增器。

那不碍事,

  • 是的,您可以切换到不同的嵌入式语法¹。纳比亚莱克技巧实际上是实现这种切换的著名方法。
  • 从技术上讲,在使用 Spirit Lex 时也可以切换词法分析器状态以实现相同的切换,但您必须牢记此方法的限制(根据解析器层中的条件无法操作词法分析器状态,这可能与该区域中存在未记录的解析器指令所暗示的事情相反(
  • 你的问题似乎没有谈论临时/即时语法,但由于"DSL"建议这一点,我将添加适当的警告:Spirit Qi是一个解析器生成器框架,在编译时生成PEG解析器。在它目前的版本中,它不适合在运行时生成规则/语法(主要是由于它下面的 Boost Proto/Boost Phoenix 的限制(。Spirit X3可能会消除许多这些限制,但那是未来。

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

一旦你的语法变得足够复杂,并且你知道语法是固定的/稳定的,我相信你可以用手写解析器或使用更乏味的解析器生成器之一,如ANTLR,CoCo/R,Flex/bison等,这需要更多的设置成本。


¹ 旁注:我不认为"DSL"是HTML中脚本的合适术语。"嵌入式"性质只是切线相关,例如 ECMAScript 几乎不是"特定于域的",所以我在这里坚持"嵌入式语法">