如何强制nom解析整个输入字符串



我使用的是nom版本6.1.2,我正在尝试解析字符串CCD_ 1。

目前,我很乐意至少区分符合需求的输入和不符合要求的输入。(在那之后,我想将输出更改为一个元组,该元组以"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)))作为所提供示例的答案作为输入。

似乎是使用声明的一部分造成了这个问题。在文件中(在某个段落中,我看得很低(,它说:"流式处理/完成nom的一些模块具有流式或完整的子模块。它们持有相同组合子的不同变体。

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

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

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

相关内容

  • 没有找到相关文章

最新更新