← 返回目录

第三章:语法分析 Parser

用递归下降 Parser 处理语句、表达式、优先级和分组表达式。

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;
上一章:词法分析 Lexer 返回目录 下一章:AST 与语义模型