我已经在 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/