Purpose
 

fb.bas:编译器的主要模块,解析器/词法/父/母/ IR /发射器的父模块,toplevel文件和包含文件处理
parser*.bas:解析/编译功能:lexer令牌 - >AST节点。
symb*.bas:符号表和查找,命名空间/范围处理。
rtl*.bas:帮助构建对rtlib / gfxlib函数的AST调用。

解析器的结构与FreeBASIC语法非常密切。基本上语法的每个元素都有一个解析函数。

解析器从词法分析器检索令牌,并验证输入源代码。大多数错误信息(除了命令行和文件访问错误)来自这里。另外,解析器函数建立相应的AST。这是编译过程的核心。

许多解析器(或者相当于编译器)的函数(以'c'为前缀)解析并跳过它们所代表的语法元素,或者如果没有找到它们就会显示错误。解析器是相当递归的,主要是因为表达式解析器和#include解析。

从解析到发布

当解析代码时,建立相应的AST来表示程序。AST用于表示可执行代码,但也用于保存临时表达式,例如在解析类型或过程声明时找到的常量或初始化值。AST确定not 包含IF,DO / LOOP,GOTO,RETURN,EXIT DO等代码流结构的节点,但它包含标签和分支。同样,几个操作(如IIF(),ANDALSO,ORELSE,字段取消引用,成员访问)被替换为AST中相应的较低级别操作集。

解析函数后,对该函数的AST进行优化,然后从上到下通过每个节点上的astLoad*()调用递归地发送。请注意,每个AST节点都有自己的astLoad()实现。