Parsing 避免使用'sepBy'解析最后一个分隔符`
我正在尝试使用Parsing 避免使用'sepBy'解析最后一个分隔符`,parsing,haskell,megaparsec,Parsing,Haskell,Megaparsec,我正在尝试使用megaparsec解析字符串 它的一部分是由分隔符分隔的字符串的重复,为此我使用了sebby。 例如考虑 sepBy (char 'a') (char 's') 这将正确解析“,“a”,“asa”。。。 如果需要使用另一个以分隔符开头的解析器继续解析,则会出现问题,如中所示 (,) <$> sepBy (char 'a') (char 's') <*> string "something" (,)sebby(char'a')(char's')字符串“s
megaparsec
解析字符串
它的一部分是由分隔符分隔的字符串的重复,为此我使用了sebby
。
例如考虑
sepBy (char 'a') (char 's')
这将正确解析“
,“a”
,“asa”
。。。
如果需要使用另一个以分隔符开头的解析器继续解析,则会出现问题,如中所示
(,) <$> sepBy (char 'a') (char 's') <*> string "something"
(,)sebby(char'a')(char's')字符串“something”
如果我试图用这个解析器解析字符串“asasasomething”
,我希望得到(“aa”,“something”)
。相反,我得到了一个错误,因为在第二个s
之后没有a
我也尝试过使用
sepEndBy
,但结果是一样的我解决了它,如下所示
megapersec
使用的sebby
的实现是
sepBy :: MonadPlus m => m a -> m sep -> m [a]
sepBy p sep = do
r <- C.optional p
case r of
Nothing -> return []
Just x -> (x:) <$> many (sep >> p)
sebby::MonadPlus m=>ma->m sep->m[a]
sebby p sep=do
r返回[]
只有x->(x:)很多(九月>>p)
我把它改成
sepBy :: Parser a -> Parser sep -> Parser [a]
sepBy p sep = do
r <- optional p
case r of
Nothing -> return []
Just x -> (x:) <$> many (try $ sep >> p)
sebby::Parser a->Parser sep->Parser[a]
sebby p sep=do
r返回[]
只有x->(x:)多个(试试$sep>>p)
要将其专门用于Parsec
添加尝试以避免急于解析