private List <IToken> TokenizeInfix(List <string> _infix) { _infix.Insert(0, "("); _infix.Add(")"); Stack <string> operandHolder = new Stack <string>(); //Stack<string> operatorHolder = new Stack<string>(); List <IToken> tokens = new List <IToken>(); //int parenthesisBufferIndex = 0; for (int i = 0; i < _infix.Count; i++) { string c = _infix[i]; //Console.WriteLine(); //foreach (string s in operandHolder) //{ // Console.Write("holder: " + s); // Console.WriteLine(); //} //if (!nonOperandTokens.Contains(c)) //if c is a number //{ // operandHolder.Push(c); //} if (c == specialOperatorSymbol) { if (operandHolder.Count > 0) { List <string> operandStringHolder = new List <string>(); while (operandHolder.Count > 0) { operandStringHolder.Add(operandHolder.Pop()); } operandStringHolder.Reverse(); tokens.Add(new Operand(operandStringHolder)); //Console.WriteLine("fffff: " + c); } string joinedInfix = string.Join("", _infix); int endIndex = joinedInfix.IndexOf(specialOperatorEndSymbol, i + 1); string op = joinedInfix.Substring(i + 1, endIndex - i - 1); int bracketBuffer = 0; while (Regex.Matches(Regex.Escape(op), Regex.Escape(specialOperatorSymbol)).Count > bracketBuffer) { bracketBuffer++; endIndex = joinedInfix.IndexOf(specialOperatorEndSymbol, endIndex + 1); op = joinedInfix.Substring(i + 1, endIndex - i - 1); } //Console.WriteLine("T " + op); if (op != "") { if (specialOperands.Contains(op)) //is a special operand { //operandHolder.Push(op); //Console.WriteLine(tokens.Count - 2); if (tokens.Count > 0) { IToken previousToken = tokens[tokens.Count - 1]; //Console.WriteLine("Prev: " + previousToken.Token); if (previousToken is Operand || previousToken is SpecialOperand) { tokens.Add(new Operator("*")); } } tokens.Add(new SpecialOperand(op)); } else { SpecialOperator testOp = new SpecialOperator(op); if (specialOperators.Contains(testOp.OperatorToken)) { tokens.Add(testOp); } else { //Console.WriteLine("special"); tokens.Add(new Operator(op)); } } } i = endIndex; } else if (c == specialOperatorContainerSymbol) // if c is "[" { //tokens.Add(new SpecialOperator(c)); string joinedInfix = string.Join("", _infix); int endIndex = joinedInfix.IndexOf(specialOperatorContainerEndSymbol, i + 1); int bracketBuffer = 0; string op = joinedInfix.Substring(i + 1, endIndex - i - 1); //Console.WriteLine(op); while (Regex.Matches(Regex.Escape(op), Regex.Escape(specialOperatorContainerSymbol)).Count > bracketBuffer) { bracketBuffer++; endIndex = joinedInfix.IndexOf(specialOperatorContainerEndSymbol, endIndex + 1); op = joinedInfix.Substring(i + 1, endIndex - i - 1); } tokens.Add(new SpecialOperatorContainer(op)); //Console.WriteLine("T " + op); //if (specialOperands.Contains(op)) //is a special operand //{ // //operandHolder.Push(op); // //Console.WriteLine(tokens.Count - 2); // if (tokens.Count > 0) // { // IToken previousToken = tokens[tokens.Count - 1]; // //Console.WriteLine("Prev: " + previousToken.Token); // if (previousToken is Operand || previousToken is SpecialOperand) // { // tokens.Add(new Operator("*")); // } // } // tokens.Add(new SpecialOperand(op)); //} //else //{ // SpecialOperator testOp = new SpecialOperator(op); // if (specialOperators.Contains(testOp.OperatorComponent)) // { // tokens.Add(testOp); // } // else // { // //Console.WriteLine("special"); // tokens.Add(new Operator(op)); // } //} i = endIndex; } else if (c == specialOperandSingleSymbol) { if (operandHolder.Count > 0) { List <string> operandStringHolder = new List <string>(); while (operandHolder.Count > 0) { operandStringHolder.Add(operandHolder.Pop()); } operandStringHolder.Reverse(); tokens.Add(new Operand(operandStringHolder)); //Console.WriteLine("fffff: " + c); } //string joindInfix = string.Join("", _infix); //int endIndex = joindInfix.IndexOf(specialOperatorSymbol, i + 1); string op = _infix[++i]; //joindInfix.Substring(i + 1, endIndex - i - 1); if (specialOperandSingles.Contains(op)) //is a special operand { //operandHolder.Push(op); //Console.WriteLine(tokens.Count - 2); if (tokens.Count > 0) { IToken previousToken = tokens[tokens.Count - 1]; //Console.WriteLine("Prev: " + previousToken.Token); if (previousToken is Operand || previousToken is SpecialOperand) { tokens.Add(new Operator("*")); } } tokens.Add(new SpecialOperand(SpecialOperand.SingleToToken[op])); } } else if (c == specialOperatorVariableSymbol) { if (operandHolder.Count > 0) { List <string> operandStringHolder = new List <string>(); while (operandHolder.Count > 0) { operandStringHolder.Add(operandHolder.Pop()); } operandStringHolder.Reverse(); tokens.Add(new Operand(operandStringHolder)); //Console.WriteLine("fffff: " + c); } string joindInfix = string.Join("", _infix); int endIndex = joindInfix.IndexOf(specialOperatorVariableEndSymbol, i + 1); //Console.WriteLine("Heyyyyyyyyyyyyy " + joindInfix);//.Substring(i + 1, endIndex - i - 1)); //Console.WriteLine("EndIndex " + Convert.ToString(endIndex - i - 1)); double num = Convert.ToDouble(joindInfix.Substring(i + 1, endIndex - i - 1)); if (tokens.Count > 0) { IToken previousToken = tokens[tokens.Count - 1]; //Console.WriteLine("Prev: " + previousToken.Token); if (previousToken is Operand || previousToken is SpecialOperand) { tokens.Add(new Operator("*")); } } tokens.Add(new SpecialOperand(num)); //so that you can multiply without having to put the * symbol i = endIndex; } else if (!operandTokens.Contains(c)) //if not part of a number { if (operandHolder.Count > 0) { List <string> operandStringHolder = new List <string>(); while (operandHolder.Count > 0) { operandStringHolder.Add(operandHolder.Pop()); } operandStringHolder.Reverse(); tokens.Add(new Operand(operandStringHolder)); //Console.WriteLine("fffff: " + c); } //if (c == specialOperatorSymbol) //{ // string joindInfix = string.Join("", _infix); // int endIndex = joindInfix.IndexOf(specialOperatorSymbol, i + 1); // string op = joindInfix.Substring(i + 1, endIndex - i - 1); // SpecialOperator testOp = new SpecialOperator(op); // if (specialOperators.Contains(testOp.OperatorComponent)) // { // tokens.Add(testOp); // } // else // { // tokens.Add(new Operator(op)); // } // i = endIndex; //} //else //{ if (c == "(" && tokens.Count > 0) { IToken previousToken = tokens[tokens.Count - 1]; //Console.WriteLine("Prev: " + previousToken.Token); if (previousToken is Operand || previousToken is SpecialOperand) { tokens.Add(new Operator("*")); } } tokens.Add(new Operator(c)); //if (i!=_infix.Count - 1) // Console.WriteLine("bazinga" + i +" " + c + " " + _infix[i+1]); if (c == "(" && _infix[i + 1] == "-") { //Console.WriteLine("bruh" + i); //tokens.Add(new Operator("negative")); tokens.Add(new Operator(TokenLibrary.tokenLibrary["negative"])); i++; } //} //Console.WriteLine("bbbbb: " + c); } else //if c is an operand { operandHolder.Push(c); if (operandHolder.Count > 0 && tokens.Count > 0) { IToken previousToken = tokens[tokens.Count - 1]; //\E,0,2,0,2\[2^\E,0,2\[&i&j&k]] if (previousToken is SpecialOperand) { tokens.Add(new Operator("*")); } } //operandHolder.Push(c); if (c == "E") { string next = _infix[i + 1]; if (next == "+" || next == "-") { operandHolder.Push(next); i++; } } } } //if (operatorHolder.Count > 0) //{ // List<string> operatorStringHolder = new List<string>(); // while (operatorHolder.Count > 0) // { // operatorStringHolder.Add(operatorHolder.Pop()); // } // operatorStringHolder.Reverse(); // tokens.Add(new Operator(operatorStringHolder)); //} if (operandHolder.Count > 0) { List <string> operandStringHolder = new List <string>(); while (operandHolder.Count > 0) { operandStringHolder.Add(operandHolder.Pop()); } operandStringHolder.Reverse(); tokens.Add(new Operand(operandStringHolder)); } return(tokens); }
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; } }
public Postfix ToPostfix() { //Console.WriteLine("RawInfix " + RawInfix); //foreach (IToken token in InfixTokens) //{ // Console.WriteLine("Infix " + token.Token); //} Stack <IOperator> operatorStack = new Stack <IOperator>(); //operatorStack.Push(new Operator("(")); //InfixTokens.Insert(0, new Operator("(")); //InfixTokens.Add(new Operator(")")); List <IToken> postfixExpression = new List <IToken>(); foreach (IToken c in InfixTokens) { //if (c is SpecialOperatorContainer) //{ // Console.WriteLine("yyyyyy"); //} if (c.Token == "") { } else if (c is Operand || c is SpecialOperand || c is SpecialOperatorContainer) { postfixExpression.Add(c); } else if (c.Token == "(") { operatorStack.Push((Operator)c); } else if (c.Token == ")") { IToken x = operatorStack.Pop(); while (x.Token != "(") { postfixExpression.Add(x); x = operatorStack.Pop(); } } else if (c is SpecialOperator) { //Console.WriteLine("bbbbb"); IOperator x = operatorStack.Pop(); SpecialOperator temp = (SpecialOperator)c; //string op = //if (x is SpecialOperator) //{ //} while (isOperator(x.OperatorToken) && precedence(x.OperatorToken) >= precedence(((SpecialOperator)c).OperatorToken)) { postfixExpression.Add(x); x = operatorStack.Pop(); } operatorStack.Push(x); operatorStack.Push((SpecialOperator)c); } else if (c is Operator) { IOperator x = operatorStack.Pop(); //Operator temp = (Operator)c; while (isOperator(x.OperatorToken) && precedence(x.OperatorToken) >= precedence(((Operator)c).OperatorToken)) { postfixExpression.Add(x); x = operatorStack.Pop(); } operatorStack.Push(x); operatorStack.Push((Operator)c); } } return(new Postfix(postfixExpression)); }