如何强制 nom 解析整个输入字符串?
How to force nom to parse the whole input string?
我正在使用 nom 版本 6.1.2,我正在尝试解析字符串,例如
A 2 1 2
.
目前我很乐意至少区分符合要求的输入和不符合要求的输入。 (之后我想将输出更改为一个元组,该元组的第一个值为“A”,第二个值为 u16 数字的向量。)
字符串总是必须以大写字母 A 开头,之后应该至少有一个 space,然后是一个数字。此外,可以有任意多的附加 space 和数字。以数字而不是 space 结尾很重要。所有数字都将在 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)))
作为所提供示例的答案作为输入。
似乎是使用声明的一部分造成了这个问题。在文档中(在某些段落的某个地方,我看过它)它说:
“
流媒体/完整
nom 的一些模块有流式或完整的子模块。它们拥有相同组合器的不同变体。
流式分析器假设我们可能没有所有的输入数据。某些网络协议或大型文件解析器可能会发生这种情况,其中输入缓冲区可能已满,需要调整大小或重新填充。
一个完整的解析器假设我们已经有了所有的输入数据。这将是可以完全读取到内存的小文件的常见情况。
“
因此,我的问题的解决方案是交换使用 nom::character::complete::{char, space1};
而不是 nom::character::streaming::{char, space1};
(第三个位置不计算空行)。这对我有用:)
我正在使用 nom 版本 6.1.2,我正在尝试解析字符串,例如
A 2 1 2
.
目前我很乐意至少区分符合要求的输入和不符合要求的输入。 (之后我想将输出更改为一个元组,该元组的第一个值为“A”,第二个值为 u16 数字的向量。)
字符串总是必须以大写字母 A 开头,之后应该至少有一个 space,然后是一个数字。此外,可以有任意多的附加 space 和数字。以数字而不是 space 结尾很重要。所有数字都将在 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)))
作为所提供示例的答案作为输入。
似乎是使用声明的一部分造成了这个问题。在文档中(在某些段落的某个地方,我看过它)它说: “ 流媒体/完整 nom 的一些模块有流式或完整的子模块。它们拥有相同组合器的不同变体。
流式分析器假设我们可能没有所有的输入数据。某些网络协议或大型文件解析器可能会发生这种情况,其中输入缓冲区可能已满,需要调整大小或重新填充。
一个完整的解析器假设我们已经有了所有的输入数据。这将是可以完全读取到内存的小文件的常见情况。 “
因此,我的问题的解决方案是交换使用 nom::character::complete::{char, space1};
而不是 nom::character::streaming::{char, space1};
(第三个位置不计算空行)。这对我有用:)