Пример #1
0
        private string Calc(string expr, int idx)
        {
            List <Atom> infix = Parsing.getAtoms(expr);

            List <Atom> postfix = new List <Atom>();

            Stack <Atom> Symbs = new Stack <Atom>();

            for (int i = 0; i < infix.Count; ++i)
            {
                if (infix[i].getType() == "OPER")
                {
                    if (Symbs.Count != 0)
                    {
                        if (infix[i].getValue() == "(")
                        {
                            Symbs.Push(infix[i]);
                        }
                        else
                        if (infix[i].getValue() == ")")
                        {
                            while (Symbs.Peek().getValue() != "(")
                            {
                                postfix.Add(Symbs.Peek());
                                Symbs.Pop();
                            }
                            Symbs.Pop();
                        }
                        else
                        {
                            while (Symbs.Count != 0 && prior[Parsing.getHash(infix[i].getValue())] <= prior[Parsing.getHash(Symbs.Peek().getValue())])
                            {
                                postfix.Add(Symbs.Peek());
                                Symbs.Pop();
                            }

                            Symbs.Push(infix[i]);
                        }
                    }
                    else
                    {
                        Symbs.Push(infix[i]);
                    }
                }
                else
                if (infix[i].getType() == "REF")
                {
                    refs.addEdge(idx, getItemNumber(infix[i].getValue()));
                    if (refs.isInCycle(idx))
                    {
                        var invalidCells = refs.availableFrom(idx);
                        for (int j = 0; j < invalidCells.Count; ++j)
                        {
                            Grid.Rows[invalidCells[j] / sz].Cells[invalidCells[j] % sz].Value = "ERROR";
                        }
                    }
                    postfix.Add(new NumAtom(getItemValue(infix[i].getValue())));
                }
                else
                {
                    postfix.Add(infix[i]);
                }
            }

            while (Symbs.Count != 0)
            {
                postfix.Add(Symbs.Peek());
                Symbs.Pop();
            }

            Stack <Atom> Nums = new Stack <Atom>();

            for (int i = 0; i < postfix.Count; ++i)
            {
                if (postfix[i].getType() == "OPER")
                {
                    Atom atom1 = Nums.Pop();
                    Atom atom2 = Nums.Pop();
                    Atom nAtom = new NumAtom(0);
                    if (postfix[i].getValue() == "+")
                    {
                        nAtom = new NumAtom(Parsing.StringToInt(atom1.getValue()) + Parsing.StringToInt(atom2.getValue()));
                    }
                    if (postfix[i].getValue() == "-")
                    {
                        nAtom = new NumAtom(Parsing.StringToInt(atom2.getValue()) - Parsing.StringToInt(atom1.getValue()));
                    }
                    if (postfix[i].getValue() == "*")
                    {
                        nAtom = new NumAtom(Parsing.StringToInt(atom1.getValue()) * Parsing.StringToInt(atom2.getValue()));
                    }
                    if (postfix[i].getValue() == "/")
                    {
                        nAtom = new NumAtom(Parsing.StringToInt(atom2.getValue()) / Parsing.StringToInt(atom1.getValue()));
                    }
                    if (postfix[i].getValue() == "div")
                    {
                        nAtom = new NumAtom(Parsing.StringToInt(atom2.getValue()) / Parsing.StringToInt(atom1.getValue()));
                    }
                    if (postfix[i].getValue() == "mod")
                    {
                        nAtom = new NumAtom(Parsing.StringToInt(atom2.getValue()) % Parsing.StringToInt(atom1.getValue()));
                    }
                    if (postfix[i].getValue() == "max")
                    {
                        nAtom = new NumAtom(Math.Max(Parsing.StringToInt(atom2.getValue()), Parsing.StringToInt(atom1.getValue())));
                    }
                    if (postfix[i].getValue() == "min")
                    {
                        nAtom = new NumAtom(Math.Min(Parsing.StringToInt(atom2.getValue()), Parsing.StringToInt(atom1.getValue())));
                    }
                    if (postfix[i].getValue() == "=")
                    {
                        if ((atom2.getValue() == atom1.getValue()))
                        {
                            nAtom = new NumAtom(1);
                        }
                        else
                        {
                            nAtom = new NumAtom(0);
                        }
                    }
                    if (postfix[i].getValue() == ">=")
                    {
                        if ((Parsing.StringToInt(atom2.getValue()) >= Parsing.StringToInt(atom1.getValue())))
                        {
                            nAtom = new NumAtom(1);
                        }
                        else
                        {
                            nAtom = new NumAtom(0);
                        }
                    }
                    if (postfix[i].getValue() == "<=")
                    {
                        if ((Parsing.StringToInt(atom2.getValue()) <= Parsing.StringToInt(atom1.getValue())))
                        {
                            nAtom = new NumAtom(1);
                        }
                        else
                        {
                            nAtom = new NumAtom(0);
                        }
                    }
                    if (postfix[i].getValue() == ">")
                    {
                        if ((Parsing.StringToInt(atom2.getValue()) > Parsing.StringToInt(atom1.getValue())))
                        {
                            nAtom = new NumAtom(1);
                        }
                        else
                        {
                            nAtom = new NumAtom(0);
                        }
                    }
                    if (postfix[i].getValue() == "<")
                    {
                        if ((Parsing.StringToInt(atom2.getValue()) < Parsing.StringToInt(atom1.getValue())))
                        {
                            nAtom = new NumAtom(1);
                        }
                        else
                        {
                            nAtom = new NumAtom(0);
                        }
                    }
                    if (postfix[i].getValue() == "<>")
                    {
                        if ((atom2.getValue() != atom1.getValue()))
                        {
                            nAtom = new NumAtom(1);
                        }
                        else
                        {
                            nAtom = new NumAtom(0);
                        }
                    }
                    Nums.Push(nAtom);
                }
                else
                {
                    Nums.Push(postfix[i]);
                }
            }
            if (Nums.Count == 0)
            {
                return("");
            }
            else
            {
                return(Nums.Peek().getValue().ToString());
            }
        }
        public string Calc(string expr)
        {
            try
            {
                List <Atom> infix = Parsing.getAtoms(expr);

                List <Atom> postfix = new List <Atom>();

                Stack <Atom> Symbs = new Stack <Atom>();

                for (int i = 0; i < infix.Count; ++i)
                {
                    if (infix[i].getType() == "OPER")
                    {
                        if (Symbs.Count != 0)
                        {
                            if (infix[i].getValue() == "(")
                            {
                                Symbs.Push(infix[i]);
                            }
                            else
                            if (infix[i].getValue() == ")")
                            {
                                while (Symbs.Peek().getValue() != "(")
                                {
                                    postfix.Add(Symbs.Peek());
                                    Symbs.Pop();
                                }
                                Symbs.Pop();
                            }
                            else
                            {
                                while (Symbs.Count != 0 && prior[Parsing.getHash(infix[i].getValue())] <= prior[Parsing.getHash(Symbs.Peek().getValue())])
                                {
                                    postfix.Add(Symbs.Peek());
                                    Symbs.Pop();
                                }

                                Symbs.Push(infix[i]);
                            }
                        }
                        else
                        {
                            Symbs.Push(infix[i]);
                        }
                    }
                    else
                    {
                        postfix.Add(infix[i]);
                    }
                }

                while (Symbs.Count != 0)
                {
                    postfix.Add(Symbs.Peek());
                    Symbs.Pop();
                }

                Stack <Atom> Nums = new Stack <Atom>();
                for (int i = 0; i < postfix.Count; ++i)
                {
                    if (postfix[i].getType() == "OPER")
                    {
                        Atom atom1 = Nums.Pop();
                        Atom atom2 = Nums.Pop();
                        Atom nAtom = new NumAtom(0);
                        if (postfix[i].getValue() == "+")
                        {
                            nAtom = new NumAtom(Parsing.StringToInt(atom1.getValue()) + Parsing.StringToInt(atom2.getValue()));
                        }
                        if (postfix[i].getValue() == "-")
                        {
                            nAtom = new NumAtom(Parsing.StringToInt(atom2.getValue()) - Parsing.StringToInt(atom1.getValue()));
                        }
                        if (postfix[i].getValue() == "*")
                        {
                            nAtom = new NumAtom(Parsing.StringToInt(atom1.getValue()) * Parsing.StringToInt(atom2.getValue()));
                        }
                        if (postfix[i].getValue() == "/")
                        {
                            nAtom = new NumAtom(Parsing.StringToInt(atom2.getValue()) / Parsing.StringToInt(atom1.getValue()));
                        }
                        if (postfix[i].getValue() == "div")
                        {
                            nAtom = new NumAtom(Parsing.StringToInt(atom2.getValue()) / Parsing.StringToInt(atom1.getValue()));
                        }
                        if (postfix[i].getValue() == "mod")
                        {
                            nAtom = new NumAtom(Parsing.StringToInt(atom2.getValue()) % Parsing.StringToInt(atom1.getValue()));
                        }
                        if (postfix[i].getValue() == "max")
                        {
                            nAtom = new NumAtom(Math.Max(Parsing.StringToInt(atom2.getValue()), Parsing.StringToInt(atom1.getValue())));
                        }
                        if (postfix[i].getValue() == "min")
                        {
                            nAtom = new NumAtom(Math.Min(Parsing.StringToInt(atom2.getValue()), Parsing.StringToInt(atom1.getValue())));
                        }
                        if (postfix[i].getValue() == "=")
                        {
                            if ((atom2.getValue() == atom1.getValue()))
                            {
                                nAtom = new NumAtom(1);
                            }
                            else
                            {
                                nAtom = new NumAtom(0);
                            }
                        }
                        if (postfix[i].getValue() == ">=")
                        {
                            if ((Parsing.StringToInt(atom2.getValue()) >= Parsing.StringToInt(atom1.getValue())))
                            {
                                nAtom = new NumAtom(1);
                            }
                            else
                            {
                                nAtom = new NumAtom(0);
                            }
                        }
                        if (postfix[i].getValue() == "<=")
                        {
                            if ((Parsing.StringToInt(atom2.getValue()) <= Parsing.StringToInt(atom1.getValue())))
                            {
                                nAtom = new NumAtom(1);
                            }
                            else
                            {
                                nAtom = new NumAtom(0);
                            }
                        }
                        if (postfix[i].getValue() == ">")
                        {
                            if ((Parsing.StringToInt(atom2.getValue()) > Parsing.StringToInt(atom1.getValue())))
                            {
                                nAtom = new NumAtom(1);
                            }
                            else
                            {
                                nAtom = new NumAtom(0);
                            }
                        }
                        if (postfix[i].getValue() == "<")
                        {
                            if ((Parsing.StringToInt(atom2.getValue()) < Parsing.StringToInt(atom1.getValue())))
                            {
                                nAtom = new NumAtom(1);
                            }
                            else
                            {
                                nAtom = new NumAtom(0);
                            }
                        }
                        if (postfix[i].getValue() == "<>")
                        {
                            if ((atom2.getValue() != atom1.getValue()))
                            {
                                nAtom = new NumAtom(1);
                            }
                            else
                            {
                                nAtom = new NumAtom(0);
                            }
                        }
                        Nums.Push(nAtom);
                    }
                    else
                    {
                        Nums.Push(postfix[i]);
                    }
                }
                if (Nums.Count == 0)
                {
                    return("");
                }
                else
                {
                    return(Nums.Peek().getValue().ToString());
                }
            }
            catch
            {
                return("");
            }
        }