Phases are not necessarily executed one after another.
Intermediate data structures do not always exist in
their entirety at any one time.
In the case of an interpreter, interpretation can happen
on the attributed syntax tree or on the intermediate code. For
simple languages somtimes even during parsing instead of building a tree.