First pass at lexer