From ba436cb91c59bdff742c6923c4a0e9cbe641a10c Mon Sep 17 00:00:00 2001 From: Luke Date: Mon, 1 Sep 2025 16:54:20 +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=20init=20=E6=9E=84=E9=80=A0?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改 StructParser 类,支持解析多个 init 构造函数 - 使用列表 inits 替代单个 init 函数节点 - 增加按参数个数去重的逻辑,避免重复定义 init构造函数 - 更新 StructNode 构造方法,接收 inits 列表作为参数 --- .../compiler/parser/struct/StructParser.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/jcnc/snow/compiler/parser/struct/StructParser.java b/src/main/java/org/jcnc/snow/compiler/parser/struct/StructParser.java index da74137..e57e2c9 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/struct/StructParser.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/struct/StructParser.java @@ -65,7 +65,7 @@ public class StructParser implements TopLevelParser { /* -------- 初始化容器 -------- */ List fields = new ArrayList<>(); - FunctionNode init = null; + List inits = new ArrayList<>(); List methods = new ArrayList<>(); DeclarationStatementParser declParser = new DeclarationStatementParser(); @@ -104,12 +104,17 @@ public class StructParser implements TopLevelParser { /* ---------- 构造函数 init ---------- */ case "init" -> { - if (init != null) { - throw new UnexpectedToken( - "重复定义 init 构造函数", - ts.peek().getLine(), ts.peek().getCol()); + FunctionNode ctor = parseInit(ctx, structName); + + // 按参数个数去重 + for (FunctionNode ex : inits) { + if (ex.parameters().size() == ctor.parameters().size()) { + throw new UnexpectedToken( + "重复定义 init 构造函数 (参数数量冲突)", + ts.peek().getLine(), ts.peek().getCol()); + } } - init = parseInit(ctx, structName); + inits.add(ctor); } /* ---------- 普通方法 function ---------- */ @@ -119,8 +124,8 @@ public class StructParser implements TopLevelParser { case "end" -> { ts.expect("end"); ts.expect("struct"); - // 返回完整结构体 AST 节点 - return new StructNode(structName, parentName, fields, init, methods, + return new StructNode(structName, parentName, + fields, inits, methods, new NodeContext(line, col, file)); }