feat: 修改if的int表示条件为boolean

This commit is contained in:
luke 2025-06-11 22:52:36 +08:00
parent 5c7007c966
commit 1c403d4839

View File

@ -2,12 +2,12 @@ package org.jcnc.snow.compiler.semantic.analyzers.statement;
import org.jcnc.snow.compiler.parser.ast.FunctionNode; import org.jcnc.snow.compiler.parser.ast.FunctionNode;
import org.jcnc.snow.compiler.parser.ast.IfNode; import org.jcnc.snow.compiler.parser.ast.IfNode;
import org.jcnc.snow.compiler.semantic.analyzers.TypeUtils;
import org.jcnc.snow.compiler.semantic.analyzers.base.StatementAnalyzer; import org.jcnc.snow.compiler.semantic.analyzers.base.StatementAnalyzer;
import org.jcnc.snow.compiler.semantic.core.Context; import org.jcnc.snow.compiler.semantic.core.Context;
import org.jcnc.snow.compiler.semantic.core.ModuleInfo; import org.jcnc.snow.compiler.semantic.core.ModuleInfo;
import org.jcnc.snow.compiler.semantic.error.SemanticError; import org.jcnc.snow.compiler.semantic.error.SemanticError;
import org.jcnc.snow.compiler.semantic.symbol.SymbolTable; import org.jcnc.snow.compiler.semantic.symbol.SymbolTable;
import org.jcnc.snow.compiler.semantic.type.BuiltinType;
import org.jcnc.snow.compiler.semantic.type.Type; import org.jcnc.snow.compiler.semantic.type.Type;
/** /**
@ -15,7 +15,7 @@ import org.jcnc.snow.compiler.semantic.type.Type;
* <p> * <p>
* 主要职责如下 * 主要职责如下
* <ul> * <ul>
* <li>条件表达式类型检查确认 if 的条件表达式类型为 int用于真假判断否则记录语义错误</li> * <li>条件表达式类型检查确认 if 的条件表达式类型为 boolean否则记录语义错误</li>
* <li>块级作用域分别为 then 分支和 else 分支创建独立的符号表SymbolTable * <li>块级作用域分别为 then 分支和 else 分支创建独立的符号表SymbolTable
* 支持分支内变量的块级作用域防止分支内声明的变量污染外部或互相干扰允许分支内变量同名遮蔽</li> * 支持分支内变量的块级作用域防止分支内声明的变量污染外部或互相干扰允许分支内变量同名遮蔽</li>
* <li>分支递归分析 then else 分支的每条语句递归调用对应的语义分析器进行语义检查</li> * <li>分支递归分析 then else 分支的每条语句递归调用对应的语义分析器进行语义检查</li>
@ -48,9 +48,9 @@ public class IfAnalyzer implements StatementAnalyzer<IfNode> {
var exprAnalyzer = ctx.getRegistry().getExpressionAnalyzer(ifn.condition()); var exprAnalyzer = ctx.getRegistry().getExpressionAnalyzer(ifn.condition());
// 对条件表达式执行类型分析 // 对条件表达式执行类型分析
Type condType = exprAnalyzer.analyze(ctx, mi, fn, locals, ifn.condition()); Type condType = exprAnalyzer.analyze(ctx, mi, fn, locals, ifn.condition());
// 判断条件类型是否为 intSCompiler 约定 int 表示真假否则报错 // 判断条件类型是否为 boolean否则报错
if (condType != BuiltinType.INT) { if (TypeUtils.isLogic(condType)) {
ctx.getErrors().add(new SemanticError(ifn, "if 条件必须为 int 类型(表示真假)")); ctx.getErrors().add(new SemanticError(ifn, "if 条件必须为 boolean"));
} }
// 2. 分析 then 分支 // 2. 分析 then 分支