state = start input->remember-starting-position while (input->has-more) { state = state->transition-for (input->current-char) || error-state # move if (state->is-error) { 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 } else { if (state->accepts) { # memo last-accept-state = state input->remember-accept-position } input->advance # advance } }