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; }