【发布时间】:2019-02-20 16:00:08
【问题描述】:
我需要使用 nom 来解析 RESP 请求/回复。当我来批量字符串时,例如
"$6\r\nfoobar\r\n"
或
$-1\r\n
首先,我编写函数来从数据中提取 len。
named!(signed_digits<&str, (Option<&str>, &str)>,
pair!(
opt!(alt!(tag!("+") | tag!("-"))),
nom::digit
)
);
named!(signed_integer<&str, i64>,
map_res!(recognize!(signed_digits), FromStr::from_str)
);
named!(get_len_in_bulk_string<&str, i64>,
do_parse!(
tag!("$") >>
len: signed_integer >>
tag!("\r\n") >>
(len)
)
);
然后我根据len得到原始字符串:
named!(parse_bulk_string<&str, Record>,
map_res!(gen_len_in_bulk_string, |n|{
if n < 0 {
Record::BulkString(None)
} else {
Record::BulkString(Some(take!(n)))
}
})
);
但是我得到一个编译错误:
Record::BulkString(Some(take!(n)))
^ missing tokens in macro arguments
如何根据之前从文本中提取的 len 获取原始字符串?看来我不能在自己的闭包中使用take!。
【问题讨论】:
-
为什么不直接使用现有的 Redis 板条箱?
-
只是为了学习如何使用 nom 编写解析器