From 584e226051508b44a668f34efb551ad789d71c85 Mon Sep 17 00:00:00 2001 From: Luke Date: Fri, 29 Aug 2025 18:21:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=89=A9=E5=B1=95=E7=AD=BE=E5=90=8D?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E5=99=A8=E6=94=AF=E6=8C=81=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BD=93=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增加结构体类型签名的登记逻辑,包括构造函数和方法签名 - 优化模块级函数签名的注册流程,提高代码可读性 - 完善导入模块的合法性校验,确保模块存在性 --- .../semantic/core/SignatureRegistrar.java | 115 +++++++++++------- 1 file changed, 69 insertions(+), 46 deletions(-) diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/core/SignatureRegistrar.java b/src/main/java/org/jcnc/snow/compiler/semantic/core/SignatureRegistrar.java index e542646..5040493 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/core/SignatureRegistrar.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/core/SignatureRegistrar.java @@ -1,12 +1,10 @@ package org.jcnc.snow.compiler.semantic.core; -import org.jcnc.snow.compiler.parser.ast.FunctionNode; -import org.jcnc.snow.compiler.parser.ast.ImportNode; -import org.jcnc.snow.compiler.parser.ast.ModuleNode; -import org.jcnc.snow.compiler.parser.ast.ParameterNode; +import org.jcnc.snow.compiler.parser.ast.*; import org.jcnc.snow.compiler.semantic.error.SemanticError; import org.jcnc.snow.compiler.semantic.type.BuiltinType; import org.jcnc.snow.compiler.semantic.type.FunctionType; +import org.jcnc.snow.compiler.semantic.type.StructType; import org.jcnc.snow.compiler.semantic.type.Type; import java.util.ArrayList; @@ -14,71 +12,96 @@ import java.util.List; import java.util.Optional; /** - * {@code SignatureRegistrar} 负责函数签名登记与导入语义检查。 + * {@code SignatureRegistrar} *

- * 在语义分析初期阶段,它遍历每个模块,完成以下任务: + * 语义分析准备阶段:负责函数签名登记与 import 模块存在性校验。 *

- * 本组件作为语义分析的准备阶段,为后续函数体检查提供函数类型上下文。 - * - * @param ctx 全局语义分析上下文,提供模块、类型、错误管理等功能 + * 作为语义分析前置流程,为后续函数体和表达式分析提供类型环境。 + *

*/ public record SignatureRegistrar(Context ctx) { /** - * 构造函数签名注册器。 + * 遍历所有模块,注册函数/方法签名,校验 import 合法性,填充 {@link ModuleInfo} 元信息。 * - * @param ctx 当前语义分析上下文 + * @param modules 需要分析的所有模块列表(AST 顶层节点) */ - public SignatureRegistrar { - } - - /** - * 遍历模块并注册函数签名,同时校验导入模块的合法性。 - * - * @param mods 所有模块的语法树节点集合 - */ - public void register(Iterable mods) { - for (ModuleNode mod : mods) { + public void register(Iterable modules) { + for (ModuleNode mod : modules) { + ctx.setCurrentModule(mod.name()); // 切换上下文到当前模块 ModuleInfo mi = ctx.modules().get(mod.name()); - // ---------- 1. 模块导入检查 ---------- + // ========== 1) 校验 imports ========== for (ImportNode imp : mod.imports()) { if (!ctx.modules().containsKey(imp.moduleName())) { - ctx.errors().add(new SemanticError( - imp, - "未知模块: " + imp.moduleName() - )); + // 导入的模块在全局表中不存在,报错 + ctx.errors().add(new SemanticError(imp, "未知模块: " + imp.moduleName())); } else { + // 添加到本模块导入集合 mi.getImports().add(imp.moduleName()); } } - // ---------- 2. 函数签名注册 ---------- - for (FunctionNode fn : mod.functions()) { - List params = new ArrayList<>(); + // ========== 2) 结构体签名登记 ========== + for (StructNode stn : mod.structs()) { + // 构造结构体类型对象,唯一标识为 (模块名, 结构体名) + StructType st = new StructType(mod.name(), stn.name()); + mi.getStructs().put(stn.name(), st); - // 参数类型解析 - for (ParameterNode p : fn.parameters()) { - Type t = Optional.ofNullable(ctx.parseType(p.type())) - .orElseGet(() -> { - ctx.errors().add(new SemanticError( - p, - "未知类型: " + p.type() - )); - return BuiltinType.INT; // 容错降级 - }); - params.add(t); + // --- 2.1 构造函数 init --- + if (stn.init() != null) { + List ptypes = new ArrayList<>(); + for (ParameterNode p : stn.init().parameters()) { + // 解析参数类型,不存在则报错降级为 int + Type t = ctx.parseType(p.type()); + if (t == null) { + ctx.errors().add(new SemanticError(p, "未知类型: " + p.type())); + t = BuiltinType.INT; + } + ptypes.add(t); + } + // 构造函数返回类型固定为 void + st.setConstructor(new FunctionType(ptypes, BuiltinType.VOID)); } - // 返回类型解析(默认降级为 void) + // --- 2.2 结构体方法签名 --- + for (FunctionNode fn : stn.methods()) { + List ptypes = new ArrayList<>(); + for (ParameterNode p : fn.parameters()) { + // 解析参数类型,不存在则报错降级为 int + Type t = ctx.parseType(p.type()); + if (t == null) { + ctx.errors().add(new SemanticError(p, "未知类型: " + p.type())); + t = BuiltinType.INT; + } + ptypes.add(t); + } + // 返回类型未指定时降级为 void + Type ret = Optional.ofNullable(ctx.parseType(fn.returnType())) + .orElse(BuiltinType.VOID); + st.getMethods().put(fn.name(), new FunctionType(ptypes, ret)); + } + } + + // ========== 3) 模块级函数签名登记 ========== + for (FunctionNode fn : mod.functions()) { + List params = new ArrayList<>(); + for (ParameterNode p : fn.parameters()) { + // 解析参数类型,不存在则报错降级为 int + Type t = ctx.parseType(p.type()); + if (t == null) { + ctx.errors().add(new SemanticError(p, "未知类型: " + p.type())); + t = BuiltinType.INT; + } + params.add(t); + } + // 返回类型未指定时降级为 void Type ret = Optional.ofNullable(ctx.parseType(fn.returnType())) .orElse(BuiltinType.VOID); - - // 注册函数签名 mi.getFunctions().put(fn.name(), new FunctionType(params, ret)); } }