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);
|
||||
|
||||
Reference in New Issue
Block a user