[英]How do I sepBy ambiguous parse with Parsec?
我正在嘗試使用由多個字符組成的定界符來分隔字符串,但是問題是這些字符中的每個字符都可以在非定界字符串中單獨出現。 例如,我有foo*X*bar*X*baz
,其中的分隔符是*X*
,因此我想獲取[foo, bar, baz]
,但是其中每個都可以包含*
或X
我努力了
sepBy (many anyChar) delimiter
但這只是吞下整個字符串,如果我這樣做,則給出"foo*X*bar*X*baz"
sepBy anyChar (optional delimiter)
它會正確過濾出定界符,但不會對列表進行分區,返回"foobarbaz"
。 我不知道我可以嘗試其他哪種組合。
也許您想要這樣的東西,
tok = (:) <$> anyToken <*> manyTill anyChar (try (() <$ string sep) <|> eof)
anyToken
阻止我們在輸入結束時永遠循環, try
使我們避免過度渴望使用分隔符。
完整的測試代碼,
module ParsecTest where
import Control.Applicative ((<$), (<$>), (<*>))
import Data.List (intercalate)
import Text.Parsec
import Text.Parsec.String
sep,msg :: String
sep = "*X*"
msg = intercalate "*X*" ["foXo", "ba*Xr", "bX*az"]
tok :: Parser String
tok = (:) <$> anyToken <*> manyTill anyChar (try (() <$ string sep) <|> eof)
toks :: Parser [String]
toks = many tok
test :: Either ParseError [String]
test = runP toks () "" msg
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.