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

时间:2015-03-05 09:35:00

标签: c++ boost boost-spirit

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

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

提前致谢!

1 个答案:

答案 0 :(得分:5)

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

在我的拙见中,Spirit在使用无扫描仪时会发光。原因主要是当你避免复杂性时精神闪耀,并且使用精灵Lex就像灵气齐语法定义的复杂性乘数一样。

那就不用了,

  • 是的,您可以切换到不同的嵌入式语法¹。 Nabialek trick实际上是实现这种转换的着名方式。
  • 从技术上讲,也可以在使用Spirit Lex时切换词法分析器状态以实现相同的切换,但是你必须记住这种方法的局限性(Lexer State不能根据Parser层中的条件进行操作,这可能与这个领域中存在未记录的解析器指令所暗示的事情)
  • 您的问题似乎没有谈论临时/即时语法,但由于“DSL”提示这一点,我将添加适当的警告:Spirit Qi是一个生成PEG解析器的解析器生成器框架< em>在编译时。在它的当前版本中,非常适合在运行时生成规则/语法 (主要是由于Boost Proto / Boost Phoenix的限制)。精神X3可能会解除许多这些限制,但这就是未来。

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

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


¹旁注:我认为“DSLs”不适合HTML中的脚本。 “嵌入”性质仅与切向相关,例如, ECMAScript几乎不是“特定领域”,因此我将坚持使用“嵌入式语法”