nom是一个用 Rust 编写的解析器组合库。它的目标是在不影响速度或内存消耗的情况下提供构建安全解析器的工具。为此,它广泛使用 Rust 的强类型和内存安全性来生成快速和正确的解析器,并提供函数、宏和特征来抽象大多数容易出错的管道。
nom 解析器用于:
- 面向字节:基本类型是&[u8],解析器将尽可能多地在字节数组切片上工作(但不限于它们)
- 面向位:nom 可以将字节片作为位流寻址
- 面向字符串:相同类型的组合符也可以应用于 UTF-8 字符串
- zero-copy:如果解析器返回其输入数据的子集,它将返回该输入的一部分,而不进行复制
- 流式传输: nom 可以处理部分数据并检测何时需要更多数据才能产生正确的结果
- 描述性错误:解析器可以聚合错误代码列表以及指向受控输入切片的指针。这些错误列表可以进行模式匹配以提供有用的消息。
- 自定义错误类型:您可以提供特定类型来改进解析器返回的错误
- 安全解析: nom 利用了 Rust 的安全内存处理和强大的类型,解析器经常被模糊和测试真实世界的数据。到目前为止,通过模糊测试发现的唯一缺陷是在 nom 之外编写的代码中
- 速度:基准测试表明,nom 解析器通常优于许多解析器组合库,如 Parsec 和 attoparsec、一些正则表达式引擎,甚至是手写的 C 解析器
Github上提供了一些基准测试。
其他类似 DSL框架: