Program Controller

The Program Controller controls invocation of the initialization routines, the other major compiler modules, and the finish routine.

Initialization is performed by the routine init at the very beginning of execution.

Program Controller

See figure 2-1 for a pseudo-code description of the Program Controller processing.

init();

for (each subprogram) {
    reinit();   /\* init for subprogram \*/
    parser();   /\* Scan, parse and semantically analyze \*/

    if (no severe errors) {
        transform();
        convert_output();
        output();
    }
}

finish();

Figure 2-1 Program Controller Operation

Note that each subprogram is completely processed and output before the next subprogram is processed. Conceptually, it is as if each subprogram were in a separate file.

Also, note that invocation of the Scanner and Semantic Analyzer are controlled by the Parser in a traditional bottom-up syntax directed translation.

Init

The init module performs the following five major tasks:

  1. Processes command line and sets values of internal variables depending on the flags specified by the user.

  2. Opens input and output files.

  3. If a listing file is being generated, writes the Listing Header.

  4. Initializes the Error message module, Symbol table module, Scanner, and Semantic Analyzer by calling the appropriate init routine for each.

  5. If the user requested that the source file be run through the C preprocessor, invoke the internal preprocessor (c fpp) and write its output to a temporary file, which becomes the input file to the parser.

Adding Command Line Flags

The command line processor searches the structure swtchtab[] (defined in main.c ) to find valid flags or flag prefixes. To add a flag, add the new flag (without the preceeding “(mi”) to swtchtab[]’s initialization, keeping the flags in lexicographic order. Also add a case constant to the initialization. Switch case constants are #define’d constants of the form SW_<flag name in caps>, and appear above the definition of swtchtab. The case constant must be unique but numerical order is not necessary. (i.e., you don’t have to change existing constants, just use the next biggest unused integer.)

Add the case label SW_<flag name in caps>: to init() (also defined in main.c ). Also, add code to process flag and any values that follow the flag. See existing code in init() for examples.

Finish

finish is called at the end of compiler execution to close files, write a compilation summary line to the user’s terminal, and exit.