微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用 nom 解析可变空格分隔的列表

如何解决用 nom 解析可变空格分隔的列表

如何使用可能用空格分隔也可能不用空格分隔的令牌列表?

我正在尝试使用 nom (6.1.2) 解析 cedict 格式的中文拼音(拼音)。例如 "ni3 hao3 ma5",由于转录中的人为错误,有时会写成 "ni3hao3ma5""ni3hao3 ma5"(注意可变间距)。

我编写了一个解析器来处理单个音节,例如["ni3","hao3","ma5"],我正在尝试使用 nom::multi::separated_list0 来解析它:

nom::multi::separated_list0(
    nom::character::complete::space0,syllable,)(i)?;

但是,在消耗完所有令牌后,我得到了 Err(Error(Error { input: "",code: SeparatedList }))

解决方法

使用问题

nom::multi::separated_list0(
    nom::character::complete::space0,syllable,)(i)?;

是不是 space0 分隔符匹配空字符串,所以它会到达输入字符串的末尾,separated_list0 将继续尝试消耗空字符串,因此 Err(Error(Error { input: "",code: SeparatedList })) .

我的解决方案是使用 nom::multi::many1 并处理内部解析器中的可选空格而不是 nom::multi::separated_list0 像这样:

fn syllables(i: &str) -> IResult<&str,Vec<Syllable>> {
    // many ? instead of separated_list0
    multi::many1(syllable)(i)
}

fn syllable(i: &str) -> IResult<&str,Syllable> {
    let (rest,(_,pronunciation,tone)) = sequence::tuple((

        // and handle the optional space
        //              here ?
        character::complete::space0,character::complete::alpha1,character::complete::digit0,))(i)?;

    Ok((rest,Syllable::new(pronunciation,tone)))
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。