解析使用READP
问题描述:
问题语句的字符串的多个实例:在"ABCDFGABIJABGHA"
解析使用READP
约束解析字符串"AB"
:使用ReadP
预期的解决方案:(["AB","AB","AB"],"whatever is left")
尝试:
getAll :: ReadP a -> ReadP [a]
getAll p = many loop
where
loop = p <|> (get >> loop)
readP_to_S (getAll $ string "AB") "ABCDFGABIJABGHA"
[([],"ABCDFGABIJABGHA"),(["AB"],"CDFGABIJABGHA"),(["AB","AB"],"IJABGHA"),(["AB"],"IJABGHA"),(["AB","AB","AB"],"GHA"),(["AB","AB"],"GHA"),(["AB","AB"],"GHA"),(["AB"],"GHA")]
我最后的状态是(["AB","AB","AB"],"GHA")
。是否可以使用ReadP
来做同样的事情?
答
问题是您正在与<|>
做对称选择。如果你希望你的解析器毫无例外地使用提供的左偏向选项:<++
来匹配所有的p
。
getAll :: ReadP a -> ReadP [a]
getAll p = many loop
where
loop = p <++ (get >> loop)