当在所谓的流模式下运行时,nom
可能会返回Incomplete
表明它无法做出决定并且需要更多数据。这nom
4 介绍CompleteStr
。旁边还有CompleteByteSlice
,它们是完整的输入对应物&str
and &[u8]
。解析器将它们作为完整模式下的输入工作。
他们走了进去nom
5. In nom
5,正如您所观察到的,基于宏的解析器始终以流模式工作。对于在流式传输和完整模式下工作不同的解析器组合器,它们在单独的子模块中有不同的版本,例如nom::bytes::streaming
and nom::bytes::complete
.
对于所有这些血淋淋的细节,你可能想查看一下这篇博文 http://unhandledexpression.com/general/2019/06/17/nom-5-is-here.html,尤其是该部分流式解析器 VS 完整解析器.
此外,函数组合器比宏组合器更受青睐nom
5. 这是一种方法:
//# nom = "5.0.1"
use nom::{
branch::alt,
bytes::complete::{escaped, tag},
character::complete::none_of,
sequence::delimited,
IResult,
};
fn main() {
let (_, res) = parse_quoted(r#"'foo\' ???? bar'"#).unwrap();
assert_eq!(res, r#"foo\' ???? bar"#);
let (_, res) = parse_quoted("'λx → x'").unwrap();
assert_eq!(res, "λx → x");
let (_, res) = parse_quoted("' '").unwrap();
assert_eq!(res, " ");
let (_, res) = parse_quoted("''").unwrap();
assert_eq!(res, "");
}
fn parse_quoted(input: &str) -> IResult<&str, &str> {
let esc = escaped(none_of("\\\'"), '\\', tag("'"));
let esc_or_empty = alt((esc, tag("")));
let res = delimited(tag("'"), esc_or_empty, tag("'"))(input)?;
Ok(res)
}