一个使用 TypeScript 编写的简易 JavaScript 编译器前端实现。它实现了从源码到代码生成的完整流程,包括词法分析、语法分析、语义绑定、AST 转换和代码生成。
本项目旨在用于学习和理解编译器前端的基本原理,支持 JavaScript 的一个常用子集。
- 零依赖:核心逻辑不依赖任何第三方库。
- 手写解析器:采用递归下降算法手动实现 Scanner 和 Parser。
- 完整编译管线:包含 Scanner、Parser、Binder、Transformer 和 Emitter。
- 高级功能:支持 Source Map 生成、死代码消除和常量折叠。
- 类型安全:完全使用 TypeScript 编写。
将源代码解析为抽象语法树 (AST)。
- 支持变量声明 (let)、函数声明
- 支持控制流 (if, while, for, return)
- 支持各类表达式和字面量
处理作用域和符号定义,建立 AST 节点与符号 (Symbol) 之间的联系,支持控制流分析 (Control Flow Analysis)。
提供 AST 转换框架,内置以下转换插件:
- 死代码消除 (Dead Code Elimination): 移除不可达代码和未使用的变量/函数。
- 常量折叠 (Constant Folding): 编译期计算常量表达式。
将 AST 转换回 JavaScript 代码,并支持生成 Source Map。
pnpm installimport { compile, deadCodeEliminationTransformer } from './src';
const code = `
function main() {
let x = 1 + 2;
return x;
let dead = 0; // 这行代码将被移除
}
main();
`;
const result = compile(code, {
filename: 'example.js',
sourceMap: true,
minify: false, // 开启 minify 会自动包含死代码消除和常量折叠
plugins: [deadCodeEliminationTransformer()],
});
console.log('Generated Code:\n', result.code);
console.log('Source Map:\n', result.map);本项目使用 pnpm 进行包管理,vitest 进行测试。
pnpm buildpnpm testpnpm lint
pnpm fmtsrc/compiler.ts: 编译器入口,串联整个编译流程scanner.ts: 词法分析器parser.ts: 语法分析器binder.ts: 语义绑定与作用域分析transformer.ts: AST 转换器框架transformers/: 内置转换插件 (死代码消除、常量折叠)emitter.ts: 代码生成器sourcemap.ts: Source Map 生成逻辑ast.ts: AST 节点定义factory.ts: AST 节点创建工厂index.ts: 统一导出
tests/: 单元测试
MIT