Mini JS Parser 文档

本目录的目标是帮助 Parser 初学者从零理解这个项目的编译前端流水线,并能对照源码阅读与扩展。

本项目实现了一条简化但完整的流水线:

  1. Scanner:源码字符流 → Token 流
  2. Parser:Token 流 → AST(抽象语法树)
  3. Binder:为 AST 补齐 parent、作用域 locals、符号引用、控制流可达性标注
  4. Transformer:以访问器模式重写 AST(常量折叠、死代码消除、重命名等)
  5. Emitter:AST → JavaScript 代码(可选 SourceMap、可选 minify)
  6. Compiler:把上述步骤编排成一个 compile() 入口(支持插件与内置 minify)

学习路线(建议顺序)

  1. 先读 ast.ts:理解 AST 结构、SyntaxKind、Symbol/locals、FlowNode/FlowFlags
  2. 再读 scanner.ts:理解 token 化与 lookAhead
  3. 再读 parser.ts:重点理解递归下降与表达式优先级算法
  4. 再读 binder.ts:理解作用域、符号引用、不可达标注为何对优化必要
  5. 再读 transformer.tsfactory.ts:理解“访问并返回新节点”的重写框架
  6. 再读内置优化:constant folding / dead code elimination / rename identifiers
  7. 最后读 emitter.tssourcemap.ts:理解打印与映射编码
  8. compiler.ts 串起来验证整体思路

模块文档索引(不含 diagnostics)

总体与编排

  • compiler.ts:compile() 的流水线编排(Parse/Bind/Transform/Emit)
  • minifier.ts:默认 minify pipeline 的组合与顺序

基础数据模型

  • ast.ts:SyntaxKind、AST、Symbol/locals、FlowNode/FlowFlags
  • types.ts:CharacterCodes 与 ErrorKind
  • utilities.ts:运算符优先级表与表达式解析支撑

前端核心

  • scanner.ts:词法分析与 token 化策略
  • parser.ts:递归下降 + 表达式优先级算法(precedence climbing)
  • binder.ts:作用域/符号/可达性标注

中端:变换框架与内置优化

后端:代码生成

错误报告适配层

  • report.ts:从 parser 错误到 diagnostics 报告的桥接(不展开 diagnostics 实现)