12.1. 概述

词法分析器用于读取各种格式的数据,这些数据可以具有灵活但可能非常复杂的结构。 关于"格式"的一个最好的例子就是 C++ 代码。 编译器的词法分析器必须理解 C++ 的各种可能的语言结构组合,以将它们翻译为某种二进制形式。

开发词法分析器的主要问题是所分析的数据的组成结构具有大量的规则。 例如,C++ 支持很多的语言结构,开发一个相应的词法分析器可能需要无数个 if 表达式来识别任意所能想象到的 C++ 代码是否有效。

本章所介绍的 Boost.Spirit 库将词法分析器的开发放到了桌面上来。 无需将明确的规则转换为代码并使用无数的 if 表达式来验证代码,Boost.Spirit 可以使用一种被称为扩展BNF范式的东西来表示规则。 通过使用这些规则,Boost.Spirit 就可以对一个 C++ 源代码进行分析。

Boost.Spirit 的基本思想类似于正则表达式。 即不用 if 表达式来查找指定模式的文本,而是将模式以正则表达式的方式指定出来。 然后就可以使用象 Boost.Regex 这样的库来执行相应的查找国,因此开发者无需关心其中的细节。

本章将示范如何用 Boost.Spirit 来读入正则表达式不再适用的复杂格式。 由于 Boost.Spirit 是一个功能非常全的库,引入了多个不同的概念,所以在本章我们将开发一个 JSON 格式 的简单的词法分析器。 JSON 是被如 Ajax 一类的应用程序用于在程序之间交换数据的格式,类似于 XML,可以在不同平台上运行。

虽然 Boost.Spirit 简化了词法分析器的开发,但是还没有人能够成功地基于这个库写出一个 C++ 词法分析器。 这类词法分析器的开发仍然是 Boost.Spirit 的一个长期目标,不过,由于 C++ 语言的复杂性,目前还未能实现。 Boost.Spirit 目前还不能很好地适用于这种复杂性或二进制格式。