state->start input->remember-starting-position while (input->has-more) { if (state->attempt-transition-for (input->current-char)) { # move if (state->accepts) { # memo last-accept-state = state input->remember-accept-position } input->advance # advance } else { push (output-queue, token { # token type = last-accept-state->type value = input->last-accepted-string }) input->rewind # rewind state = start # restart input->remember-starting-position } }