优化打印逻辑

This commit is contained in:
Luke 2025-04-27 14:10:59 +08:00
parent 210a6942f4
commit d3494091a0
3 changed files with 21 additions and 11 deletions

View File

@ -7,8 +7,6 @@ import org.jcnc.snow.compiler.parser.ParserEngine;
import org.jcnc.snow.compiler.parser.context.ParserContext; import org.jcnc.snow.compiler.parser.context.ParserContext;
import org.jcnc.snow.compiler.parser.ast.base.Node; import org.jcnc.snow.compiler.parser.ast.base.Node;
import org.jcnc.snow.compiler.parser.function.ASTPrinter; import org.jcnc.snow.compiler.parser.function.ASTPrinter;
import org.jcnc.snow.compiler.parser.util.ASTJsonSerializer;
import org.jcnc.snow.compiler.parser.util.JsonFormatter;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -25,18 +23,17 @@ public class Main {
// 1. 词法分析 // 1. 词法分析
LexerEngine lexerEngine = new LexerEngine(source); LexerEngine lexerEngine = new LexerEngine(source);
List<Token> tokens = lexerEngine.getAllTokens(); List<Token> tokens = lexerEngine.getAllTokens();
TokenPrinter.printTokens(tokens); // 可选打印 Token 列表
// 2. 语法分析 // 2. 语法分析
ParserContext ctx = new ParserContext(tokens); ParserContext ctx = new ParserContext(tokens);
List<Node> ast = new ParserEngine(ctx).parse(); List<Node> ast = new ParserEngine(ctx).parse();
// 3. 可读地打印 AST
ASTPrinter.print(ast);
// 4. AST JSON
System.out.println("=== Pretty JSON ==="); // 打印
System.out.println(JsonFormatter.prettyPrint(ASTJsonSerializer.toJsonString(ast))); TokenPrinter.print(tokens); // 打印 Token 列表
ASTPrinter.print(ast); // 打印 AST
// ASTPrinter.printJson(ast); // 打印JSON AST
} }
} }

View File

@ -32,7 +32,7 @@ public class TokenPrinter {
* @param tokens 要打印的 Token 列表不应为 null列表中的每个元素 * @param tokens 要打印的 Token 列表不应为 null列表中的每个元素
* 都应包含有效的行号列号类型和词素信息 * 都应包含有效的行号列号类型和词素信息
*/ */
public static void printTokens(List<Token> tokens) { public static void print(List<Token> tokens) {
// 打印表头列名对齐宽度分别为 6616 // 打印表头列名对齐宽度分别为 6616
System.out.printf("%-6s %-6s %-16s %s%n", "line", "col", "type", "lexeme"); System.out.printf("%-6s %-6s %-16s %s%n", "line", "col", "type", "lexeme");
System.out.println("----------------------------------------------------"); System.out.println("----------------------------------------------------");

View File

@ -4,12 +4,14 @@ import org.jcnc.snow.compiler.parser.ast.*;
import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode; 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.Node;
import org.jcnc.snow.compiler.parser.ast.base.StatementNode; import org.jcnc.snow.compiler.parser.ast.base.StatementNode;
import org.jcnc.snow.compiler.parser.util.ASTJsonSerializer;
import org.jcnc.snow.compiler.parser.util.JsonFormatter;
import java.util.List; import java.util.List;
/** /**
* AST 打印器用于将抽象语法树AST中的节点打印为可读的格式化的多行文本 * AST 打印器用于将抽象语法树AST中的节点打印为可读的格式化的多行文本
* 每个节点根据其类型和结构打印相应的缩进层级便于人类阅读和调试 * 以及将 AST 序列化为 JSON 并美化输出
*/ */
public class ASTPrinter { public class ASTPrinter {
@ -31,7 +33,7 @@ public class ASTPrinter {
* @param indent 当前的缩进层级每层两个空格 * @param indent 当前的缩进层级每层两个空格
*/ */
private static void print(Node n, int indent) { private static void print(Node n, int indent) {
String pad = " ".repeat(indent); // 缩进字符串 String pad = " ".repeat(indent);
switch (n) { switch (n) {
case ModuleNode m -> { case ModuleNode m -> {
@ -97,4 +99,15 @@ public class ASTPrinter {
System.out.println(pad + n); System.out.println(pad + n);
} }
} }
/**
* 序列化整个 AST JSON并输出美化后的字符串
*
* @param nodes 要序列化的 AST 节点列表
*/
public static void printJson(List<Node> nodes) {
String rawJson = ASTJsonSerializer.toJsonString(nodes);
String pretty = JsonFormatter.prettyPrint(rawJson);
System.out.println(pretty);
}
} }