From 6dc651d305943ebf2f2bce6c88f7475d98742673 Mon Sep 17 00:00:00 2001 From: Luke Date: Mon, 1 Sep 2025 16:51:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BD=93=E5=A4=9A=E4=B8=AA=E6=9E=84=E9=80=A0=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改 SignatureRegistrar 类以支持结构体的多个构造函数 - 通过参数个数区分重载的构造函数 - 为每个构造函数解析参数类型并设置返回类型为 void --- .../semantic/core/SignatureRegistrar.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 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 b6b0c6a..0daf609 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 @@ -54,20 +54,22 @@ public record SignatureRegistrar(Context ctx) { StructType st = new StructType(mod.name(), stn.name()); mi.getStructs().put(stn.name(), st); - // --- 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; + // --- 2.1 多个构造函数 init(重载,按参数个数区分) --- + if (stn.inits() != null) { + for (FunctionNode initFn : stn.inits()) { + List ptypes = new ArrayList<>(); + for (ParameterNode p : initFn.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); } - ptypes.add(t); + // 构造函数返回类型固定为 void + st.addConstructor(new FunctionType(ptypes, BuiltinType.VOID)); } - // 构造函数返回类型固定为 void - st.setConstructor(new FunctionType(ptypes, BuiltinType.VOID)); } // --- 2.2 结构体方法签名 ---