Implemented != expression

This commit is contained in:
Marvin Kaiser
2019-12-20 09:09:01 +01:00
parent a79b7c9362
commit 079cdf4969
11 changed files with 80 additions and 0 deletions

View File

@@ -102,6 +102,11 @@ public class ContextAnalysis extends KlangBaseVisitor<Node> {
return new EqualityExpression((Expression) this.visit(ctx.lhs), (Expression) this.visit(ctx.rhs));
}
@Override
public Node visitNotEqualityExpression(KlangParser.NotEqualityExpressionContext ctx) {
return new NotEqualityExpression((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));

View File

@@ -0,0 +1,14 @@
package de.hsrm.compiler.Klang.nodes.expressions;
import de.hsrm.compiler.Klang.visitors.Visitor;
public class NotEqualityExpression extends BinaryExpression {
public NotEqualityExpression(Expression lhs, Expression rhs) {
super(lhs, rhs);
}
@Override
public <R> R welcome(Visitor<R> v) {
return v.visit(this);
}
}

View File

@@ -30,6 +30,16 @@ public class EvalVisitor implements Visitor<Value> {
return new Value(0);
}
@Override
public Value visit(NotEqualityExpression 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);

View File

@@ -95,6 +95,27 @@ public class GenASM implements Visitor<Void> {
return null;
}
@Override
public Void visit(NotEqualityExpression e) {
int lblTrue = ++lCount;
int lblEnd = ++lCount;
e.lhs.welcome(this);
this.ex.write(" pushq %rax\n");
e.rhs.welcome(this);
this.ex.write(" popq %rbx\n");
this.ex.write(" cmp %rax, %rbx\n");
this.ex.write(" jne .L" + lblTrue + "\n");
// false
this.ex.write(" movq $0, %rax\n");
this.ex.write(" jmp .L" + lblEnd + "\n");
this.ex.write(".L" + lblTrue + ":\n");
// true
this.ex.write(" movq $1, %rax\n");
this.ex.write(".L" + lblEnd + ":\n");
return null;
}
@Override
public Void visit(GTExpression e) {
int lblTrue = ++lCount;

View File

@@ -31,6 +31,13 @@ class GetVars implements Visitor<Void> {
return null;
}
@Override
public Void visit(NotEqualityExpression e) {
e.lhs.welcome(this);
e.rhs.welcome(this);
return null;
}
@Override
public Void visit(GTExpression e) {
e.lhs.welcome(this);

View File

@@ -80,6 +80,16 @@ public class PrettyPrintVisitor implements Visitor<Void> {
ex.write(")");
return null;
}
@Override
public Void visit(NotEqualityExpression e) {
ex.write("(");
e.lhs.welcome(this);
ex.write(" != ");
e.rhs.welcome(this);
ex.write(")");
return null;
}
@Override
public Void visit(GTExpression e) {

View File

@@ -11,6 +11,7 @@ public interface Visitor<R> {
R visit(Variable e);
R visit(AdditionExpression e);
R visit(EqualityExpression e);
R visit(NotEqualityExpression e);
R visit(GTExpression e);
R visit(GTEExpression e);
R visit(LTExpression e);