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
わかっていますが、興味があるのは、このコードが機能しない理由と、それを機能させる方法です。