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:
Processes command line and sets values of internal variables depending on the flags specified by the user.
Opens input and output files.
If a listing file is being generated, writes the Listing Header.
Initializes the Error message module, Symbol table module, Scanner, and Semantic Analyzer by calling the appropriate init routine for each.
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.