Пример #1
0
 internal MathNode AddChild(MathNode n)
 {
     _child.Add(n);
     _childCount++;
     return(_child[_child.Count - 1]); // should be the same as n?????
 }
Пример #2
0
        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));
                }
            }
        }