编译器主要分了三条线路:
- 源代码 -> 扫描器 -> token流 -> 解析器 -> AST ->绑定器 -> Symbol(符号)
- AST -> 检查器 ~~ Symbol(符号) -> 类型检查
- AST -> 检查器 ~~ 发射器 -> js代码
一、扫描器 (scanner.ts)
二、解析器 (parser.ts)
三、绑定器 (binder.ts)
四、检查器 (checker.ts)
五、发射器 (emitter.ts)
小结
typeScript
编译器的主要工作流程如下:
词法分析:词法分析器(Lexer
)将源码分解为一系列词法单元,称为令牌(Token
)。词法分析器使用正则表达式和有限状态机来识别不同类型的令牌,如关键字、标识符、运算符和分隔符等。
语法分析:语法分析器(Parser
)根据语法规则解析令牌序列,构建抽象语法树(AST
)。语法分析器使用语法规则定义的产生式来逐步解析令牌,生成 AST
。语法分析器通常使用递归下降或者LR分析等算法。
语义分析:语义分析阶段对生成的 AST
进行进一步的处理和分析。这一阶段主要包括类型检查、作用域分析、符号解析等。类型检查阶段通过类型推断和类型检查规则验证代码的类型正确性。作用域分析阶段确定标识符的可见范围和解析顺序。符号解析阶段建立符号表,用于跟踪变量、函数和类型的定义和引用。
转换与优化:在 AST
上进行转换和优化的过程。转换包括将高级语言特性转换为等效的低级语法表示,如箭头函数转换为普通函数等。优化阶段可以包括消除冗余代码、常量折叠、内联函数等优化操作,以提升代码执行效率和性能。
代码生成:代码生成阶段将经过转换和优化后的 AST
转换为目标代码。这一过程可以包括将 AST
转换为中间表示(IR),然后根据中间表示生成目标代码。代码生成阶段需要考虑目标平台的特定约束和规则,生成对应平台可执行的代码。
输出:最后一步是将生成的目标代码输出到相应的目标,例如输出为文件、命令行输出或者直接运行在浏览器中等。