
On Tue, Apr 19, 2005 at 09:47:22AM +0200, Ketil Malde wrote:
Hi,
I've started using Parsec for my parsing needs, and must say I'm very happy with it. There is one thing that I'm struggling with implementing though.
Basically, I want to parse a file containing multiple records. I already have a parser for a single record, and of course I could parse the file simply as
many record
However, this gives me the type
Either ParseError [Record]
which AFAICT, requires the whole file to be parsed correctly before any result is returned. I think it would be better for my purposes to have a parser of type
[Either ParseError Record]
so that the list of Records can be processed in an on-line fashion, until an error occurs.
Is there an obvious way to achieve this?
If you have one record per line, this is simple: map (parse record "?") (lines cs) But if you want proper source positions in error messages or your records are not so easily separated, you can use something like this: lazyMany :: GenParser Char () a -> SourceName -> [Char] -> [a] lazyMany p file contents = lm state0 where Right state0 = parse getParserState file contents lm state = case parse p' "" "" of Left err -> error (show err) Right x -> x where p' = do setParserState state choice [ do eof return [] , do x <- p state' <- getParserState return (x : lm state') ] Best regards Tomasz