diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ASTPrinter.java b/src/main/java/org/jcnc/snow/compiler/parser/ASTPrinter.java index 03a4d97..7ae4070 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ASTPrinter.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ASTPrinter.java @@ -30,53 +30,59 @@ public class ASTPrinter { private static void printStatement(ASTStatement stmt, int level) { String indent = INDENT.repeat(level); - if (stmt instanceof ASTReturn) { - System.out.print(indent + "Return: "); - printExpression(((ASTReturn) stmt).getExpression()); - System.out.println(); - } else if (stmt instanceof ASTDeclare) { - ASTDeclare d = (ASTDeclare) stmt; - System.out.print(indent + "Declare " + d.getName() + ": " + d.getType()); - if (d.getInitExpression() != null) { - System.out.print(" = "); printExpression(d.getInitExpression()); + switch (stmt) { + case ASTReturn astReturn -> { + System.out.print(indent + "Return: "); + printExpression(astReturn.getExpression()); + System.out.println(); } - System.out.println(); - } else if (stmt instanceof ASTLoop) { - ASTLoop loop = (ASTLoop) stmt; - System.out.println(indent + "Loop:"); - System.out.print(indent + " Init: "); printStatement(loop.getInit(), 0); - System.out.print(indent + " Condition: "); printExpression(loop.getCondition()); System.out.println(); - System.out.print(indent + " Update: "); printStatement(loop.getUpdate(), 0); - System.out.println(indent + " Body:"); - for (ASTStatement s : loop.getBody()) { - printStatement(s, level + 2); + case ASTDeclare d -> { + System.out.print(indent + "Declare " + d.getName() + ": " + d.getType()); + if (d.getInitExpression() != null) { + System.out.print(" = "); + printExpression(d.getInitExpression()); + } + System.out.println(); } - } else if (stmt instanceof ASTIf) { - ASTIf ifs = (ASTIf) stmt; - System.out.print(indent + "If condition: "); printExpression(ifs.getCondition()); System.out.println(); - System.out.println(indent + " Then:"); - for (ASTStatement s : ifs.getThenStatements()) { - printStatement(s, level + 2); + case ASTLoop loop -> { + System.out.println(indent + "Loop:"); + System.out.print(indent + " Init: "); + printStatement(loop.getInit(), 0); + System.out.print(indent + " Condition: "); + printExpression(loop.getCondition()); + System.out.println(); + System.out.print(indent + " Update: "); + printStatement(loop.getUpdate(), 0); + System.out.println(indent + " Body:"); + for (ASTStatement s : loop.getBody()) { + printStatement(s, level + 2); + } } - } else { - System.out.println(indent + stmt.getClass().getSimpleName()); + case ASTIf ifs -> { + System.out.print(indent + "If condition: "); + printExpression(ifs.getCondition()); + System.out.println(); + System.out.println(indent + " Then:"); + for (ASTStatement s : ifs.getThenStatements()) { + printStatement(s, level + 2); + } + } + default -> System.out.println(indent + stmt.getClass().getSimpleName()); } } private static void printExpression(ASTExpression expr) { - if (expr instanceof ASTLiteral) { - System.out.print(((ASTLiteral) expr).getValue()); - } else if (expr instanceof ASTIdentifier) { - System.out.print(((ASTIdentifier) expr).getName()); - } else if (expr instanceof ASTBinaryOp) { - ASTBinaryOp bin = (ASTBinaryOp) expr; - System.out.print("("); - printExpression(bin.getLeft()); - System.out.print(" " + bin.getOperator() + " "); - printExpression(bin.getRight()); - System.out.print(")"); - } else { - System.out.print(expr.getClass().getSimpleName()); + switch (expr) { + case ASTLiteral astLiteral -> System.out.print(astLiteral.getValue()); + case ASTIdentifier astIdentifier -> System.out.print(astIdentifier.getName()); + case ASTBinaryOp bin -> { + System.out.print("("); + printExpression(bin.getLeft()); + System.out.print(" " + bin.getOperator() + " "); + printExpression(bin.getRight()); + System.out.print(")"); + } + default -> System.out.print(expr.getClass().getSimpleName()); } } } diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ASTStatement.java b/src/main/java/org/jcnc/snow/compiler/parser/ASTStatement.java new file mode 100644 index 0000000..e59848f --- /dev/null +++ b/src/main/java/org/jcnc/snow/compiler/parser/ASTStatement.java @@ -0,0 +1,5 @@ +package org.jcnc.snow.compiler.parser; + +import org.jcnc.snow.compiler.parser.ast.ASTNode; + +public abstract class ASTStatement extends ASTNode {} diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTDeclare.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTDeclare.java index 0134660..9e39ada 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTDeclare.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTDeclare.java @@ -1,6 +1,7 @@ package org.jcnc.snow.compiler.parser.ast; import org.jcnc.snow.compiler.parser.ASTExpression; +import org.jcnc.snow.compiler.parser.ASTStatement; public class ASTDeclare extends ASTStatement { final String name, type; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTFunction.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTFunction.java index 1ba07c5..a0887e2 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTFunction.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTFunction.java @@ -1,5 +1,7 @@ package org.jcnc.snow.compiler.parser.ast; +import org.jcnc.snow.compiler.parser.ASTStatement; + import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTIf.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTIf.java index 68e6a88..2991a70 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTIf.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTIf.java @@ -1,6 +1,7 @@ package org.jcnc.snow.compiler.parser.ast; import org.jcnc.snow.compiler.parser.ASTExpression; +import org.jcnc.snow.compiler.parser.ASTStatement; import java.util.List; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTLoop.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTLoop.java index 1a73edf..c51953b 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTLoop.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTLoop.java @@ -1,6 +1,7 @@ package org.jcnc.snow.compiler.parser.ast; import org.jcnc.snow.compiler.parser.ASTExpression; +import org.jcnc.snow.compiler.parser.ASTStatement; import java.util.List; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTReturn.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTReturn.java index 0df553f..17a01b2 100644 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTReturn.java +++ b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTReturn.java @@ -1,6 +1,7 @@ package org.jcnc.snow.compiler.parser.ast; import org.jcnc.snow.compiler.parser.ASTExpression; +import org.jcnc.snow.compiler.parser.ASTStatement; public class ASTReturn extends ASTStatement { final ASTExpression expr; diff --git a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTStatement.java b/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTStatement.java deleted file mode 100644 index dcb21cc..0000000 --- a/src/main/java/org/jcnc/snow/compiler/parser/ast/ASTStatement.java +++ /dev/null @@ -1,3 +0,0 @@ -package org.jcnc.snow.compiler.parser.ast; - -public abstract class ASTStatement extends ASTNode {}