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.