Top level parsing process
 

从fbc前端为每个输入文件调用fb.bas:fbCompile().该文件的解析(和编译)从这里开始。

fb.bas:fbCompile()
  • 打开输入.bas
  • 启动发射器(ir)(打开输出.asm)
  • fbMainBegin()(为模块级代码构建隐式main()或静态构造函数的AST)
  • fbPreIncludes()
    • fbIncludeFile()为每个preinclude(在fbc命令行中找到)
  • C()
  • fbMainEnd()(关闭隐式main())
  • 完成发射(ir)(完成生成.asm并关闭它)
  • 关闭输入.bas

fb.bas:fbIncludeFile()
  • 包括文件搜索
  • lexPush()(推一个新的词法上下文来解析这个#include文件,而不会影响父文件中的词法分析器的状态)
  • 打开包含文件
  • C()
  • 关闭包含文件
  • lexPop()(将lexer状态恢复到父文件)

parser-toplevel.bas:cProgram()FB语法的根,并解析文件。这是一个简短而快速的事情:
  • cLine()反复直到EOF
    • cLabel()
    • cStatement()
      • 声明
        • UDT声明,typedefs
        • 变量(DIM,VAR,...)
        • 程序声明(DECLARE)
        • 过程体(SUB,FUNCTION,...)
(Procs临时替换隐式模块级别的过程,所以任何AST节点进入它们而不是隐式main())
      • 化合物语句(IF / ELSE,DO / LOOP,EXIT / CONTINUE DO,...)
      • 程序调用
      • 函数结果赋值
      • Quirk语句(特殊QB rtlib / gfxlib语句)
      • ASM块
      • 赋值
      • 过程指针调用

并且大多数在某些时候使用cExpression()。