使用 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)
问题陈述:解析 "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)