From 808403e8e820041aa6c3c2d95938eb50e9ac6125 Mon Sep 17 00:00:00 2001 From: Luke Date: Mon, 1 Sep 2025 15:47:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E7=B1=BB=E7=BB=A7?= =?UTF-8?q?=E6=89=BF=E5=92=8C=E5=A4=9A=E6=9E=84=E9=80=A0=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E7=9A=84=E5=BA=8F=E5=88=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 StructNode 中添加 parent 属性,用于表示父类- 支持多构造函数的序列化,将 inits 参数替换单个 init 参数 - 优化 methods 参数的序列化逻辑,增加空值检查 - 重构部分代码,提高可读性和维护性 --- .../parser/utils/ASTJsonSerializer.java | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/jcnc/snow/compiler/parser/utils/ASTJsonSerializer.java b/src/main/java/org/jcnc/snow/compiler/parser/utils/ASTJsonSerializer.java index 80618ce..3fc8631 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/utils/ASTJsonSerializer.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/utils/ASTJsonSerializer.java @@ -5,7 +5,10 @@ import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode; import org.jcnc.snow.compiler.parser.ast.base.Node; import org.jcnc.snow.compiler.parser.ast.base.NodeContext; -import java.util.*; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; /** * {@code ASTJsonSerializer} 是抽象语法树(AST)序列化工具类。 @@ -83,7 +86,8 @@ public class ASTJsonSerializer { return switch (n) { // 模块节点 case ModuleNode( - String name, List imports, List globals,List structs, List functions, NodeContext _ + String name, List imports, List globals, List structs, + List functions, NodeContext _ ) -> { Map map = newNodeMap("Module"); map.put("name", name); @@ -105,22 +109,21 @@ public class ASTJsonSerializer { for (FunctionNode f : functions) { funcs.add(nodeToMap(f)); } - List lStructs = new ArrayList<>(); structs.forEach(s -> lStructs.add(nodeToMap(s))); map.put("structs", lStructs); - map.put("functions", funcs); yield map; } - // Struct 节点 + // Struct 节点(多构造支持) case StructNode( - String name, List fields, - FunctionNode init, List methods, NodeContext _ + String name, String parent, List fields, List inits, + List methods, NodeContext _ ) -> { Map map = newNodeMap("Struct"); map.put("name", name); + map.put("parent", parent); List lFields = new ArrayList<>(); fields.forEach(d -> lFields.add(Map.of( @@ -129,10 +132,19 @@ public class ASTJsonSerializer { "varType", d.getType()))); map.put("fields", lFields); - map.put("init", init == null ? null : nodeToMap(init)); + // 多构造函数序列化为 inits 数组 + List lInits = new ArrayList<>(); + if (inits != null) { + for (FunctionNode ctor : inits) { + lInits.add(nodeToMap(ctor)); + } + } + map.put("inits", lInits); List lMethods = new ArrayList<>(); - methods.forEach(f -> lMethods.add(nodeToMap(f))); + if (methods != null) { + for (FunctionNode f : methods) lMethods.add(nodeToMap(f)); + } map.put("methods", lMethods); yield map; } @@ -219,13 +231,12 @@ public class ASTJsonSerializer { private static Object exprToMap(ExpressionNode expr) { return switch (expr) { // 二元表达式 - case BinaryExpressionNode( - ExpressionNode left, String operator, ExpressionNode right, NodeContext _ - ) -> exprMap("BinaryExpression", - "left", exprToMap(left), - "operator", operator, - "right", exprToMap(right) - ); + case BinaryExpressionNode(ExpressionNode left, String operator, ExpressionNode right, NodeContext _) -> + exprMap("BinaryExpression", + "left", exprToMap(left), + "operator", operator, + "right", exprToMap(right) + ); // 一元表达式 case UnaryExpressionNode(String operator, ExpressionNode operand, NodeContext _) -> exprMap("UnaryExpression",