用js实现js解释器
使用 JavaScript 实现 JavaScript 解释器
实现一个 JavaScript 解释器是一个复杂的任务,通常涉及词法分析、语法分析、作用域管理和执行引擎等核心组件。以下是关键步骤和示例代码框架:
词法分析(Lexer)
词法分析器将源代码分解为标记(tokens),例如标识符、关键字、运算符等。
function tokenize(code) {
const tokens = [];
let current = 0;
const WHITESPACE = /\s/;
const NUMBERS = /[0-9]/;
const LETTERS = /[a-z_]/i;
while (current < code.length) {
let char = code[current];
// 跳过空白字符
if (WHITESPACE.test(char)) {
current++;
continue;
}
// 处理数字字面量
if (NUMBERS.test(char)) {
let value = '';
while (NUMBERS.test(char)) {
value += char;
char = code[++current];
}
tokens.push({ type: 'NUMBER', value });
continue;
}
// 处理标识符和关键字
if (LETTERS.test(char)) {
let value = '';
while (LETTERS.test(char) || NUMBERS.test(char)) {
value += char;
char = code[++current];
}
tokens.push({ type: 'IDENTIFIER', value });
continue;
}
// 处理运算符
if (['+', '-', '*', '/'].includes(char)) {
tokens.push({ type: 'OPERATOR', value: char });
current++;
continue;
}
throw new Error(`Unknown character: ${char}`);
}
return tokens;
}
语法分析(Parser)
语法分析器将标记转换为抽象语法树(AST)。
function parse(tokens) {
let current = 0;
function walk() {
let token = tokens[current];
// 数字字面量
if (token.type === 'NUMBER') {
current++;
return {
type: 'NumberLiteral',
value: token.value
};
}
// 标识符
if (token.type === 'IDENTIFIER') {
current++;
return {
type: 'Identifier',
name: token.value
};
}
// 调用表达式
if (token.type === 'OPERATOR') {
const operator = token.value;
current++;
const left = walk();
const right = walk();
return {
type: 'CallExpression',
operator,
left,
right
};
}
throw new Error(`Unknown token type: ${token.type}`);
}
const ast = {
type: 'Program',
body: walk()
};
return ast;
}
解释执行(Interpreter)
解释器遍历 AST 并执行计算。

function interpret(ast) {
const environment = {};
function evaluate(node) {
// 数字字面量
if (node.type === 'NumberLiteral') {
return Number(node.value);
}
// 标识符
if (node.type === 'Identifier') {
if (!environment[node.name]) {
throw new Error(`Undefined variable: ${node.name}`);
}
return environment[node.name];
}
// 调用表达式
if (node.type === 'CallExpression') {
const left = evaluate(node.left);
const right = evaluate(node.right);
switch (node.operator) {
case '+': return left + right;
case '-': return left - right;
case '*': return left * right;
case '/': return left / right;
default: throw new Error(`Unknown operator: ${node.operator}`);
}
}
throw new Error(`Unknown node type: ${node.type}`);
}
return evaluate(ast.body);
}
示例使用
const code = '1 + 2 * 3';
const tokens = tokenize(code);
const ast = parse(tokens);
const result = interpret(ast);
console.log(result); // 输出: 7
扩展功能建议
- 变量声明:添加
let关键字支持 - 函数定义:实现函数声明和调用
- 作用域管理:引入作用域链
- 控制流:支持
if语句和循环 - 错误处理:增强错误定位和报告
完整实现 JavaScript 解释器需要处理更多复杂特性,上述代码仅为基本算术表达式解释的简化示例。实际项目中可参考现有开源实现如 Babel 的解析器或 Acorn 等工具。






