Note however that the main reason those are handled separately is to deal with certain limitations in the autolexer. There's no reason the underlying reductions can't share most of their code, except for the bit that decides whether to return partial results.