1. 递归下降的边界
Parser 从 Token 序列构建 AST。parseStatement() 处理 let、if、while、return 等语句;parseExpression() 处理表达式;getPrecedence() 让 1 + 2 * 3 保持正确优先级,分组表达式则临时覆盖默认结合方式。
class Parser {
parseStatement(): Stmt {
if (this.match(TokenType.Let)) return this.parseLet();
if (this.match(TokenType.If)) return this.parseIf();
return { kind: "expr", expr: this.parseExpression() };
}
parseExpression(minPrecedence = 0): Expr {
let left = this.parsePrimary();
while (this.getPrecedence(this.peek()) >= minPrecedence) {
left = this.parseBinary(left);
}
return left;
}
getPrecedence(token: Token): number {
return token.lexeme === "*" ? 20 : token.lexeme === "+" ? 10 : -1;
}
}
2. 表达式示例
MiniLang 的 let value: number = 1 + 2 * 3; 会生成一个以加法为根、乘法为右子树的表达式 AST。递归下降代码简单,但需要把错误恢复和优先级表放在稳定位置。
let value: number = 1 + 2 * 3;