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