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

This commit is contained in:
luke 2025-06-11 22:52:42 +08:00
parent 1c403d4839
commit 9e882236d0

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.LoopNode; import org.jcnc.snow.compiler.parser.ast.LoopNode;
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;
/** /**
@ -17,7 +17,7 @@ import org.jcnc.snow.compiler.semantic.type.Type;
* <ul> * <ul>
* <li>为整个循环体包括初始化条件更新循环体本身创建独立的块级符号表作用域保证循环内变量与外部隔离</li> * <li>为整个循环体包括初始化条件更新循环体本身创建独立的块级符号表作用域保证循环内变量与外部隔离</li>
* <li>依次分析初始化语句条件表达式更新语句和循环体各语句并递归检查嵌套的语法结构</li> * <li>依次分析初始化语句条件表达式更新语句和循环体各语句并递归检查嵌套的语法结构</li>
* <li>检查条件表达式的类型必须为 int布尔条件否则记录语义错误</li> * <li>检查条件表达式的类型必须为 boolean否则记录语义错误</li>
* <li>支持所有错误的收集而不中断流程便于一次性输出全部问题</li> * <li>支持所有错误的收集而不中断流程便于一次性输出全部问题</li>
* </ul> * </ul>
* 该分析器实现了 SCompiler 语言的块级作用域循环与类型健壮性是健全语义分析的基础部分 * 该分析器实现了 SCompiler 语言的块级作用域循环与类型健壮性是健全语义分析的基础部分
@ -53,9 +53,9 @@ public class LoopAnalyzer implements StatementAnalyzer<LoopNode> {
// 3. 分析条件表达式 for(...; cond; ...) while(cond) // 3. 分析条件表达式 for(...; cond; ...) while(cond)
var condAnalyzer = ctx.getRegistry().getExpressionAnalyzer(ln.condition()); var condAnalyzer = ctx.getRegistry().getExpressionAnalyzer(ln.condition());
Type condType = condAnalyzer.analyze(ctx, mi, fn, loopScope, ln.condition()); Type condType = condAnalyzer.analyze(ctx, mi, fn, loopScope, ln.condition());
// 条件类型必须为 int bool否则记录错误 // 条件类型必须为 boolean否则记录错误
if (condType != BuiltinType.INT) { if (TypeUtils.isLogic(condType)) {
ctx.getErrors().add(new SemanticError(ln, "loop 条件必须为 int 类型(表示真假)")); ctx.getErrors().add(new SemanticError(ln, "loop 条件必须为 boolean"));
} }
// 4. 分析更新语句 for(...; ...; update) // 4. 分析更新语句 for(...; ...; update)