序言
“符合大多数“优良”(易懂、灵活、高效)标准的设计实例包括递归下降解析器,它是传统的过程式代码。另一个实例是STL,它是一个容器和算法的泛型库,且在很大程度上依赖于传统的过程式代码和参数多态性。”
-- Bjarne Stroustrup
历史
十五年前,我用Pascal语言写了我的第一个计算器程序。那是我最难忘的编码经历之一。令我感到惊奇的是,相互递归的函数集合竟能作为文法说明的模型。最终,我从求学经历中获得的技能变为了实践。我总要不时地做一些文法解析工作。例如,每当我需要做任何形式的(甚至是二进制形式的)I/O操作时,我总是设法用类Pascal的语法图写出文法,从而略显正式地处理该任务。这种方法十分奏效。
因特网和万维网的出现使这种需求扩大了一千倍。当我必须为Web浏览器项目编写HTML解析器时,我轻而易举地使基于W3C形式说明的递归下降HTML解析器正常工作。我十分庆幸HTML拥有一份形式文法说明。由于因特网的影响,那时我不得不做更多的文法解析工作。RFC规范说明随处可见。SGML、HTML、XML,甚至电子邮件地址和那些看似普通的URL都被形式化地描述为EBNF风格的文法说明。这些事实让我企盼着能拥有一种类似于YACC和ANTLR那样一流的解析器生成器的工具,它能自动地从文法说明中构造出解析器。然而,我却希望它极其小巧,小到足够装进我的口袋中,同时还是可伸缩的。
这种工具必须既可以处理像电子邮件地址那样简单的文法,也可以处理像XML那样稍微复杂的文法,也许还能应对一些中小尺寸的脚本语言。可伸缩性是首要目标。你应该能够用它来完成像解析命令行那样的小型任务,而不会招致沉重的负担,就如同你使用YACC或PCCTS一样。时至今日,Spirit虽已演化和成长为一个多模块的程序库,但却从未改变其初衷,它仍然适用于微型的解析任务。你只为自己所需要的特性付出代价。Spirit的力量来自于它的模块性和可伸缩性。它没有给你一把大铁锤,而是给了你合适的材料,可以方便地打造出一把大铁锤。比如说,Spirit实际上并不具备词法分析器,但是如果你需要它,则可以自己来编写一个,因为Spirit为你提供了全部的原始要素。
最终Spirit产生了。Spirit是我在日本做研发工作时构想出的个人项目。在GoF的组合模式和解释器模式的启发下,我认识到可以使用基本对象(终结符)和组合对象(产生式)的复合层次结构来模拟递归下降解析器。最初的版本是使用运行时多态类实现的。通过输入类似于“prod ::= { 'A' | 'B'} 'C'”这样的产生式规则字符串,解析器在运行时刻被动态地生成。一个编译函数对解析器进行编译,动态地创建对象的层次结构,并在此过程中链接语义动作。一份非常早期的文本资料可以在这里找到。
现在我们所见到的Spirit版本是在Todd Veldhuizen的工作(《表达式模板》,C++报告,1995年6月)的启发下,使用表达式模板和静态多态性,对原先的Spirit解析器进行完全重写而得到的。最初,静态Spirit版本被用来取代原动态Spirit版本的核心。因为动态Spirit需要一个解析器来实现其自身。原先的版本使用一个手工编码的递归下降解析器去解析输入的文法说明字符串。
在静态Spirit于2001年5月作为开源项目首次登台以后,它获得了成功。在2001年11月左右,Spirit网站的活跃程度为98%,这使它成为当时Source Forge上的头号解析器工具。对于像解析器程序库这样的项目来说,这已是一个不错的结果。Spirit的“静态”部分被略去,静态Spirit就变成了Spirit。该框架不久经过演化而获得了更多的动态特性。
如何使用本手册
Spirit框架从核心开始,被组织成逻辑模块结构。本文档对框架中的每个模块提供用户指南和参考。一段简单而清晰的代码示例胜过一百行文档;因此,用户指南中包含大量带有注解的示例,并且按步骤对它们进行了讲解。总之,本用户指南是基于许多范例编写而成的。
在每个模块的用户手册部分尽量避免出现超前内容(即引用了一段尚未讨论的内容)。但在许多情况下,正常讨论流程中散布着一些相关的高级主题则在所难免。为了减轻该问题所造成的影响,在首次阅读时可以跳过被归类为“高级”的主题。
一些图标被用来标记某些主题,以表示重要程度。在这些图标后面跟随的文字用来表示:
图标
注意:提供中等重要程度的信息,应引起读者的注意。
警告:提供极其重要的信息。
细节:提供辅助性信息,它们可使读者对某个特定主题加深理解。阅读时可以被跳过。
提示:提供可能是有用的或有帮助的信息。
支持
请将所有的问题寄往Spirit邮件列表。你可以在此处订阅邮件列表。该邮件列表具有一个可用于进行搜索的档案库。Spirit的主页提供了指向此档案库的搜索链接。你还可以通过NNTP新闻协议来阅读邮件列表或发送消息(感谢www.gmane.org)。该新闻组是邮件列表的镜像。这里有两个指向此档案库的链接:通过gmane,通过geocrawler。
献给我亲爱的女儿Phoenix
Joel de Guzman
2002年9月
版权所有 (c) 1998-2003 Joel de Guzman
使用、修改和发行应遵守Boost软件许可证,版本1.0.(参见附带文件LICENSE_1_0.txt或者位于http://www.boost.org/LICENSE_1_0.txt处的副本)。