lexer tracks lines and characters