Thanks for explaining it, @lwsanty!
But I think the answer is a bit too low-level and may not answer questions that end users might have in mind.
For example, the
PreprocessCode stages are split only in the code to properly isolate internal interfaces. For the user, it’s a single stage.
Same is true for
Namespace. Although it’s technically a separate stage, it can be considered a part of the
Semantic, regardless of the fact that it runs at the end. It’s an implementation detail that may change in the future.
Also, the answer explains what are the stages, but not why they exist and what is the difference.
In other words, why should a user choose one parsing mode over the other?