8.5 小结
如果一路坚持学习分析器组合子,那么到本章结尾这里,你已经对这种函数式编程在语言设计领域的高级应用有了相当程度的了解。分析器组合子可以说是最为简洁的一种外部DSL设计手段。我们不需要为了实现DSL而自行设计一套语言基础设施。分析器组合子技术给我们提供一种内部DSL来作为设计外部DSL的手段。我们可以一边在模块化、异常处理等基本服务上借用宿主语言的基础设施,一边为用户设计全新的语言。
要点与最佳实践
- 分析器组合子在宿主语言的语法范围内提供了一种函数式色彩浓厚的外部DSL设计手段。
- 用分析器组合子设计出来的外部DSL 往往拥有非常精炼的实现,因为中缀表示法和类型推断特性令组合子形成一种说明式的语法。
- 使用语言提供的分析器组合子库,首先要留意库中是否提供了记忆分析器、packrat分析器之类的特殊礼物。只有熟练掌握库的全部能力,我们才能为DSL设计效率最高的文法。
本章我们学习了在其核心语言的基础上,Scala如何以库的形式实现分析器组合子功能。普通的Scala函数组合在一起,就能让我们用极为近似EBNF的表述形式来定义文法规则。Scala库提供了非常丰富的组合子供我们处理语义模型,并从分析过程中产生定制的AST。最后,我们讨论了可以在普通自顶向下递归下降分析器无能为力时发挥作用的packrat分析器。此外我们还通过一个Scala实现示例的演练,真切体验到packrat分析器的高效率实现。