版权所有 © 2020 T. Zachary Laine
根据 Boost 软件许可协议 1.0 版发布。(请参阅随附文件 LICENSE_1_0.txt 或复制于 https://boost.ac.cn/LICENSE_1_0.txt)
目录
Boost.Parser 是一个 解析器组合库。也就是说,它由一组低级原始解析器和可用于将这些解析器组合成更复杂解析器的操作组成。
有一些原始解析器可以解析 ε(空字符串)、char
s、int
s、float
s 等。
有一些操作可以将解析器组合起来以创建新的解析器。例如,Kleene 星号 操作接受一个现有的解析器 p
,并创建一个新的解析器,该解析器匹配 p
匹配内容的零次或多次出现。可调用对象和运算符重载都用于组合操作。例如,operator*()
用于 Kleene 星号,您也可以编写 repeat(n)[p]
来创建一个精确重复 n
次 p
的解析器。
Boost.Parser 还试图适应人们通常希望从其解析代码中获得解析结果的多种方式。某些解析最好通过返回一个表示解析结果的对象来完成。其他解析最好通过填充预先存在的数据结构来完成。还有一些解析最好通过解析大型文档的小部分,并在子解析器完成时通过回调报告结果来完成。Boost.Parser 适应所有这些工作方式,甚至可以在不重写任何代码的情况下进行基于回调或非基于回调的解析(只需将顶层调用从 parse()
更改为 callback_parse()
)。
Boost.Parser 的所有公共接口都是哨兵和范围友好的,就像 std::ranges
中的接口一样。
Boost.Parser 从始至终都具有 Unicode 意识。当您解析 char
范围时,Boost.Parser 不会假定任何特定的编码——不是 Unicode 或任何其他编码。解析非纯 char
s 的输入时,假定输入是 Unicode。在 Unicode 感知的代码路径中,所有解析都通过匹配代码点来完成。这意味着您可以将 UTF-8 字符串馈送到 Boost.Parser 中,无论是作为输入还是在您的解析器中,都会发生正确的匹配。例如,如果您的解析器尝试匹配字符 '\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。