我希望应用一系列诺姆解析器,并返回匹配的完整&str。我想要匹配表单a+bc+的字符串。使用现有的宏,我可以非常接近:
named!(aaabccc <&[u8], &str>,
map_res!(
chain!(
a: take_while!(is_a) ~
tag!("b") ~
take_while!(is_c) ,
|| {a}
),
from_utf8
));哪里
fn is_a(l: u8) -> bool {
match l {
b'a' => true,
_ => false,
}
}
fn is_c(l: u8) -> bool {
match l {
b'c' => true,
_ => false,
}
}假设我们有'aaabccc‘作为输入。上面的解析器将与输入匹配,但只返回'aaa‘。我想做的是返回'aaabccc',原始输入。
chain!不是正确的宏,但是没有一个更正确的宏。做这件事最好的方法是什么?
在撰写本文时,我使用的是nom 1.2.2和rustc 1.9.0-nightly (a1e29daf1 2016-03-25)。
发布于 2016-03-30 12:50:29
似乎你想要recognized!
如果子解析器成功,则将消耗的输入作为产生的值返回。
还有一个例子:
#[macro_use]
extern crate nom;
use nom::IResult;
fn main() {
assert_eq!(aaabccc(b"aaabcccddd"), IResult::Done(&b"ddd"[..], "aaabccc"));
}
named!(aaabccc <&[u8], &str>,
map_res!(
recognize!(
chain!(
take_while!(is_a) ~
tag!("b") ~
take_while!(is_c),
|| {}
)
),
std::str::from_utf8
)
);
fn is_a(l: u8) -> bool {
match l {
b'a' => true,
_ => false,
}
}
fn is_c(l: u8) -> bool {
match l {
b'c' => true,
_ => false,
}
}如果您不关心这些值,我不确定chain!是否是组合顺序解析器的最佳方法,但在这种情况下,它是有效的。
https://stackoverflow.com/questions/36300373
复制相似问题