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 的方法)相比,此技术具有以下优势
将表达式模板用于 DSL 嵌入具有以下缺点
Proto 帮助嵌入基于表达式模板的 DSL,而 Metaparse 帮助嵌入基于解析字符串字面量内容的 DSL。
Spirit 是一个工具,可以用于构建解析器,在运行时解析(除其他外)字符串字面量的内容,而 Metaparse 是一个工具,可以用于在编译时解析字符串字面量的内容。
此库对于为处理具有自身表示法的问题领域的 C++ 库提供 API 非常有用。使用 Metaparse 构建的接口使接口用户可以使用领域自身的表示法,这使得编写和维护代码更容易。接口用户不需要学习新的表示法(试图遵循问题领域的原始表示法),这是库作者受 C++ 语法约束可以提供的。示例问题领域包括正则表达式和 SQL 查询。
Metaparse 也可用于构建在编译时而不是在运行时或根本不进行验证的情况下验证字符串字面量内容的库。这可以帮助尽早(在编译期间)发现(和修复)代码中的错误。示例问题领域是 printf
。
使用 Metaparse 构建的解析器使用模板元程序处理字符串字面量的内容。这以下列方式影响使用 Metaparse 的库
Metaparse 基于 C++98。唯一的例外是 BOOST_METAPARSE_STRING 宏,它需要 C++11 constexpr
。
Metaparse 正在积极地(在 CI 环境中)在以下编译器上进行测试
Metaparse 预计可在 Visual C++ 2012 和 2010 上运行。