7.5 小结

本章学习了外部DSL的设计原则。外部DSL需要建立自己的一套语言处理设施。假如我们的DSL复杂度特别低,那么可以手工编写语法分析器。复杂一些的DSL则需要用到功能完备的语法分析器生成器,如YACC、Bison、ANTLR等。我们详细讨论了基于ANTLR的语言构建,用它开发了一种自定义交易指令处理DSL。其间考察了ANTLR实现引擎中的各组成部件,如词法分析器、语法分析器、语义模型等,如何协作形成最终的DSL处理程序。

要点与最佳实践

  • 设计DSL时,应该明确分离语法和背后的语义模型

  • 外部DSL的语义模型可以用宿主语言的语言结构来实现。语法分析需要一种能与宿主语言集成的分析器生成器。ANTLR是一款典型的分析器生成器,它能和Java语言完美地集成在一起。

  • 选择合适的分析器类型。只要语言不是太过简单,都应该在开始外部DSL设计之前,就按照对语言处理能力的需求做好决策。正确的分析器类型有利于降低实现的复杂度。

  • 按实际需要来决定复杂度水平。外部DSL不必设计得像通用语言一样复杂。

对于具备一定复杂度,语法比较丰富的外部DSL来说,语法分析器是语言设计的核心。语法分析器按照其扫描输入流和构造分析树的方式来分类。主要有两大类型:自顶向下分析器和自底向上分析器。语言设计者需要知道每一类语法分析器适合处理的语言种类,还需要知道每一种分析器实现的复杂度和选择依据。本章一边介绍语法分析器的分类,一边深入讨论了这方面的内容。

完成交易指令处理DSL的设计,说明我们已经懂得为语言选择正确的分析器类型。本章最后一节转向另一种DSL开发范式,在熟识的标准文本模型基础上,引入一套丰富的工具。立足Eclipse平台,再结合EMF框架的模型驱动开发方式,令Xtext成为集优点于一身的外部DSL开发环境。用Xtext重新实现与前面的例子相同的交易指令处理DSL。开发过程体现了模型驱动方式的多样性结合一整套工具,可以获得更加丰富的语言开发体验。

下一章将介绍使用Scala语言的一种截然不同的外部DSL开发范式。Scala提供的一类函数式组合子可以作为开发语言分析功能的建造材料。它们被称为分析器组合子(parser combinator)。我们将用这些组合子来实现证券交易领域的外部DSL示例。