【问题标题】:How to force nom to parse the whole input string?如何强制 nom 解析整个输入字符串?
【发布时间】:2021-06-11 18:05:51
【问题描述】:

我正在使用 nom 版本 6.1.2,我正在尝试解析字符串,例如 A 2 1 2.

目前,我很乐意至少区分符合要求的输入和不符合要求的输入。 (之后我想将输出更改为一个元组,其中“A”作为第一个值,第二个值是 u16 数字的向量。)

字符串总是必须以大写字母 A 开头,然后至少有一个空格,然后是一个数字。此外,可以有任意多的额外空格和数字。以数字结尾而不是空格很重要。所有数字都将在 u16 的范围内。我已经写了以下函数:

extern crate nom;

use nom::sequence::{preceded, pair};
use nom::character::streaming::{char, space1};
use nom::combinator::recognize;
use nom::multi::many1;
use nom::character::complete::digit1;


pub fn parse_and(line: &str) -> IResult<&str, &str>{
    preceded(
        char('A'),
        recognize(
            many1(
                pair(
                    space1,
                    digit1
                )
            )
        )
    )(line)
}

我还想提一下,对于这样的问题,有一些使用 CompleteStr 的答案,但这不再是一个选项,因为它在一段时间前被删除了。

人们解释说我的行为的原因是 nom 不知道字符串的切片何时结束,因此我得到 parse_and: Err(Incomplete(Size(1))) 作为输入示例的答案。

【问题讨论】:

    标签: parsing rust parser-combinators nom


    【解决方案1】:

    似乎使用声明的一部分造成了这个问题。在文档中(在某个段落的某个地方,我查看它的方式很低)它说: " 流式传输/完成 一些 nom 的模块有流式或完整的子模块。它们拥有相同组合子的不同变体。

    流式解析器假设我们可能没有所有的输入数据。某些网络协议或大型文件解析器可能会发生这种情况,其中输入缓冲区可能已满,需要调整大小或重新填充。

    一个完整的解析器假设我们已经拥有了所有的输入数据。这将是可以完全读取到内存的小文件的常见情况。 "

    因此,我的问题的解决方案是交换使用 nom::character::complete::{char, space1}; 而不是 nom::character::streaming::{char, space1}; (第三个位置不计算空行)。这对我有用:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多