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
添加
尝试
以避免急于解析