解析器组合子:从基础到JSON解析与错误处理
1. 切片与非空重复
在解析任务中,我们常常需要处理字符的重复情况。例如,计算字符串中 ‘a’ 字符的数量。使用 many 和 map 组合确实可以实现这个任务,但先构建一个 List[Char] 然后丢弃其值并提取长度的做法效率不高。我们希望有一个组合子能直接返回解析器检查的输入字符串部分,于是引入了 slice 组合子:
extension [A](p: Parser[A]) def slice: Parser[String]
slice 组合子会在解析成功时返回解析器检查的输入字符串部分。例如, (char('a') | char('b')).many.slice.run("aaba") 会返回 Right("aaba") ,我们忽略 many 累积的列表,直接返回解析器匹配的输入字符串部分。
有了 slice ,计算 ‘a’ 字符数量的解析器可以写成:
char('a').many.slice.map(_.size)
这里的 _.size 函数引用的是 String 的 siz
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



