| 介绍 | ![]() |
![]() |
![]() |
该WaveC++ 预处理器库是一个符合标准的、打包在易于使用的接口背后的 C99/C++ 预处理器功能的实现,它与标准模板库 (STL) 的标准习惯用法很好地集成在一起。
该WaveC++ 预处理器不是一个整体应用程序,而是一个模块化库,它主要公开了一个上下文对象和一个迭代器接口。上下文对象有助于配置实际的预处理过程(如搜索路径、预定义宏等)。公开的迭代器也是由这个上下文对象生成的。迭代这两个迭代器定义的序列将返回预处理后的令牌,这些令牌是根据给定的输入流即时构建的。
C++ 预处理器迭代器本身由一个实现抽象接口的 C++ 词法分析器迭代器提供。打包在Wave库中的 C++ 词法分析器也可以独立使用,并且与 C++ 预处理器迭代器完全无关。
为了使 C++ 预处理库模块化,C++ 词法分析器与预处理器完全分开且独立。为了证明这一概念,实现了两种不同的但功能相同的 C++ 词法分析器。此外,还实现了一个 IDL 词法分析器,它允许将预处理器库用作面向 IDL 的工具的词法分析组件。所有这些词法分析器都实现了提到的抽象接口,因此 C++ 预处理器迭代器可以与它们一起使用。将词法分析器与预处理器迭代器库抽象出来是为了允许插入不同的词法分析器,而无需重新实现预处理器。这将允许对预处理过程本身进行基准测试和特定微调。
第一个 C++ 词法分析器借助著名的Re2C [3] 工具实现,该工具根据给定的正则表达式生成 C 代码。使用Re2C生成的词法分析器因其速度极快而闻名,因为它们不是表驱动的,而是直接编码令牌构建逻辑(非常类似于手动编码的词法分析器)。
第二个 C++ 词法分析器围绕一个表驱动的词法分析器构建,其中 DFA 表(离散有限自动机表)是借助一个名为Slex [5] 的基于 Spirit 的词法分析器生成框架根据正则表达式生成的。该Slex在运行时会接收令牌定义(正则表达式)并生成结果 DFA 表。此表用于将输入字符组合成相应的词素(令牌)。生成的 DFA 表可以保存到磁盘,以避免在程序启动时进行生成过程。
Wave 也可以用于预处理 IDL 文件,因为 IDL 语言所需的令牌集与 C++ 令牌集非常相似。这就是为什么Wave预处理器库还包含一个 IDL 词法分析器。IDL 词法分析器也基于Re2C工具,但识别不同的令牌集。因此,此词法分析器不识别任何关键字(除了trueandfalse,这是预处理器本身所必需的)。这是必需的,因为存在不同的 IDL 语言风格,其中一种风格的标识符可能是其他风格的关键字 - 好的,这需要将关键字识别推迟到预处理之后,但允许 Wave 用于所有 IDL 派生。
如果需要,也可以构建其他 C++ 词法分析器。目前有计划改编SpiritC++ 词法分析器示例cpplexer [6],它完全基于静态Spirit[4]语法。
包含的两个词法分析器和库本身都能够以 C99 兼容模式运行。在此模式下,词法分析器会拒绝 C++ 专有的令牌('::', '->*', '.*'以及备用关键字,例如'and'等)。预处理器另外处理占位符(空宏参数)和可变参数(具有可变参数数量的宏)。作为 C++ 标准的扩展,库可以被启用以在 C++ 模式下处理占位符和可变参数。
![]() |
![]() |
版权所有 © 2003-2011 Hartmut Kaiser
根据 Boost Software License, Version 1.0 分发。(参见附带的 LICENSE_1_0.txt 文件或访问 https://boost.ac.cn/LICENSE_1_0.txt 副本)
最后更新日期2007 年 12 月 2 日星期日 19:03