Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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;
            }
        }
Ejemplo n.º 3
0
        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));
        }