package net.sven_eisenhauer.swa_prakt1; public class ExpressionIterator implements ArithmeticIterator { private ArithmeticExpression baseNode; public ExpressionIterator(ArithmeticExpression baseNode) { this.baseNode = baseNode; } public void print() { if(baseNode instanceof ArithmeticVariable) { System.out.print(((ArithmeticVariable) baseNode).getName()); } else { ArithmeticOperation actOperation = (ArithmeticOperation) baseNode; ArithmeticIterator leftIter = new ExpressionIterator(actOperation.getLeftOperand()); ArithmeticIterator rightIter = new ExpressionIterator(actOperation.getRightOperand()); System.out.print("("); leftIter.print(); System.out.print(actOperation.getOperationSign()); rightIter.print(); System.out.print(")"); } } public Number evaluate() { if(baseNode instanceof ArithmeticVariable) { return ((ArithmeticVariable) baseNode).getValue(); } else { ArithmeticOperation actOperation = (ArithmeticOperation) baseNode; ArithmeticIterator leftIter = new ExpressionIterator(actOperation.getLeftOperand()); ArithmeticIterator rightIter = new ExpressionIterator(actOperation.getRightOperand()); Number leftVal = leftIter.evaluate(); Number rightVal = rightIter.evaluate(); if(actOperation instanceof ArithmeticAddition) { return leftVal.doubleValue() + rightVal.doubleValue(); } else if(actOperation instanceof ArithmeticSubstraction) { return leftVal.doubleValue() - rightVal.doubleValue(); } else if(actOperation instanceof ArithmeticDivision) { return leftVal.doubleValue() / rightVal.doubleValue(); } else if(actOperation instanceof ArithmeticMultiplication) { return leftVal.doubleValue() * rightVal.doubleValue(); } else { return null; } } } }