Haskell Parsec combinator 'many' é aplicado a um analisador que aceita uma string vazia
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
Quando eu corroparseTest items "a|b|c"
com o código acima recebo o seguinte erro:
*** Exception: Text.ParserCombinators.Parsec.Prim.many:
combinator 'many' is applied to a parser that accepts an empty string.
Eu acredito que tem algo a ver comeof
emany item
, se eu removereof
, então eu posso fazê-lo funcionar, desde que a linha não termineeof
, o que torna inútil.
Eu percebo que eu poderia usarsepBy
mas o que me interessa é porque este código não funciona e como fazê-lo funcionar.