diff --git a/src/main/java/org/jcnc/snow/compiler/JsonFormatter.java b/src/main/java/org/jcnc/snow/compiler/JsonFormatter.java index 0337f5d..4ae2e3c 100644 --- a/src/main/java/org/jcnc/snow/compiler/JsonFormatter.java +++ b/src/main/java/org/jcnc/snow/compiler/JsonFormatter.java @@ -52,8 +52,6 @@ public class JsonFormatter { } private static void appendIndent(StringBuilder sb, int indent) { - for (int i = 0; i < indent; i++) { - sb.append(" "); // 两个空格 - } + sb.append(" ".repeat(Math.max(0, indent))); // 两个空格 } } diff --git a/src/main/java/org/jcnc/snow/compiler/Main.java b/src/main/java/org/jcnc/snow/compiler/Main.java index 925de97..bb6f19b 100644 --- a/src/main/java/org/jcnc/snow/compiler/Main.java +++ b/src/main/java/org/jcnc/snow/compiler/Main.java @@ -4,7 +4,6 @@ import org.jcnc.snow.compiler.lexer.LexerEngine; import org.jcnc.snow.compiler.lexer.token.Token; import org.jcnc.snow.compiler.lexer.utils.TokenPrinter; import org.jcnc.snow.compiler.parser.ParserEngine; -import org.jcnc.snow.compiler.parser.ast.ASTJsonSerializer; import org.jcnc.snow.compiler.parser.context.ParserContext; import org.jcnc.snow.compiler.parser.ast.Node; import org.jcnc.snow.compiler.parser.ast.ASTPrinter; @@ -33,14 +32,14 @@ public class Main { // 3. 可读地打印 AST ASTPrinter.print(ast); - // 1) 输出紧凑 JSON - String compact = ASTJsonSerializer.toJsonString(ast); - System.out.println("=== Compact JSON ==="); - System.out.println(compact); - - // 2) 输出美化后的 JSON - System.out.println("=== Pretty JSON ==="); - System.out.println(JsonFormatter.prettyPrint(compact)); +// // 1) 输出紧凑 JSON +// String compact = ASTJsonSerializer.toJsonString(ast); +// System.out.println("=== Compact JSON ==="); +// System.out.println(compact); +// +// // 2) 输出美化后的 JSON +// System.out.println("=== Pretty JSON ==="); +// System.out.println(JsonFormatter.prettyPrint(compact)); } } \ No newline at end of file diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTJsonSerializer.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTJsonSerializer.java index 48a8296..65920f5 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTJsonSerializer.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTJsonSerializer.java @@ -32,21 +32,21 @@ public class ASTJsonSerializer { private static String moduleToJson(ModuleNode m) { StringBuilder sb = new StringBuilder(); sb.append("{\"type\":\"Module\",") - .append("\"name\":").append(quote(m.getName())).append(","); + .append("\"name\":").append(quote(m.name())).append(","); // imports sb.append("\"imports\":["); - for (int i = 0; i < m.getImports().size(); i++) { - ImportNode imp = m.getImports().get(i); + for (int i = 0; i < m.imports().size(); i++) { + ImportNode imp = m.imports().get(i); sb.append("{\"type\":\"Import\",\"module\":") .append(quote(imp.moduleName())).append("}"); - if (i + 1 < m.getImports().size()) sb.append(","); + if (i + 1 < m.imports().size()) sb.append(","); } sb.append("],"); // functions sb.append("\"functions\":["); - for (int i = 0; i < m.getFunctions().size(); i++) { - sb.append(functionToJson(m.getFunctions().get(i))); - if (i + 1 < m.getFunctions().size()) sb.append(","); + for (int i = 0; i < m.functions().size(); i++) { + sb.append(functionToJson(m.functions().get(i))); + if (i + 1 < m.functions().size()) sb.append(","); } sb.append("]}"); return sb.toString(); @@ -156,9 +156,9 @@ public class ASTJsonSerializer { private static String binaryToJson(BinaryExpressionNode b) { return "{\"type\":\"BinaryExpression\"," - + "\"left\":" + exprToJson(b.getLeft()) + "," - + "\"operator\":" + quote(b.getOperator()) + "," - + "\"right\":" + exprToJson(b.getRight()) + + "\"left\":" + exprToJson(b.left()) + "," + + "\"operator\":" + quote(b.operator()) + "," + + "\"right\":" + exprToJson(b.right()) + "}"; } private static String idToJson(IdentifierNode id) { diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTPrinter.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTPrinter.java index f805b78..8ca04d1 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTPrinter.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTPrinter.java @@ -15,60 +15,60 @@ public class ASTPrinter { private static void print(Node n, int indent) { String pad = " ".repeat(indent); - if (n instanceof ModuleNode m) { - System.out.println(pad + "module " + m.getName()); - for (ImportNode imp : m.getImports()) { - System.out.println(pad + " import " + imp.moduleName()); + switch (n) { + case ModuleNode m -> { + System.out.println(pad + "module " + m.name()); + for (ImportNode imp : m.imports()) { + System.out.println(pad + " import " + imp.moduleName()); + } + for (FunctionNode fn : m.functions()) { + print(fn, indent + 1); + } } - for (FunctionNode fn : m.getFunctions()) { - print(fn, indent + 1); + case FunctionNode( + String name, List parameters, String returnType, List body + ) -> { + System.out.println(pad + "function " + name + + "(params=" + parameters + ", return=" + returnType + ")"); + for (StatementNode stmt : body) { + print(stmt, indent + 1); + } } - - } else if (n instanceof FunctionNode f) { - System.out.println(pad + "function " + f.name() - + "(params=" + f.parameters() + ", return=" + f.returnType() + ")"); - for (StatementNode stmt : f.body()) { - print(stmt, indent + 1); + case DeclarationNode d -> { + String init = d.getInitializer() + .map(Object::toString) + .map(s -> " = " + s) + .orElse(""); + System.out.println(pad + "declare " + d.getName() + ":" + d.getType() + init); } - - } else if (n instanceof DeclarationNode d) { - String init = d.getInitializer() - .map(Object::toString) - .map(s -> " = " + s) - .orElse(""); - System.out.println(pad + "declare " + d.getName() + ":" + d.getType() + init); - - } else if (n instanceof AssignmentNode a) { - System.out.println(pad + a.variable() + " = " + a.value()); - - } else if (n instanceof IfNode i) { - System.out.println(pad + "if " + i.condition()); - for (StatementNode stmt : i.thenBranch()) { - print(stmt, indent + 1); + case AssignmentNode(String variable, ExpressionNode value) -> + System.out.println(pad + variable + " = " + value); + case IfNode(ExpressionNode condition, List thenBranch) -> { + System.out.println(pad + "if " + condition); + for (StatementNode stmt : thenBranch) { + print(stmt, indent + 1); + } } - - } else if (n instanceof LoopNode l) { - System.out.println(pad + "loop {"); - print(l.initializer(), indent + 1); - System.out.println(pad + " condition: " + l.condition()); - System.out.println(pad + " update: " + l.update()); - System.out.println(pad + " body {"); - for (StatementNode stmt : l.body()) { - print(stmt, indent + 2); + case LoopNode( + StatementNode initializer, ExpressionNode condition, StatementNode update, List body + ) -> { + System.out.println(pad + "loop {"); + print(initializer, indent + 1); + System.out.println(pad + " condition: " + condition); + System.out.println(pad + " update: " + update); + System.out.println(pad + " body {"); + for (StatementNode stmt : body) { + print(stmt, indent + 2); + } + System.out.println(pad + " }"); + System.out.println(pad + "}"); } - System.out.println(pad + " }"); - System.out.println(pad + "}"); - - } else if (n instanceof ReturnNode r) { - System.out.println(pad + "return" + + case ReturnNode r -> System.out.println(pad + "return" + r.getExpression().map(e -> " " + e).orElse("")); - - } else if (n instanceof ExpressionStatementNode es) { - System.out.println(pad + es.expression()); - - } else { - // 回退:直接调用 toString() - System.out.println(pad + n); + case ExpressionStatementNode(ExpressionNode expression) -> System.out.println(pad + expression); + case null, default -> + // 回退:直接调用 toString() + System.out.println(pad + n); } } } diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/BinaryExpressionNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/BinaryExpressionNode.java index 9c73e95..bba717e 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/BinaryExpressionNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/BinaryExpressionNode.java @@ -3,20 +3,8 @@ package org.jcnc.snow.compiler.parser.ast; /** * 二元运算表达式节点,如 a + b。 */ -public class BinaryExpressionNode implements ExpressionNode { - private final ExpressionNode left; - private final String operator; - private final ExpressionNode right; - - public BinaryExpressionNode(ExpressionNode left, String operator, ExpressionNode right) { - this.left = left; - this.operator = operator; - this.right = right; - } - - public ExpressionNode getLeft() { return left; } - public String getOperator() { return operator; } - public ExpressionNode getRight() { return right; } +public record BinaryExpressionNode(ExpressionNode left, String operator, + ExpressionNode right) implements ExpressionNode { @Override public String toString() { diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/ModuleNode.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/ModuleNode.java index 7308d0e..8bfa9e2 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/ModuleNode.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/ModuleNode.java @@ -7,28 +7,7 @@ import java.util.StringJoiner; /** * 模块定义节点:包含模块名、import 列表和函数列表。 */ -public class ModuleNode implements Node { - private final String name; - private final List imports; - private final List functions; - - public ModuleNode(String name, List imports, List functions) { - this.name = name; - this.imports = imports; - this.functions = functions; - } - - public String getName() { - return name; - } - - public List getImports() { - return imports; - } - - public List getFunctions() { - return functions; - } +public record ModuleNode(String name, List imports, List functions) implements Node { /** * 返回模块的字符串表示,便于调试和打印。