2017-04-09 48 views
0

问题语句的字符串的多个实例:在"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来做同样的事情?

回答

1

问题是您正在与<|>做对称选择。如果你希望你的解析器毫无例外地使用提供的左偏向选项:<++来匹配所有的p

getAll :: ReadP a -> ReadP [a] 
getAll p = many loop 
    where 
    loop = p <++ (get >> loop)