2017-04-09 46 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)