From f03a44d2a5e0ad36b924fe78c67e8529e38d4488 Mon Sep 17 00:00:00 2001 From: Luke Date: Fri, 29 Aug 2025 17:58:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BD=93=E5=AE=9A=E4=B9=89=E7=9A=84=20AST=20=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 StructNode 类,表示结构体定义 - 包含结构体名称、字段列表、构造函数和方法列表等信息 - 实现了 toString 方法,便于调试和日志查看 --- .../snow/compiler/parser/ast/StructNode.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/main/java/org/jcnc/snow/compiler/parser/ast/StructNode.java diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/StructNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/StructNode.java new file mode 100644 index 0000000..8f2d27b --- /dev/null +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/StructNode.java @@ -0,0 +1,71 @@ +package org.jcnc.snow.compiler.parser.ast; + +import org.jcnc.snow.compiler.parser.ast.base.Node; +import org.jcnc.snow.compiler.parser.ast.base.NodeContext; + +import java.util.List; +import java.util.StringJoiner; + +/** + * {@code StructNode} + *

+ * AST 节点 —— 结构体定义(struct)。 + *

+ * + *

+ * 描述一个结构体类型,包括字段、可选构造函数、方法列表等。 + * 结构体可声明零个或多个字段,可选构造函数(init), + * 以及零个或多个方法。 + *

+ * + *

+ * 字段说明: + *

+ *

+ * + *

+ * 本类型为 Java record,不可变;构造参数即为字段名,自动生成 getter。 + *

+ * + * @param name 结构体名称 + * @param fields 字段声明列表 + * @param init 构造函数(可为 null) + * @param methods 方法列表 + * @param context 源码位置信息 + */ +public record StructNode( + String name, + List fields, + FunctionNode init, + List methods, + NodeContext context +) implements Node { + + /** + * 输出结构体节点的简明字符串表示,便于调试和日志查看。 + * + * @return 结构体节点的简要信息,包括名称、字段、构造函数、方法 + */ + @Override + public String toString() { + // 1) 构造字段声明的字符串(类型+名称) + StringJoiner fj = new StringJoiner(", "); + fields.forEach(d -> fj.add(d.getType() + " " + d.getName())); + + // 2) 构造方法名列表字符串 + StringJoiner mj = new StringJoiner(", "); + methods.forEach(f -> mj.add(f.name())); + + // 3) 合成最终输出 + return "Struct(name=" + name + + ", fields=[" + fj + "], init=" + + (init == null ? "null" : init.name()) + + ", methods=[" + mj + "])"; + } +}