rewrote lexer to use combinators