FAQ | This is a LIVE service | Changelog

Skip to content
Snippets Groups Projects
Commit 2833849e authored by Andrew Rice's avatar Andrew Rice
Browse files

expression evaluator

parent 2cc08f92
No related branches found
No related tags found
No related merge requests found
package uk.ac.cam.acr31.oop.democode1920.lecture5;
public class Expression {
private static final int LITERAL = 1;
private static final int PLUS = 2;
private static final int MULT = 3;
private final int type;
private final int value;
private final Expression left;
private final Expression right;
public Expression(int type, int value, Expression left, Expression right) {
this.type = type;
this.value = value;
this.left = left;
this.right = right;
}
// factory method
// static constructor
static Expression literal(int v) {
return new Expression(LITERAL, v, null, null);
}
static Expression plus(Expression left, Expression right) {
return new Expression(PLUS, 0, left, right);
}
static Expression mult(Expression left, Expression right) {
return new Expression(MULT, 0, left, right);
}
int evaluate() {
switch (type) {
case LITERAL:
return value;
case PLUS:
return left.evaluate() + right.evaluate();
case MULT:
return left.evaluate() * right.evaluate();
}
throw new UnsupportedOperationException();
}
public String toString() {
switch (type) {
case LITERAL:
return String.valueOf(value); // return ""+value
case PLUS:
return String.format("(%s + %s)",left,right);
case MULT:
return String.format("(%s * %s)",left,right);
}
throw new UnsupportedOperationException();
}
}
......@@ -11,5 +11,24 @@ public class ExpressionEvaluator {
// 1 *
// / \
// 2 3
{
Expression one = Expression.literal(1);
Expression two = Expression.literal(2);
Expression three = Expression.literal(3);
Expression mult = Expression.mult(two, three);
Expression plus = Expression.plus(one, mult);
System.out.println(plus.evaluate());
System.out.println(plus);
}
{
SuperExpression one = new Literal(1);
SuperExpression two = new Literal(2);
SuperExpression three = new Literal(3);
SuperExpression mult = new Mult(two, three);
SuperExpression plus = new Plus(one, mult);
System.out.println(plus.evaluate());
System.out.println(plus);
}
}
}
package uk.ac.cam.acr31.oop.democode1920.lecture5;
public class Literal extends SuperExpression {
private final int value;
public Literal(int value) {
this.value = value;
}
@Override
int evaluate() {
return value;
}
@Override
public String toString() {
return value+"";
}
}
package uk.ac.cam.acr31.oop.democode1920.lecture5;
public class Mult extends SuperExpression {
private final SuperExpression left;
private final SuperExpression right;
public Mult(SuperExpression left, SuperExpression right) {
this.left = left;
this.right = right;
}
@Override
int evaluate() {
return left.evaluate() * right.evaluate();
}
@Override
public String toString() {
return String.format("(%s * %s)", left, right);
}
}
package uk.ac.cam.acr31.oop.democode1920.lecture5;
public class Plus extends SuperExpression {
private final SuperExpression left;
private final SuperExpression right;
public Plus(SuperExpression left, SuperExpression right) {
this.left = left;
this.right = right;
}
@Override
int evaluate() {
return left.evaluate() + right.evaluate();
}
@Override
public String toString() {
return String.format("(%s + %s)", left, right);
}
}
package uk.ac.cam.acr31.oop.democode1920.lecture5;
public abstract class SuperExpression {
abstract int evaluate();
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment