← 返回目录

第六章:类型检查

实现 TypeChecker,检查 number、boolean、字符串、二元运算和函数返回值。

1. 类型规则

TypeChecker 读取 AST 并给表达式推导 ValueType。checkBinary() 要限制 number 运算和 boolean 条件,if 与 while 的 condition must be boolean,checkReturn() 则保证函数 返回值 和声明类型一致。

type ValueType = "number" | "boolean" | "string" | "void";

class TypeChecker {
  checkBinary(operator: string, left: ValueType, right: ValueType): ValueType {
    if (["+", "-", "*", "/"].includes(operator) && left === "number" && right === "number") {
      return "number";
    }
    if ([">", "<", "=="].includes(operator)) return "boolean";
    throw new Error("类型不匹配");
  }

  checkReturn(expected: ValueType, actual: ValueType): void {
    if (expected !== actual) throw new Error("返回值 类型不匹配");
  }
}

2. 函数示例

MiniLang 函数 fn add(a: number, b: number): number { return a + b; } 会把参数和返回类型加入函数符号表。return a + b 的推导结果必须是 number。

fn add(a: number, b: number): number { return a + b; }
上一章:作用域与符号表 返回目录 下一章:中间表示 IR