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; }
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); }