Skip to content

zerosrat/js.js

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

简单 JavaScript 引擎

一个用 JavaScript 编写的简单 JavaScript 引擎,用于学习编译原理和解释器设计。

🚀 特性

  • 词法分析器 (Lexer): 将源代码转换为 token 流
  • 语法分析器 (Parser): 将 token 流转换为抽象语法树 (AST)
  • 解释器 (Interpreter): 执行 AST 并返回结果
  • 支持的语言特性:
    • 变量声明 (let, const, var)
    • 基本数据类型 (数字、字符串、布尔值、null、undefined)
    • 算术运算 (+, -, *, /, %)
    • 比较运算 (==, !=, <, >, <=, >=)
    • 函数声明和调用
    • 条件语句 (if/else)
    • 循环语句 (for, while)
    • 数组和对象字面量
    • 成员访问 (obj.prop, obj[prop])
    • 作用域和闭包

📁 项目结构

├── src/
│   ├── lexer.js      # 词法分析器
│   ├── parser.js     # 语法分析器
│   ├── ast.js        # AST 节点定义
│   ├── interpreter.js # 解释器
│   └── index.js      # 主引擎文件
├── test/
│   └── test-lexer-parser.js # 测试文件
├── demo/
│   └── demo.js       # 演示文件
└── package.json

🎯 快速开始

安装依赖

npm install

运行演示

npm run demo

运行测试

npm test

💡 使用示例

import { SimpleJSEngine } from './src/index.js';

const engine = new SimpleJSEngine();

// 执行 JavaScript 代码
const result = engine.run(`
  function fibonacci(n) {
    if (n <= 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
  }

  fibonacci(10);
`);

console.log(result.result); // 55

API 说明

  • engine.run(code) - 执行 JavaScript 代码
  • engine.tokenize(code) - 只进行词法分析
  • engine.parse(code) - 进行词法和语法分析
  • engine.printAST(code) - 打印 AST 结构
  • engine.getASTJSON(code) - 获取 AST 的 JSON 表示

🧪 支持的语法示例

变量和基本运算

let x = 10;
let y = 20;
let result = x + y * 2; // 50

函数

function add(a, b) {
  return a + b;
}

let sum = add(5, 3); // 8

条件语句

let score = 85;
if (score >= 80) {
  console.log("优秀");
} else {
  console.log("需要努力");
}

循环

let sum = 0;
for (let i = 1; i <= 10; i = i + 1) {
  sum = sum + i;
}
console.log(sum); // 55

数组和对象

let arr = [1, 2, 3, 4, 5];
let obj = {
  name: "张三",
  age: 25
};

console.log(arr[0]);     // 1
console.log(obj.name);   // "张三"

闭包

function createCounter() {
  let count = 0;
  return function() {
    count = count + 1;
    return count;
  };
}

let counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2

🏗️ 架构设计

1. 词法分析 (Lexing)

将源代码字符串转换为 token 流:

"let x = 42;" → [LET, IDENTIFIER(x), ASSIGN, NUMBER(42), SEMICOLON]

2. 语法分析 (Parsing)

将 token 流转换为抽象语法树:

[LET, IDENTIFIER(x), ASSIGN, NUMBER(42)] → VariableDeclaration AST Node

3. 解释执行 (Interpreting)

遍历 AST 并执行相应的操作:

VariableDeclaration → 在环境中定义变量 x = 42

🎓 学习价值

这个项目帮助你理解:

  1. 编译原理基础

    • 词法分析的工作原理
    • 语法分析和 AST 构建
    • 递归下降解析器
  2. 解释器设计

    • 树遍历解释器
    • 环境和作用域管理
    • 函数调用和闭包实现
  3. JavaScript 语言特性

    • 变量提升和作用域
    • 函数是一等公民
    • 动态类型系统

🔧 扩展建议

  1. 添加更多语言特性

    • try/catch 异常处理
    • 箭头函数 () => {}
    • 模板字符串 `Hello ${name}`
    • 解构赋值
  2. 性能优化

    • 字节码编译
    • 简单的 JIT 编译
    • 垃圾回收优化
  3. 开发工具

    • 调试器支持
    • 源码映射
    • 性能分析器
  4. 标准库

    • 更多内置对象 (Array, Object, Math)
    • 异步支持 (Promise, async/await)
    • 模块系统

📚 参考资料

🤝 贡献

欢迎提交 Issue 和 Pull Request!

📄 许可证

MIT License


🎉 恭喜你完成了一个 JavaScript 引擎的学习之旅!

这个项目展示了现代编程语言引擎的核心概念。虽然功能相对简单,但它包含了真实 JavaScript 引擎的基本组件。通过学习和扩展这个项目,你将对编译原理、解释器设计和 JavaScript 语言本身有更深入的理解。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published