/// <summary> /// Finds the first instance of currentOperator (i.e. '+'), takes the operands on the left and right /// to the operator and builds an Expression instance (i.e. AddExpression in case of '+'). /// </summary> /// <param name="expression">A list containing numbers, operators and expressions.</param> /// <param name="currentOperator">The symbol of the current operator to be processed.</param> private static void CreateExpression(List<dynamic> expression, char currentOperator) { int operatorIndex = expression.IndexOf(currentOperator); Expression operation; dynamic leftOperand, rightOperand; try { if (expression.ElementAt(operatorIndex - 1) is double) { leftOperand = new NumberExpression(expression.ElementAt(operatorIndex - 1)); } else if (expression.ElementAt(operatorIndex - 1) is Expression) { leftOperand = expression.ElementAt(operatorIndex - 1); } else { throw new ArgumentException("Invalid expression string."); } if (expression.ElementAt(operatorIndex + 1) is double) { rightOperand = new NumberExpression(expression.ElementAt(operatorIndex + 1)); } else if (expression.ElementAt(operatorIndex + 1) is Expression) { rightOperand = expression.ElementAt(operatorIndex + 1); } else { throw new ArgumentException("Invalid expression string."); } } catch (Exception ex) { throw new ArgumentException("Invalid expression string."); } switch (currentOperator) { case '+': operation = new AddExpression(leftOperand, rightOperand); break; case '-': operation = new SubtractExpression(leftOperand, rightOperand); break; case '*': operation = new MultiplyExpression(leftOperand, rightOperand); break; case '/': operation = new DivideExpression(leftOperand, rightOperand); break; default: operation = new NumberExpression(0); break; } expression.RemoveAt(operatorIndex + 1); expression.RemoveAt(operatorIndex); expression.RemoveAt(operatorIndex - 1); expression.Insert(operatorIndex - 1, operation); }