Manipulating Haskell source: abstract syntax, lexer, parser, and pretty-printer