24、解析器组合子:从基础到JSON解析与错误处理

解析器组合子:从基础到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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值