版权所有 © 2020 T. Zachary Laine
根据 Boost 软件许可证版本 1.0 发布。(参见随附文件 LICENSE_1_0.txt 或在 https://boost.ac.cn/LICENSE_1_0.txt 复制)
目录
Boost.Parser 是一个 解析器组合库。也就是说,它由一组低级基本解析器组成,以及用于将这些解析器组合成更复杂的解析器的操作。
存在解析 epsilon(空字符串)、char、int、float 等的基本解析器。
存在组合解析器以创建新解析器的操作。例如,Kleene 星操作接受一个现有的解析器 p 并创建一个新的解析器,该解析器匹配 p 匹配的任何内容的零次或多次出现。可调用对象和运算符重载都用于组合操作。例如,operator*() 用于 Kleene 星,您还可以编写 repeat(n)[p] 来创建一个恰好匹配 n 次 p 重复的解析器。
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() 传递一个参数。
C++ 中的依赖关系仍然是一个难题,因此 Boost.Parser 可以作为纯粹独立的库使用,独立于 Boost。