CH01-Motivation

Parboiled 的诞生源自对 JVM 上现有解析器构建工具的挫败感。

近年来流行动态语言(如 Ruby、Groovy)的巨大增长,很大一部分原因是它们将自身作为 DSL 的模型。虽然这些语言(甚至是一些静态类型的语言,如 Scala)具有简洁灵活的语法,通常直接可以用作内部 DSL 的基础,但相当笨拙的 Java 语法使得内部 DSL 非常缺乏吸引力。

对于很多项目来说,一个很小的 DSL 久能够构建出一个优雅的“用户接口”,以在没有 GUI 的情况下提供丰富的表现力以及灵活性。在 Java 中,内部 DSL 并不在规划之内,你不得不为外部 DSL 构建一个解析器以获得便利。尽管外部 DSL 并非解析器的唯一用例,像 Java 中这样对语言的传统解析支持工具并不出众。很多时候支持 DSL 并非项目的核心目标(如下编译器实现中),而是解决各种问题之一的优雅方案。因此,你可能并不希望将太多时间用于上下文无关的文法、词法理论以及错综复杂的外部解析器生成器。您只想以某种方式指定解析语法的外观并使其快速轻松地工作。这也就是 Parboiled 存在的原因。

下面是一些传统解析器生成器的缺点:

  • 专有性,以非 Java 语法的形式保存在单独的项目文件(如外部 DSL)。
  • 对文法文件没有 IDE 内置支持(语法高亮、内联检查、重构、代码导航等)。
  • 运行外部解析器生成器需要特殊的构建步骤。
  • “谜不可触”,在你项目中生成的 Java 源文件需要与文法规范保持同步。
  • 通过词法分析(令牌生成)和令牌解析阶段中的分离解析过程进行更复杂的设计和维护。
  • 综合占用(ANTLR 分发的生成器加上运行时占用多余 1.8 MB)。