)rv comment
!head('Tour of the Compiler')
there are two main loops in the compiler:
!pt "compile" is responsible for doing the syntactic analysis and generating
the code trees for each statment.
!pt "code" is responsible for the code generation, by processing the code
trees and generating the object module.
!head('COMPILE')
!pt calls "initpgm" to initialize for compiling a new program section.
!pt sets the error exit (via "setexit") to gain control in case of an
error being detected at a lower level.
!pt reads each statment via "readstmt"
!pt picks up a label via "scanlabel".
!pt calls "compress" to take out the blanks,
(taking care not to mangle hollerith and string constants),
!pt calls "classify" to find out what sort of statment it is,
!pt calls "dolabel" if there was a label present 
!pt calls "process" to
actually process the statment.
!pt calls "stmtend" to dump the generated expression tree onto the file "tmp".
!pt "code" is called when "compile" has processed an "end" statment.
!head('CODE')
!pt allocates common (via "alloccm") 
!pt "codepass" does one pass thru the code trees
to generate the addresses for labels and constants.
!pt allocates the constants via "allocconsts" and the data initialized
variables via "allocdata"
!pt the normal variables are allocated via
"allocbss".
!pt the object file is created via "objcreate".
!pt the second pass thru the code tree is made, actually writing the genrated
code onto the object file via "codepass".
!pt the constants are now actually written into the proper place (at the end
of the TEXT section) via "allocconsts".
!pt "endobj" is called to clean up and write the symbol table.
