Try this simple program:

import Text.ParserCombinators.Parsec

ppAny = tokenPrim show (\p _ _ -> p) (\t -> Just t)
ppTest = many ppAny

p s =
   case runParser ppTest True "" s of
       Left error -> show error
       Right result -> result


main =  do  let fname = "C:/main.i"
           f <- readFile fname

           let tokens = p f

           putStrLn . show $ head tokens

This is the simplest expression of using Parsec, it just returns the input unchanged. But it already seems to have a big memory leak. When parsing a 2 MB file, I'm seeing the program grow in size up to about 160 MB before it ends.

I assume this is known behavior. I believe it's because of the way Parsec deals with errors: when you chain two parsers in sequence, the result of the first one (in this case the head of the list) is not available until it knows if the second one failed or not.

Is there any known alternative that doesn't exhibit this behavior? It would have to somehow return errors inline or on a "side channel". I'll be toying with this sort of thing for a while.

  Thanx!

JCAB

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to