From f341401cccd76ff63a8ee7e0833e866c96ace634 Mon Sep 17 00:00:00 2001 From: Marvin Kaiser Date: Fri, 20 Dec 2019 08:42:20 +0100 Subject: [PATCH] Implemented pretty printing and evaluating of boolean expressions --- .../hsrm/compiler/Klang/ContextAnalysis.java | 25 +++++++++ .../compiler/Klang/visitors/EvalVisitor.java | 50 ++++++++++++++++++ .../Klang/visitors/PrettyPrintVisitor.java | 51 ++++++++++++++++++- .../hsrm/compiler/Klang/visitors/Visitor.java | 5 ++ 4 files changed, 130 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java b/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java index e17066d..2ee65fa 100644 --- a/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java +++ b/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java @@ -97,6 +97,31 @@ public class ContextAnalysis extends KlangBaseVisitor { return new AdditionExpression((Expression) this.visit(ctx.lhs), (Expression) this.visit(ctx.rhs)); } + @Override + public Node visitEqualityExpression(KlangParser.EqualityExpressionContext ctx) { + return new EqualityExpression((Expression) this.visit(ctx.lhs), (Expression) this.visit(ctx.rhs)); + } + + @Override + public Node visitLessThanExpression(KlangParser.LessThanExpressionContext ctx) { + return new LTExpression((Expression) this.visit(ctx.lhs), (Expression) this.visit(ctx.rhs)); + } + + @Override + public Node visitGreaterThanExpression(KlangParser.GreaterThanExpressionContext ctx) { + return new GTExpression((Expression) this.visit(ctx.lhs), (Expression) this.visit(ctx.rhs)); + } + + @Override + public Node visitLessThanOrEqualToExpression(KlangParser.LessThanOrEqualToExpressionContext ctx) { + return new LTEExpression((Expression) this.visit(ctx.lhs), (Expression) this.visit(ctx.rhs)); + } + + @Override + public Node visitGreaterThanOrEqualToExpression(KlangParser.GreaterThanOrEqualToExpressionContext ctx) { + return new GTEExpression((Expression) this.visit(ctx.lhs), (Expression) this.visit(ctx.rhs)); + } + @Override public Node visitSubstractionExpression(KlangParser.SubstractionExpressionContext ctx) { return new SubstractionExpression((Expression) this.visit(ctx.lhs), (Expression) this.visit(ctx.rhs)); diff --git a/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java b/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java index 09d870a..778a3d4 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java @@ -20,6 +20,56 @@ public class EvalVisitor implements Visitor { return new Value(e.value); } + @Override + public Value visit(EqualityExpression e) { + Value lhs = e.lhs.welcome(this); + Value rhs = e.rhs.welcome(this); + if (lhs.asInteger() == rhs.asInteger()) { + return new Value(1); + } + return new Value(0); + } + + @Override + public Value visit(GTExpression e) { + Value lhs = e.lhs.welcome(this); + Value rhs = e.rhs.welcome(this); + if (lhs.asInteger() > rhs.asInteger()) { + return new Value(1); + } + return new Value(0); + } + + @Override + public Value visit(GTEExpression e) { + Value lhs = e.lhs.welcome(this); + Value rhs = e.rhs.welcome(this); + if (lhs.asInteger() >= rhs.asInteger()) { + return new Value(1); + } + return new Value(0); + } + + @Override + public Value visit(LTExpression e) { + Value lhs = e.lhs.welcome(this); + Value rhs = e.rhs.welcome(this); + if (lhs.asInteger() < rhs.asInteger()) { + return new Value(1); + } + return new Value(0); + } + + @Override + public Value visit(LTEExpression e) { + Value lhs = e.lhs.welcome(this); + Value rhs = e.rhs.welcome(this); + if (lhs.asInteger() <= rhs.asInteger()) { + return new Value(1); + } + return new Value(0); + } + @Override public Value visit(AdditionExpression e) { Value lhs = e.lhs.welcome(this); diff --git a/src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java b/src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java index ad2cc94..4f96be1 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java @@ -71,6 +71,56 @@ public class PrettyPrintVisitor implements Visitor { return null; } + @Override + public Void visit(EqualityExpression e) { + ex.write("("); + e.lhs.welcome(this); + ex.write(" == "); + e.rhs.welcome(this); + ex.write(")"); + return null; + } + + @Override + public Void visit(GTExpression e) { + ex.write("("); + e.lhs.welcome(this); + ex.write(" > "); + e.rhs.welcome(this); + ex.write(")"); + return null; + } + + @Override + public Void visit(GTEExpression e) { + ex.write("("); + e.lhs.welcome(this); + ex.write(" >= "); + e.rhs.welcome(this); + ex.write(")"); + return null; + } + + @Override + public Void visit(LTExpression e) { + ex.write("("); + e.lhs.welcome(this); + ex.write(" < "); + e.rhs.welcome(this); + ex.write(")"); + return null; + } + + @Override + public Void visit(LTEExpression e) { + ex.write("("); + e.lhs.welcome(this); + ex.write(" <= "); + e.rhs.welcome(this); + ex.write(")"); + return null; + } + @Override public Void visit(AdditionExpression e) { ex.write("("); @@ -121,7 +171,6 @@ public class PrettyPrintVisitor implements Visitor { return null; } - @Override public Void visit(NegateExpression e) { ex.write(" - "); diff --git a/src/main/java/de/hsrm/compiler/Klang/visitors/Visitor.java b/src/main/java/de/hsrm/compiler/Klang/visitors/Visitor.java index 6b944d7..efe6b88 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/Visitor.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/Visitor.java @@ -10,6 +10,11 @@ public interface Visitor { R visit(IntegerExpression e); R visit(Variable e); R visit(AdditionExpression e); + R visit(EqualityExpression e); + R visit(GTExpression e); + R visit(GTEExpression e); + R visit(LTExpression e); + R visit(LTEExpression e); R visit(SubstractionExpression e); R visit(MultiplicationExpression e); R visit(DivisionExpression e);