state = start last-start = input.position transition = transition-for (state, input.current-char) if (transition) { state = transition.state # move if (state.accepts) { # memo memo.type = state.type memo.position = input.position } advance (input) # advance } else { push (output-queue, token { # token type = memo.type value = input.character-range ( last-start memo.position ) }) input.position = memo.position + 1 # rewind state = start # restart last-start = input.position }