internal MathNode AddChild(MathNode n) { _child.Add(n); _childCount++; return(_child[_child.Count - 1]); // should be the same as n????? }
private MathNode Parse(string s) { if (string.IsNullOrEmpty(s)) { return(new MathNode(NodeType.Real, "0", _useRadians)); } if (IsNumeric(s)) { return(new MathNode(NodeType.Real, s, _useRadians)); } if (s[0] == '$') { if (IsNumeric(s.Substring(1))) { return(_tempNode[int.Parse(s.Substring(1))]); } } var sLo = s.ToLower(); if (sLo.Length == 1) { if (sLo[0] >= 'a' && sLo[0] <= 'z') { return(new MathNode(NodeType.Variable, sLo, _useRadians)); } } switch (sLo) { case "pi": return(new MathNode(NodeType.Variable, sLo, _useRadians)); } var bracStt = s.LastIndexOf('('); if (bracStt > -1) { var bracEnd = s.IndexOf(")", bracStt); if (bracEnd < 0) { _errMsg += "Missing ')'\n"; return(new MathNode(NodeType.Real, "0", _useRadians)); } bool isParam; if (bracStt == 0) { isParam = false; } else { var prefix = s.Substring(bracStt - 1, 1); isParam = _operators.IndexOf(prefix) <= -1; } if (!isParam) { _tempNode.Add(Parse(s.Substring(bracStt + 1, bracEnd - bracStt - 1))); return(Parse( s.Substring(0, bracStt) + "$" + (_tempNode.Count - 1).ToString() + s.Substring(bracEnd + 1, s.Length - bracEnd - 1) )); } else { var startM = -1; for (var u = bracStt - 1; u > -1; u--) { var found = _operators.IndexOf(s.Substring(u, 1)); if (found > -1) { startM = u; break; } } var nnew = new MathNode(NodeType.Function, s.Substring(startM + 1, bracStt - 1 - startM), _useRadians); nnew.AddChild(Parse(s.Substring(bracStt + 1, bracEnd - bracStt - 1))); _tempNode.Add(nnew); return(Parse( s.Substring(0, startM + 1) + "$" + (_tempNode.Count - 1).ToString() + s.Substring(bracEnd + 1, s.Length - bracEnd - 1) )); } } int k; var k1 = s.LastIndexOf('+'); var k2 = s.LastIndexOf('-'); if (k1 > -1 || k2 > -1) { if (k1 > k2) { k = k1; var nnew = new MathNode(NodeType.Operation, "add", _useRadians); nnew.AddChild(Parse(s.Substring(0, k))); nnew.AddChild(Parse(s.Substring(k + 1, s.Length - k - 1))); return(nnew); } else { k = k2; var nnew = new MathNode(NodeType.Operation, "sub", _useRadians); nnew.AddChild(Parse(s.Substring(0, k))); nnew.AddChild(Parse(s.Substring(k + 1, s.Length - k - 1))); return(nnew); } } k1 = s.LastIndexOf('*'); k2 = s.LastIndexOf('/'); if (k1 > -1 || k2 > -1) { if (k1 > k2) { k = k1; var nnew = new MathNode(NodeType.Operation, "mult", _useRadians); nnew.AddChild(Parse(s.Substring(0, k))); nnew.AddChild(Parse(s.Substring(k + 1, s.Length - k - 1))); return(nnew); } else { k = k2; var nnew = new MathNode(NodeType.Operation, "div", _useRadians); nnew.AddChild(Parse(s.Substring(0, k))); nnew.AddChild(Parse(s.Substring(k + 1, s.Length - k - 1))); return(nnew); } } k = s.IndexOf('^'); if (k > -1) { var nnew = new MathNode(NodeType.Operation, "pow", _useRadians); nnew.AddChild(Parse(s.Substring(0, k))); nnew.AddChild(Parse(s.Substring(k + 1, s.Length - k - 1))); return(nnew); } if (IsNumeric(s)) { return(new MathNode(NodeType.Real, s, _useRadians)); } else { if (s.Length == 0) { return(new MathNode(NodeType.Real, "0", _useRadians)); } else { _errMsg += "'" + s + "' is not a number.\n"; return(new MathNode(NodeType.Real, "0", _useRadians)); } } }