public double SolvedExpression(int cycle = 0) { //foreach (IToken token in PostfixExpression) //{ // Console.WriteLine(token.Token); //} Stack <IOperand> answerHolder = new Stack <IOperand>(); foreach (IToken token in PostfixExpression) { if (token is Operand) { answerHolder.Push((Operand)token); } else if (token is SpecialOperand) { answerHolder.Push((SpecialOperand)token); } else if (token is SpecialOperatorContainer) { //Console.WriteLine("gggg"); answerHolder.Push((SpecialOperatorContainer)token); } else if (token is SpecialOperator) { SpecialOperator sop = (SpecialOperator)token; if (specialOperators.Contains(sop.OperatorToken)) { //Console.WriteLine("Hiiii"); List <string> nonOperatorComponents = new List <string>(); for (int i = 1; i < sop.TokenComponents.Count; i++) { nonOperatorComponents.Add(sop.TokenComponents[i]); } //Console.WriteLine(sop.Token); SpecialOperatorContainer a = (SpecialOperatorContainer)answerHolder.Pop(); answerHolder.Push(ApplySpecialOperator(sop.OperatorToken, nonOperatorComponents, a, cycle)); } } else { Operator op = (Operator)token; if (unaryOperators.Contains(token.Token)) { IOperand a = answerHolder.Pop(); answerHolder.Push(ApplyUnaryOperator(a, op)); } else { //Console.WriteLine("OP " + op.Token); IOperand b = answerHolder.Pop(); //Console.WriteLine("B " + b.Token); IOperand a = answerHolder.Pop(); answerHolder.Push(ApplyBinaryOperator(a, op, b)); } } //foreach (IOperand answer in answerHolder) //{ // Console.WriteLine("Processing: " + answer.Token); //} } if (answerHolder.Count == 1) { return(answerHolder.Pop().TokenValue);//RoundAnswer(answerHolder.Pop().TokenValue); // I've gotta make this more accurate. I mean come on } else { return(-10000);//1000000000000000; } }
private Operand ApplySpecialOperator(string op, List <string> nonOpComponents, SpecialOperatorContainer a, int cycle) { //Console.WriteLine("testing: " + op); //switch (op) //{ // //case "sin": // // return new Operand((decimal)Math.Sin(Convert.ToDouble(nonOpComponents[0]))); // default: // return new Operand(0); //} double returnValue = 0; string parsedA = a.Token.Replace("&i", "&1").Replace("&j", "&2").Replace("&k", "&3"); if (op == TokenLibrary.tokenLibrary["summation"]) { returnValue = Summation(nonOpComponents, parsedA, cycle); //int i = Convert.ToInt32(nonOpComponents[0]); //int top = Convert.ToInt32(nonOpComponents[1]); ////while (i <= top) ////{ //// i++; ////} //double addValue = 0; //if (!a.Token.Contains("&i")) //{ // //Postfix addValuePostfix = new Infix(a.Token).ToPostfix(); // addValue = new Infix(a.Token).ToPostfix().SolvedExpression(); //} //for (; i <= top; i++) //{ // if (a.Token.Contains("&i")) // { // //Console.WriteLine(i); // string newRawInfix = a.Token.Replace("&i", "&" + Convert.ToString(i) + "&"); // //Console.WriteLine(newRawInfix); // addValue = new Infix(newRawInfix).ToPostfix().SolvedExpression(); // } // returnValue += addValue; //} } else if (op == TokenLibrary.tokenLibrary["integral"]) { returnValue = Integral(nonOpComponents, parsedA, cycle); } else { returnValue = 0; } return(new Operand(returnValue)); }