diff --git a/src/main/java/printer/ExpressionPrinter.java b/src/main/java/printer/ExpressionPrinter.java new file mode 100644 index 0000000..4c0f649 --- /dev/null +++ b/src/main/java/printer/ExpressionPrinter.java @@ -0,0 +1,32 @@ +package printer; + +import expression.*; +import interpreter.Visitor; + +public class ExpressionPrinter extends Visitor { + private final String value; + + public ExpressionPrinter(Expression expression) { + value = visit(expression); + } + + public String visitAddition(Addition addition) { + return "(" + visit(addition.leftHandSide) + " + " + visit(addition.rightHandSide) + ")"; + } + + public String visitIdentifier(Identifier identifier) { + return identifier.name; + } + + public String visitInt(Int integer) { + return Integer.toString(integer.value); + } + + public String visitSubtraction(Subtraction subtraction) { + return "(" + visit(subtraction.leftHandSide) + " - " + visit(subtraction.rightHandSide) + ")"; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/printer/ProgramPrinter.java b/src/main/java/printer/ProgramPrinter.java new file mode 100644 index 0000000..32bf00b --- /dev/null +++ b/src/main/java/printer/ProgramPrinter.java @@ -0,0 +1,36 @@ +package printer; + +import interpreter.Visitor; +import program.*; + +public class ProgramPrinter extends Visitor { + private final String value; + + public ProgramPrinter(Program program) { + value = visit(program); + } + + public String visitAssignment(Assignment assignment) { + ExpressionPrinter identifierPrinter = new ExpressionPrinter(assignment.identifier); + ExpressionPrinter expressionPrinter = new ExpressionPrinter(assignment.expression); + return identifierPrinter.getValue() + " := " + expressionPrinter.getValue(); + } + + public String visitComposition(Composition composition) { + return visit(composition.first) + " ; " + visit(composition.second); + } + + public String visitConditional(Conditional conditional) { + ExpressionPrinter conditionPrinter = new ExpressionPrinter(conditional.condition); + return "if (" + conditionPrinter.getValue() + ") then { " + visit(conditional.thenCase) + " } else { " + visit(conditional.elseCase) + " }"; + } + + public String visitLoop(Loop loop) { + ExpressionPrinter conditionPrinter = new ExpressionPrinter(loop.condition); + return "while (" + conditionPrinter.getValue() + ") { " + visit(loop.program) + " }"; + } + + public String getValue() { + return value; + } +}