That is because of macros. Compilers for languages with macros are usually pretty weird, because compilation is not a single direction pipeline any more, but rather something that goes back and forth between the compiler and the user-provided macros. The regular approach of a compiler seen as a neatly ordered set of passes breaks down when you introduce true macros.