如何解决用 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 举报,一经查实,本站将立刻删除。