rust - 如何在 nom 中创建流解析器?

标签 rust nom

我已经在 nom 中创建了一些重要的解析器,所以我现在对它非常熟悉。到目前为止,我创建的所有解析器始终将整个输入切片提供给解析器。

我想创建一个流解析器,我假设这意味着我可以继续将字节输入解析器,直到它完成。我很难找到任何说明这一点的文档或示例,而且我也质疑我对“流式解析器”是什么的假设。

我的问题是:

  • 我对流解析器的理解是否正确?
  • 如果是这样,是否有使用此技术的解析器的任何好的示例?

最佳答案

nom 解析器既不维护缓冲区以将更多数据输入,也不维护之前需要更多字节的“状态”。

但是如果你看一下 IResult您看到的结构可以返回部分结果或表明您需要更多数据。

似乎提供了一些结构来处理流式传输:我认为您应该使用 consumer_from_parser! 从解析器创建一个 Consumer宏,实现一个 Producer对于您的数据源,请调用 run直到它返回 None(并在您有更多数据时重新开始)。到目前为止,示例和文档似乎大部分都丢失了 - 请参阅 https://github.com/Geal/nom 的底部:)

此外,nom 中的大多数函数和宏似乎都没有很好地(或根本没有)记录它们在输入结束时的行为。例如take_until!如果输入的长度不足以包含要查找的 substr,则返回 Incomplete,但如果输入足够长但不包含 ,则返回错误substr.

此外,nom 主要使用 &[u8]&str 作为输入;您不能通过这些类型发出实际的“流结束”信号。您可以实现自己的输入类型(相关特征:nom::{AsBytes,Compare,FindSubstring,FindToken,InputIter,InputLength,InputTake,Offset,ParseTo,Slice})流”标志,但 nom 提供的宏和函数将无法解释它。

总而言之,我建议通过一些其他方式将流式输入拆分为可以使用简单的非流式解析器处理的 block (甚至可以使用 synom 而不是 nom ).

关于rust - 如何在 nom 中创建流解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46876879/

相关文章:

rust - 使用 serde 从字符串毫秒时间戳反序列化 DateTime

oop - 为什么 Rust 不支持特征对象向上转换?

parsing - 使用 nom 根据先前的元素有条件地解析数组

rust - 使用 nom 匹配模板过滤器表达式

rust - 名义和借用值(value)的生命周期不够长错误

rust - NEAR-sdk #[near_bindgen] 与其他宏冲突

rust - 如何告诉借用检查器已清除的 Vec 不包含借用?

compiler-errors - 如果没有错误,我如何才能只显示警告?

parsing - 使用 `nom` 处理自定义枚举类型是否有意义?