如何编写易出错的名称解析器



如果我想编写一个可能在内部失败的名称解析器,我如何传播错误?

作为一个例子,解析NaiveDate的东西可能看起来像:

fn parse_date(i: &str) -> IResult<&str, NaiveDate> {
map(take(10), |s| NaiveDate::parse_from_str(s, "%m/%d/%Y")?)(i)
}

parse_from_str可能失败,返回自己的ParseResult类型。

我实际上依赖于它的成功/失败来确定这个解析器是否工作。

我如何将内部结果(在本例中为chrono::format::ParseResult)转换为与nom一起工作的东西?

您可以使用Nom的map_res方法。MapRes只发出ErrorKind::MapRes(没有自定义错误),但如果只需要ok/err结果就足够了。

use chrono::NaiveDate;
use nom::bytes::streaming::take;
use nom::combinator::map_res;
use nom::error::{Error, ErrorKind};
use nom::IResult;
fn parse_date(i: &str) -> IResult<&str, NaiveDate> {
map_res(take(10usize), |s| NaiveDate::parse_from_str(s, "%m/%d/%Y"))(i)
}
fn main() {
assert_eq!(
parse_date("01/31/2022: rest").unwrap(),
(": rest", NaiveDate::from_ymd(2022, 01, 31))
);
assert_eq!(
parse_date("yy/xx/2022").unwrap_err(),
nom::Err::Error(Error::new("yy/xx/2022", ErrorKind::MapRes))
);
}

相关内容

  • 没有找到相关文章

最新更新