Performance (read this):

We simply can't afford passing the input through two layers of
parsing combinators (lexer + parser). Lexer is particularly sluggish. So
I've heavily refactored the lexer to use Java native regexps instead of
parsing combinators as much as possible. I reduced lexing time to
approximately half of the original. Yet, I'm still not happy with
the performance. But I can't think of any obvious hacks to improve
things further.