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 _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe