Each module is compiled separately and then they are all linked together. The parser part of the code is written as a separate module which can be linked in with any one of 3 other codes. Therefore, what the compiler sees after pre-processing is one massive file. Doing it this way is perfectly valid C, but it does have some drawbacks when compared to using modules. Perhaps the most obvious reason for using modules is to break a very large program into manageable chunks.
Most editors have a limit on the size of file they can handle.
An added fringe benefit is that by using a makefile to do the compilation, you only need to re-compile the modules that have changed since your last compilation. Dividing the code into modules also breaks up the code into logical units, which makes it easier to read. The C language only allows access to variables in another module if they are declared with an extern statement. This enforces the logical separation of the modules since the programmer cannot inadvertantly access global variables in other modules. This meant that the code was modular right from the start.