From 9fa61ed1a4a6c8fa8e08c30a748a612d2d24838c Mon Sep 17 00:00:00 2001 From: nitrix Date: Mon, 11 Nov 2019 15:50:25 +0100 Subject: [PATCH] implement pretty print visitor --- .../Klang/visitors/PrettyPrintVisitor.java | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java diff --git a/src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java b/src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java new file mode 100644 index 0000000..d5f361d --- /dev/null +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java @@ -0,0 +1,134 @@ +package de.hsrm.compiler.Klang.visitors; + +import java.io.*; +import de.hsrm.compiler.Klang.nodes.Block; +import de.hsrm.compiler.Klang.nodes.expressions.AdditiveExpression; +import de.hsrm.compiler.Klang.nodes.expressions.IntegerExpression; +import de.hsrm.compiler.Klang.nodes.expressions.ModuloExpression; +import de.hsrm.compiler.Klang.nodes.expressions.MultiplicativeExpression; +import de.hsrm.compiler.Klang.nodes.expressions.NegateExpression; +import de.hsrm.compiler.Klang.nodes.statements.IfStatement; +import de.hsrm.compiler.Klang.nodes.statements.PrintStatement; +import de.hsrm.compiler.Klang.nodes.statements.Statement;; + +public class PrettyPrintVisitor implements Visitor { + + public static class ExWriter { + Writer w; + String indent = ""; + + void addIndent() { + indent = indent + " "; + } + + void subIndent() { + indent = indent.substring(2); + } + + void nl() { + write("\n" + indent); + } + + int lbl = 0; + + int next() { + return lbl++; + } + + public ExWriter(Writer w) { + this.w = w; + } + + void lnwrite(Object o) { + nl(); + write(o); + } + + void write(Object o) { + try { + w.write(o + ""); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + public ExWriter ex; + + public PrettyPrintVisitor(ExWriter ex) { + this.ex = ex; + } + + @Override + public Void visit(IntegerExpression e) { + ex.write(e.value); + return null; + } + + @Override + public Void visit(MultiplicativeExpression e) { + e.lhs.welcome(this); + ex.write(" * "); + e.rhs.welcome(this); + return null; + } + + @Override + public Void visit(AdditiveExpression e) { + e.lhs.welcome(this); + ex.write(" + "); + e.rhs.welcome(this); + return null; + } + + @Override + public Void visit(NegateExpression e) { + ex.write(" - "); + e.lhs.welcome(this); + return null; + } + + @Override + public Void visit(ModuloExpression e) { + e.lhs.welcome(this); + ex.write(" % "); + e.rhs.welcome(this); + return null; + } + + @Override + public Void visit(IfStatement e) { + ex.write("if ("); + e.cond.welcome(this); + ex.write(") "); + e.then.welcome(this); + if (e.alt != null) { + ex.write(" else "); + e.alt.welcome(this); + } + return null; + } + + @Override + public Void visit(PrintStatement e) { + ex.write("print "); + e.expression.welcome(this); + ex.write(";"); + return null; + } + + @Override + public Void visit(Block e) { + ex.write("{"); + ex.addIndent(); + for (Statement stmt : e.statements) { + ex.nl(); + stmt.welcome(this); + } + ex.subIndent(); + ex.nl(); + ex.write("}"); + return null; + } + +} \ No newline at end of file