使用 ReadP 解析字符串的多个实例

Parse multiple instances of a string using ReadP

问题陈述:解析 "ABCDFGABIJABGHA"

中的字符串 "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)