rethink lexer and parser, start with a better parser structure