从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()。