Boost C++ 库

...世界上最受尊敬和专业设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

PrevUpHomeNext

序言

描述
范围
使用此库的优势
使用 Metaparse 的成本
支持的平台

Metaparse 是一个编译时解析器生成器库。Metaparse 提供了在编译时编写解析字符串字面量内容的解析器的工具,这使得将领域特定语言 (DSL) 嵌入到 C++ 中成为可能,而无需更改其原始语法(请注意,DSL 代码片段将写在字符串字面量中,因此可能需要转义)。

假设以下模板类可用于在模板元编程中表示有理数

template <class Num, class Denom>
struct rational;

Metaparse 可以用于从字符串字面量构造此类值(实例化 rational 模板类)。可以使用 RATIONAL("1/3") 代替 rational<1, 3>,它可以被任何符合标准的 C++11 编译器处理(并且含义相同)。这可以使用 Metaparse 通过以下方式实现

using namespace boost::metaparse;

typedef
  sequence_apply2<
    rational,

    token<int_>,
    last_of<lit_c<'/'>, token<int_>>
  >
  rational_grammar;

typedef build_parser<entire_input<rational_grammar>> rational_parser;

#define RATIONAL(s) \
  (::rational_parser::apply<BOOST_METAPARSE_STRING(s)>::type::run())

请注意,这是完整的实现。另请注意,可以扩展此实现以改进某些情况下的错误报告。

Metaparse 旨在供库作者使用,以使其 API 遵循库问题领域的常用表示法。

Boost.Proto 是一个用于构建表达式模板的工具。表达式模板可以通过将有效的 C++ 表达式重新解释为以要嵌入的 DSL 编写的表达式,用于 DSL 嵌入。

与解析字符串字面量的内容(这是 Metaparse 的方法)相比,此技术具有以下优势

  • 在大多数情况下速度更快
  • 使用此技术的 API 可以“涌现”为逐步推进库 API 的过程。迁移到全新的 DSL(及其自身的语法)是一个相对较大的步骤。

将表达式模板用于 DSL 嵌入具有以下缺点

  • 嵌入式 DSL 的语法是有限的。它必须是有效的 C++ 表达式。对于大多数库,熟悉原始 DSL 的人通常需要学习库的语法才能理解嵌入的代码片段。

Proto 帮助嵌入基于表达式模板的 DSL,而 Metaparse 帮助嵌入基于解析字符串字面量内容的 DSL。

Spirit 是一个工具,可以用于构建解析器,在运行时解析(除其他外)字符串字面量的内容,而 Metaparse 是一个工具,可以用于在编译时解析字符串字面量的内容。

此库对于为处理具有自身表示法的问题领域的 C++ 库提供 API 非常有用。使用 Metaparse 构建的接口使接口用户可以使用领域自身的表示法,这使得编写和维护代码更容易。接口用户不需要学习新的表示法(试图遵循问题领域的原始表示法),这是库作者受 C++ 语法约束可以提供的。示例问题领域包括正则表达式和 SQL 查询。

Metaparse 也可用于构建在编译时而不是在运行时或根本不进行验证的情况下验证字符串字面量内容的库。这可以帮助尽早(在编译期间)发现(和修复)代码中的错误。示例问题领域是 printf

使用 Metaparse 构建的解析器使用模板元程序处理字符串字面量的内容。这以下列方式影响使用 Metaparse 的库

  • 使用 Metaparse 构建的 API 的维护者将需要理解模板元编程。
  • 字符串字面量的内容将在每次编译期间被(重新)解析。这将影响编译器的内存消耗和编译速度。
  • 库的用户将收到来自解析器的错误报告,作为其编译器的模板错误消息。(请注意,Metaparse 积极尝试提高其质量,并为解析器作者提供 工具)。

Metaparse 基于 C++98。唯一的例外是 BOOST_METAPARSE_STRING 宏,它需要 C++11 constexpr

Metaparse 正在积极地(在 CI 环境中)在以下编译器上进行测试

  • GCC 4.6, 4.7, 4.8, 4.9
  • Clang 3.4, 3.5, 3.6
  • Visual C++ 2015

Metaparse 预计可在 Visual C++ 2012 和 2010 上运行。


PrevUpHomeNext