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),
+ * 以及零个或多个方法。
+ *
+ *
+ *
+ * 字段说明:
+ *
+ * - {@code name} —— 结构体名称,类型定义的唯一标识。
+ * - {@code fields} —— 字段声明列表,每个字段为 {@link DeclarationNode}。
+ * - {@code init} —— 构造函数(FunctionNode),可为 null。
+ * - {@code methods} —— 方法列表,每个为 {@link FunctionNode},可空列表。
+ * - {@code context} —— 源代码位置信息(行号、文件名等)。
+ *
+ *
+ *
+ *
+ * 本类型为 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 + "])";
+ }
+}