Zach Laine 提出的 Boost.Parser 库评审今日开始,并将于 2 月 28 日结束。
来自文档的介绍页面
Boost.Parser 是一个解析器组合子库。也就是说,它由一组低级原始解析器组成,以及用于将这些解析器组合成更复杂解析器的操作。
存在解析 epsilon(空字符串)、字符、整数、浮点数等的原始解析器。
存在一些操作,它们将解析器组合起来以创建新的解析器。例如,Kleene 星号操作会接受一个现有的解析器 p,并创建一个新的解析器,该解析器匹配 p 所匹配内容的零次或多次出现。可调用对象和运算符重载都用于组合操作。例如,operator*() 用于 Kleene 星号,您也可以编写 repeat(n)[p] 来创建一个解析器,该解析器精确匹配 p 的 n 次重复。
Boost.Parser 也试图适应人们经常希望从解析代码中获取解析结果的多种方式。一些解析最好通过返回一个表示解析结果的对象来完成。另一些解析最好通过填充预先存在的数据结构来完成。还有一些解析最好通过解析大型文档的小部分,并通过回调报告子解析器的完成情况。Boost.Parser 能够适应所有这些工作方式,甚至可以通过仅更改顶层调用从 parse() 到 callback_parse() 来实现无需重写任何代码的基于回调或非基于回调的解析。
Boost.Parser 的所有公共接口都支持 sentinel 和 range,就像 std::ranges 中的接口一样。
Boost.Parser 完全支持 Unicode。当您解析 char 的范围时,Boost.Parser 不会假定任何特定的编码 — 无论是 Unicode 还是其他任何编码。解析除纯 char 以外的输入会假定输入是 Unicode。在 Unicode 感知的代码路径中,所有解析都是通过匹配代码点完成的。这意味着您可以将 UTF-8 字符串作为输入和在您的解析器中提供给 Boost.Parser,并会发生正确的匹配。例如,如果您的解析器试图匹配 char '\xcc' 的重复(它是 UTF-8 序列的引导字节,如果后面没有适当的 UTF-8 单元,则为格式错误的 UTF-8),它不会匹配 "\xcc\x80" 的开头(U+0300 的 UTF-8)。Boost.Parser 知道匹配必须是完整的代码点,因此它将 char '\xcc' 解释为代码点 U+00CC。
错误报告很重要,确保正确且易于理解,尤其是对最终用户。Boost.Parser 会生成运行时解析错误消息,这些消息与使用 GCC 和 Clang 编译时获得的诊断信息非常相似(甚至支持不导致解析失败的警告)。可以向用户报告与诊断相关的确切标记,并引用包含的行,并用标记指向该标记。Boost.Parser 会为您处理这些,您的解析器不需要包含任何特殊代码来实现这一点。当然,如果错误处理程序不适合您的需求,您也可以完全替换它。
调试复杂的解析器可能是一场噩梦。Boost.Parser 可以轻松地获取整个解析的跟踪信息,通过易于阅读(且非常详细)的指示,显示跟踪的每个部分在解析中的位置、解析产生的值的状态等。同样,您不需要编写任何代码来实现这一点 — 您只需向 parse() 传递一个参数。