我在用nom库解析。我想要匹配的东西是后面的‘结束’,而不消耗它。
对于我来说,结束是eof或者是满足函数f: Fn(char) -> bool的char。
我可以将f与nom::character::complete::satisfy、nom::bytes::take_while或许多其他nom函数结合使用。
eof和f之间的不一致性使得我无法用nom组合子或自己的组合子来创作。
这是非法的,因为不透明类型:
fn end(i: &str) -> IResult<&str, &str> {
match eof(i) {
o @ Ok(_) => o,
e @ Err(_) => peek(satisfy(f)),
}
}这也是非法的:
alt((eof, satisfy(f)))我甚至不能做到这一点:
alt((eof, char(' ')))我甚至不能做到这一点:(因为匹配的武器有不相容的类型?)
fn end(i: &str) -> IResult<&str, ()> {
match eof(i) {
o @ Ok((sur, res)) => Ok((i, ())),
e @ Err(_) => match satisfy(f) {
Ok(_) => Ok((i, ())),
e @ Err(_) => e,
},
}
}发布于 2022-10-21 23:14:06
我自己提供了一个错误,让它发挥作用:
fn end(i: &str) -> IResult<&str, ()> {
match eof::<&str, ()>(i) {
o @ Ok((_, _)) => Ok((i, ())),
e @ Err(_) => match satisfy::<_, _, ()>(is_url_terminative)(i) {
Ok(_) => Ok((i, ())),
Err(_) => Err(nom::Err::Error(Error {
input: i,
code: nom::error::ErrorKind::Permutation,
})),
},
}
}https://stackoverflow.com/questions/74159691
复制相似问题