hmm
refactor and make lexer a bit more elegant