Top level parsing process

fb.bas:fbCompile() is called from the fbc frontend for every input file. 
Parsing (and compiling) of the file begins here.

fb.bas:fbCompile()
	* Open the input .bas
	* Start the emitter (ir) (Open the output .asm)
	* fbMainBegin() (Build the AST for the implicit main() or static 
	  constructor for module-level code)
	* fbPreIncludes()
		* fbIncludeFile() for every preinclude (found on the fbc command 
		  line)
	* cProgram()
	* fbMainEnd() (Close the implicit main())
	* Finish emitting (ir) (Finish generating the .asm and close it)
	* Close the input .bas

fb.bas:fbIncludeFile()
	* Include file search
	* lexPush() (Push a new lexer context to parse this #include file 
	  without disturbing the lexer's state in the parent file)
	* Open the include file
	* cProgram()
	* Close the include file
	* lexPop() (Restore the lexer state to the parent file)

parser-toplevel.bas:cProgram() is the root of the FB grammar, and parses a 
file. Here's a short & quick run down of what is done:
	* cLine() repeatedly until EOF
		* cLabel()
		* cStatement()
			* Declarations
				* UDT declarations, typedefs
				* Variables (DIM, VAR, ...)
				* Procedure declarations (DECLARE)
				* Procedure bodies (SUB, FUNCTION, ...)
					(Procs temporarily replace the implicit module level 
					procedure, so any AST nodes go into them instead of the 
					implicit main())
			* Compounds statements (IF/ELSE, DO/LOOP, EXIT/CONTINUE DO, ...)
			* Procedure calls
			* Function result assignments
			* Quirk statements (special QB rtlib/gfxlib statements)
			* ASM blocks
			* Assignments
			* Procedure pointer calls

	and most of them use cExpression() at some point.

