lexer: split into .h and .cpp