Ejemplo n.º 1
0
        public override Function RollUp()
        {
            this.rightNode = this.rightNode.RollUp();
            this.leftNode  = this.leftNode.RollUp();

            if ((this.leftNode is Number) && (this.rightNode is Number))
            //if ((this.leftNode.GetType() == typeof(Constant)) && (this.rightNode.GetType() == typeof(Constant)))
            {
                Number newnode = new Number(this.Evaluate().ToString());
                return(newnode);
            }
            else
            {
                TwoOperandFunction newnode;
                switch (operation)
                {
                case "*":
                    return(newnode = new Multiple(operation, rightNode, leftNode));

                case "/":
                    return(newnode = new Fraction(operation, rightNode, leftNode));

                case "+":
                    return(newnode = new SummFunction(operation, rightNode, leftNode));

                case "-":
                    return(newnode = new MinusFunction(operation, rightNode, leftNode));

                case "^":
                    return(newnode = new Power(operation, rightNode, leftNode));

                default:
                    return(newnode = new TwoOperandFunction(operation, rightNode, leftNode));
                }
            }
            //return null;
        }
Ejemplo n.º 2
0
        public Function buildTree()
        {
            ArrayList list = new ArrayList();

            for (int i = 0; i < terms.Count; i++)
            {
                if (terms[i].type == term.number)
                {
                    Number c = new Number(terms[i].value);
                    list.Add(c);
                }
                else if (terms[i].type == term.letter)
                {
                    if (Enum.IsDefined(typeof(nameconst), terms[i].value))
                    {
                        NameConstant v = new NameConstant(terms[i].value);
                        list.Add(v);
                    }
                    else
                    {
                        Variable v = new Variable(terms[i].value);
                        list.Add(v);
                    }
                }
                else if (terms[i].type == term.multiline)
                {
                    if (Enum.IsDefined(typeof(namefunc), terms[i].value))
                    {
                        list.Add(terms[i]);
                    }
                    else if (Enum.IsDefined(typeof(nameconst), terms[i].value))
                    {
                        NameConstant v = new NameConstant(terms[i].value);
                        list.Add(v);
                    }
                    else
                    {
                        Variable w = new Variable(terms[i].value[0].ToString());
                        list.Add(w);
                        for (int j = 1; j < terms[i].value.Length; j++)
                        {
                            Token t = new Token();
                            t.value = "*";
                            t.type  = term.operation;
                            list.Add(t);
                            Variable k = new Variable(terms[i].value[j].ToString());
                            list.Add(k);
                        }
                    }
                }
                else
                {
                    list.Add(terms[i]);
                }
            }

            int lengthList = list.Count;

            string error = "";

            while (list.Count > 1)
            {
                for (int i = 0; i < list.Count; i++)
                {
                    if ((list[i] is Token) && (list.Count > i + 2))
                    {
                        if (((String)((Token)list[i]).value == "(") && (((String)((Token)list[i + 2]).value == ")")))
                        {
                            if (list[i + 1] is Function)
                            {
                                BracketFunction bracket = new BracketFunction((Function)list[i + 1]);
                                list[i] = bracket;
                                list.RemoveAt(i + 1);
                                list.RemoveAt(i + 1);
                                i -= 1;
                                if ((i >= 0) && (Enum.IsDefined(typeof(namefunc), (string)((Token)list[i]).value)))
                                {
                                    StandartFunction func = new StandartFunction((String)((Token)list[i]).value, (Function)list[i + 1]);
                                    list[i] = func;
                                    list.RemoveAt(i + 1);
                                }
                            }
                            else
                            {
                                error = "Встречен знак {(,)}, но список токенов не содержит выражение вида (Function)";
                                ErrorFunction err = new ErrorFunction(error);
                                list.Clear();
                                list.Add(err);
                            }
                        }
                        else if ((String)((Token)list[i]).value == "(")
                        {
                            error = "Встречен знак (, но список токенов не содержит выражение вида (Function)";
                        }
                    }
                    else
                    {
                        error = error = "Встречен неверный токен... ";
                    }
                }
                for (int i = 1; i < list.Count; i++)  // instead i=0;
                {
                    if ((list[i] is Token) && (list.Count > i + 1))
                    {
                        if ((String)((Token)list[i]).value == "^")
                        {
                            if ((list[i - 1] is Function) && (list[i + 1] is Function))
                            {
                                if ((list.Count > i + 2) && (list[i + 2] is Token))
                                {
                                    if (!isLessEqualPriority((String)((Token)list[i]).value, (String)((Token)list[i + 2]).value))
                                    {
                                        continue;
                                    }
                                }
                                //TwoOperandFunction two = new TwoOperandFunction((String)((Token)list[i]).value, (Function)list[i + 1], (Function)list[i - 1]);
                                TwoOperandFunction two = createOperFunction((String)((Token)list[i]).value, (Function)list[i + 1], (Function)list[i - 1]);
                                list[i] = two;
                                list.RemoveAt(i - 1);
                                list.RemoveAt(i);
                                i -= 1;
                            }
                            else
                            {
                                error = "Встречен знак ^, но список токенов не содержит выражение вида Function^Function";
                            }
                        }
                        else if (((String)((Token)list[i]).value == "*") || (((String)((Token)list[i]).value == "/")))
                        {
                            if ((list[i - 1] is Function) && (list[i + 1] is Function))
                            {
                                if ((list.Count > i + 2) && (list[i + 2] is Token))
                                {
                                    if (!isLessEqualPriority((String)((Token)list[i]).value, (String)((Token)list[i + 2]).value))
                                    {
                                        continue;
                                    }
                                }
                                //TwoOperandFunction two = new TwoOperandFunction((String)((Token)list[i]).value, (Function)list[i + 1], (Function)list[i - 1]);
                                TwoOperandFunction two = createOperFunction((String)((Token)list[i]).value, (Function)list[i + 1], (Function)list[i - 1]);
                                list[i] = two;
                                list.RemoveAt(i - 1);
                                list.RemoveAt(i);
                                i -= 1;
                            }
                            else
                            {
                                error = "Встречен знак {*,/}, но список токенов не содержит выражение вида Function{*,/}Function";
                            }
                        }
                        else if (((String)((Token)list[i]).value == "+") || (((String)((Token)list[i]).value == "-")))
                        {
                            if ((list[i - 1] is Function) && (list[i + 1] is Function))
                            {
                                if ((list.Count > i + 2) && (list[i + 2] is Token))
                                {
                                    if (!isLessEqualPriority((String)((Token)list[i]).value, (String)((Token)list[i + 2]).value))
                                    {
                                        continue;
                                    }
                                }
                                //TwoOperandFunction two = new TwoOperandFunction((String)((Token)list[i]).value, (Function)list[i + 1], (Function)list[i - 1]);
                                TwoOperandFunction two = createOperFunction((String)((Token)list[i]).value, (Function)list[i + 1], (Function)list[i - 1]);
                                list[i] = two;
                                list.RemoveAt(i - 1);
                                list.RemoveAt(i);
                                i -= 1;
                            }
                            else
                            {
                                error = "Встречен знак {+,-}, но список токенов не содержит выражение вида Function{+,-}Function";
                            }
                        }
                    }
                    else
                    {
                        error = "Встречен неверный токен... ";
                    }
                }
                for (int i = 0; i < list.Count; i++)
                {
                    if ((list[i] is Token) && (list.Count > i + 1))
                    {
                        if (Enum.IsDefined(typeof(namefunc), (string)((Token)list[i]).value))
                        {
                            if (list[i + 1] is BracketFunction)
                            {
                                StandartFunction name = new StandartFunction((String)((Token)list[i]).value, (Function)list[i + 1]);
                                list[i] = name;
                                list.RemoveAt(i + 1);
                            }
                            else
                            {
                                error = "Встречен токен " + (String)((Token)list[i]).value + " , но список токенов не содержит выражение вида " + (String)((Token)list[i]).value + "(Function)";
                            }
                        }
                    }
                    else
                    {
                        error = "Встречен неверный токен... ";
                    }
                }
                if (lengthList != list.Count)
                {
                    lengthList = list.Count;
                }
                else
                {
                    //Console.WriteLine("Цикл стремится к бесконечности...");
                    //Console.WriteLine(error);
                    break;
                }
            }

            //Function ff = new Function();
            if (list[0] is Function && list.Count == 1)
            {
                this.tree = (Function)list[0];
            }
            else
            {
                this.tree = new ErrorFunction(error);
            }
            return(this.tree);
        }