gpt4 book ai didi

haskell - 如何使用 Parsec 进行歧义解析?

转载 作者:行者123 更新时间:2023-12-04 04:40:35 27 4
gpt4 key购买 nike

我试图使用由多个字符组成的分隔符来分隔字符串,但问题是这些字符中的每一个都可以在非分隔字符串中单独出现。例如,我有 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

关于haskell - 如何使用 Parsec 进行歧义解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18968998/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com