Implemented != expression
This commit is contained in:
@@ -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: '<=';
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user