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