regular-state::process (input) { input->remember-accept-position if (self->accepts) # memo-2 input->advance # advance } error-state::process (input) { push (output-queue, token { # token type = last-accept.type value = input->last-accepted-string }) input->rewind # rewind } error-state::transition-for (char) { return (start) # restart-1 } start-state::process (input) { input->remember-starting-position # restart-2 } state = start-state while (input->has-more) { last-accept = state if (state->accepts) # memo-1 state->process (input) state = state->transition-for (input->current-char) || error-state # move }