From 426452f63f905438dfd884b2b5fa52b22d496d5b Mon Sep 17 00:00:00 2001 From: Luke Date: Mon, 1 Sep 2025 09:22:48 +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=8D=95=E7=BB=A7=E6=89=BF=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=AD=BE=E5=90=8D=E6=B3=A8=E5=86=8C=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增加结构体单继承支持,子类可继承父类的字段和方法 - 优化函数和方法签名注册流程,移除不必要的降级处理 - 修复结构体继承中的错误处理和字段/方法复制逻辑 --- .../semantic/core/SignatureRegistrar.java | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 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 5040493..b6b0c6a 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 @@ -14,19 +14,21 @@ import java.util.Optional; /** * {@code SignatureRegistrar} *

- * 语义分析准备阶段:负责函数签名登记与 import 模块存在性校验。 + * 语义分析准备阶段:负责函数签名登记、结构体签名登记与 import 校验。 + * *

+ *

* 作为语义分析前置流程,为后续函数体和表达式分析提供类型环境。 - *

*/ public record SignatureRegistrar(Context ctx) { /** - * 遍历所有模块,注册函数/方法签名,校验 import 合法性,填充 {@link ModuleInfo} 元信息。 + * 遍历所有模块,注册函数/方法/结构体签名,校验 import 合法性。 * * @param modules 需要分析的所有模块列表(AST 顶层节点) */ @@ -72,7 +74,6 @@ public record SignatureRegistrar(Context ctx) { 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())); @@ -80,18 +81,38 @@ public record SignatureRegistrar(Context ctx) { } ptypes.add(t); } - // 返回类型未指定时降级为 void Type ret = Optional.ofNullable(ctx.parseType(fn.returnType())) .orElse(BuiltinType.VOID); st.getMethods().put(fn.name(), new FunctionType(ptypes, ret)); } } + // ========== 2.3 继承处理 ========== + for (StructNode stn : mod.structs()) { + if (stn.parent() != null) { + StructType child = mi.getStructs().get(stn.name()); + StructType parent = mi.getStructs().get(stn.parent()); + + if (parent == null) { + // 父类不存在,报语义错误 + ctx.errors().add(new SemanticError(stn, + "未知父类: " + stn.parent())); + } else { + // 将父类字段拷贝到子类(若子类未定义同名字段) + parent.getFields().forEach( + (k, v) -> child.getFields().putIfAbsent(k, v)); + // 将父类方法拷贝到子类(若子类未覆盖) + parent.getMethods().forEach( + (k, v) -> child.getMethods().putIfAbsent(k, v)); + // 构造函数不继承,由子类自行声明 + } + } + } + // ========== 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())); @@ -99,7 +120,6 @@ public record SignatureRegistrar(Context ctx) { } params.add(t); } - // 返回类型未指定时降级为 void Type ret = Optional.ofNullable(ctx.parseType(fn.returnType())) .orElse(BuiltinType.VOID); mi.getFunctions().put(fn.name(), new FunctionType(params, ret));