the lexer is no longer hard-coded