import Text.ParserCombinators.Parsec
delimiter :: Parser ()
delimiter = do char '|'
return ()
<?> "delimiter"
eol :: Parser ()
eol = do oneOf "\n\r"
return ()
<?> "end of line"
item :: Parser String
item = do entry <- manyTill anyChar (try eol <|> try delimiter <|> eof)
return entry
items :: Parser [String]
items = do result <- many item
return result
当我parseTest items "a|b|c"
使用上面的代码运行时,出现以下错误:
*** Exception: Text.ParserCombinators.Parsec.Prim.many:
combinator 'many' is applied to a parser that accepts an empty string.
我相信它与eof
and有关系many item
,如果我删除eof
,那么只要该行不以 结尾,我就可以让它工作eof
,这使得它有点没用。
我意识到我可以使用sepBy
,但我感兴趣的是为什么这段代码不起作用以及如何使它起作用。