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.