/* Lab 5: Math Expression Factory 7/21/05 */ abstract class Expression { abstract int evaluate(); abstract int positiveEvaluate(); } class Number extends Expression { int value; Number(int value) { this.value = value; } // new Number(5).evaluate() == 5 // Evaluate this Number int evaluate() { // ... this.value ... return this.value; } // new Number(-5).positiveEvaluate() == 5 // new Number(5).positiveEvaluate() == 5 // Fully evaluate this Number and make it positive int positiveEvaluate() { // ... this.value ... return new AbsoluteValue(new Number(this.value)).evaluate(); } } class Plus extends Expression { Expression left; Expression right; Plus(Expression left, Expression right) { this.left = left; this.right = right; } // new Plus(new Plus(new Number(5), new Number(-2)), new Number(6)).evaluate() == 9 // Evaluate this Plus expression fully int evaluate() { // ... this.left.ExpressionMethod() ... this.right.ExpressionMethod() ... return this.left.evaluate() + this.right.evaluate(); } // new Plus(new Plus(new Number(5), new Number(-12)), new Number(6)).positiveEvaluate() == 1 // new Plus(new Plus(new Number(5), new Number(-2)), new Number(6)).positiveEvaluate() == 9 // To determine the positive fully evaluated value of this Plus expression int positiveEvaluate() { return new AbsoluteValue(new Number(this.evaluate())).evaluate(); } } class Minus extends Expression { Expression left; Expression right; Minus(Expression left, Expression right) { this.left = left; this.right = right; } // new Minus(new Plus(new Number(5), new Number(-2)), new Number(6)).evaluate() == -3 // Evaluate this Minus expression fully int evaluate() { // ... this.left.ExpressionMethod() ... this.right.ExpressionMethod() ... return this.left.evaluate() - this.right.evaluate(); } // new Minus(new Plus(new Number(5), new Number(-2)), new Number(6)).positiveEvaluate() == 3 // To determine the positive fully evaluated value of this Minus expression int positiveEvaluate() { return new AbsoluteValue(new Number(this.evaluate())).evaluate(); } } class AbsoluteValue extends Expression { Expression value; AbsoluteValue(Expression value) { this.value = value; } // new AbsoluteValue(new Minus(new Plus(new Number(5), // new Number(-2)), // new Number(6))).evaluate() == 3 // new AbsoluteValue(new Minus(new Plus(new Number(5), // new Number(10)), // new Number(6))).evaluate() == 9 // Evalute this AbsoluteValue expression fully int evaluate() { // ... this.value.ExpressionMethod() ... if (this.value.evaluate() < 0) return - this.value.evaluate(); // unary minus, equivalent in effect to 0 - value.evaluate() else return this.value.evaluate(); } // new AbsoluteValue(new Minus(new Plus(new Number(5), // new Number(-2)), // new Number(6))).positiveEvaluate() == 3 // new AbsoluteValue(new Minus(new Plus(new Number(5), // new Number(10)), // new Number(6))).positiveEvaluate() == 9 // To determine the positive fully evaluated value of this AbsoluteValue expression int positiveEvaluate() { return this.evaluate(); } }