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

@@ -56,6 +56,7 @@ expression
| OPAR lhs=expression DIV rhs=expression CPAR #divisionExpression
| OPAR lhs=expression MOD rhs=expression CPAR #moduloExpression
| OPAR lhs=expression EQEQ rhs=expression CPAR #equalityExpression
| OPAR lhs=expression NEQ rhs=expression CPAR #NotEqualityExpression
| OPAR lhs=expression LT rhs=expression CPAR #lessThanExpression
| OPAR lhs=expression GT rhs=expression CPAR #greaterThanExpression
| OPAR lhs=expression LTE rhs=expression CPAR #lessThanOrEqualToExpression
@@ -93,6 +94,7 @@ CPAR: ')';
COMMA: ',';
EQUAL: '=';
EQEQ: '==';
NEQ: '!=';
LT: '<';
GT: '>';
LTE: '<=';

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);

View File

@@ -27,6 +27,11 @@ int runComparisonTests() {
failed += comparisonTest("==", 0, 1, 0, eq(0, 1));
failed += comparisonTest("==", 0, 0, 1, eq(0, 0));
failed += comparisonTest("!=", 1, 1, 0, neq(1, 1));
failed += comparisonTest("!=", 1, 0, 1, neq(1, 0));
failed += comparisonTest("!=", 0, 1, 1, neq(0, 1));
failed += comparisonTest("!=", 0, 0, 0, neq(0, 0));
failed += comparisonTest("<", 1, 1, 0, lt(1, 1));
failed += comparisonTest("<", 1, 0, 0, lt(1, 0));
failed += comparisonTest("<", 0, 1, 1, lt(0, 1));

View File

@@ -1,4 +1,5 @@
int eq(int x, int y);
int neq(int x, int y);
int lt(int x, int y);
int lte(int x, int y);
int gt(int x, int y);

View File

@@ -113,6 +113,10 @@ function eq(x, y) {
return (x == y);
}
function neq(x, y) {
return (x != y);
}
function lt(x, y) {
return (x < y);
}