This commit is contained in:
Luke 2025-04-23 09:29:16 +08:00
parent 157f1e2f11
commit cd402653cb
6 changed files with 70 additions and 106 deletions

View File

@ -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))); // 两个空格
}
}

View File

@ -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));
}
}

View File

@ -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) {

View File

@ -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<ParameterNode> parameters, String returnType, List<StatementNode> 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<StatementNode> 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<StatementNode> 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);
}
}
}

View File

@ -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() {

View File

@ -7,28 +7,7 @@ import java.util.StringJoiner;
/**
* 模块定义节点包含模块名import 列表和函数列表
*/
public class ModuleNode implements Node {
private final String name;
private final List<ImportNode> imports;
private final List<FunctionNode> functions;
public ModuleNode(String name, List<ImportNode> imports, List<FunctionNode> functions) {
this.name = name;
this.imports = imports;
this.functions = functions;
}
public String getName() {
return name;
}
public List<ImportNode> getImports() {
return imports;
}
public List<FunctionNode> getFunctions() {
return functions;
}
public record ModuleNode(String name, List<ImportNode> imports, List<FunctionNode> functions) implements Node {
/**
* 返回模块的字符串表示便于调试和打印