Beispiel #1
0
        public void Expression(ref string s, out Node D) // + - |
        {
            s = s.Trim();
            if (s.Length != 0)
            {
                string sign = "+";
                if ((Peek(ref s) == '+') | (Peek(ref s) == '-'))
                {
                    sign = Pop(ref s, 1);
                }
                Term(ref s, out D);
                if (sign == "-")
                {
                    Node D1 = D;
                    Node D2 = D1;
                    D = new NodeFunc(7, D1, D2);
                }
                s = s.Trim();
                while ((s.Length > 0) && ((Peek(ref s) == '+') | (Peek(ref s) == '-') | (Peek(ref s) == '|')))
                {
                    sign = Pop(ref s, 1);
                    if (s.Length != 0)
                    {
                        if ((Peek(ref s) == '+') | (Peek(ref s) == '-') | (Peek(ref s) == '|'))
                        {
                            throw new NodeException(7, "лишний знак");
                        }
                    }
                    else
                    {
                        throw new NodeException(7, "после знака ничего не оказалось");
                    }
                    Node D2;
                    Term(ref s, out D2);
                    Node D1 = D;

                    Operation t = Operation.PLUS;
                    switch (sign[0])
                    {
                    case '+': t = Operation.PLUS; break;

                    case '-': t = Operation.MINUS; break;

                    case '|': t = Operation.OR; break;
                    }
                    D = new NodeOperation(t, D1, D2);
                }
            }
            else
            {
                D = null; throw new NodeException(6, "нехватка данных");
            }
        }
Beispiel #2
0
        void Factor(ref string s, out Node D) // константы, скобки, функции, переменные
        {
            D = null;
            s = s.Trim();
            if (s.Length != 0)
            {
                char[] aCh = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '-' };
                int    k   = Array.IndexOf(aCh, s[0]);
                if (k != -1)
                {
                    double x; TypeVal t;
                    SetConst(ref s, out x, out k, out t);
                    if (t == TypeVal.tFloat)
                    {
                        D = new NodeConst(t, x);
                    }
                    else
                    {
                        D = new NodeConst(t, k);
                    }
                }
                else
                if (s[0] == '(')
                {
                    Pop(ref s, 1);
                    PFormula(ref s, out D);
                    s = s.Trim();
                    if ((s.Length > 0) & (s[0] != ')'))
                    {
                        throw new NodeException(9, "ошибка со скобками");
                    }
                    Pop(ref s, 1);
                }
                else
                {
                    string st = Pop(ref s, 1);
                    while ((s.Length > 0) && TestCh(s[0]))
                    {
                        st += Pop(ref s, 1);
                    }
                    bool ok = false; int nf = -1;
                    while ((nf < nameFunc.Length - 1) && !ok)
                    {
                        ok = st == nameFunc[++nf];
                    }
                    if (ok)
                    {
                        if ((s.Length == 1) | (s[0] != '('))
                        {
                            throw new NodeException(9, "ошибка с функцией");
                        }
                        s = s.Trim();

                        st = ""; k = 1; int i = 0; int i2 = -1;
                        while ((i < s.Length) & (k != 0))
                        {
                            st += s[++i];
                            switch (s[i])
                            {
                            case '(': ++k; break;

                            case ')': --k; break;

                            case ';': if ((nf != 5) && (nf != 6))
                                {
                                    throw new NodeException(9, "ошибка с функцией");
                                }
                                else
                                {
                                    i2 = i;
                                } break;
                            }
                        }
                        if (i2 == -1)
                        {
                            st = st.Substring(0, st.Length - 1);
                            s  = s.Substring(i + 1, s.Length - i - 1);
                            Node Da;
                            PFormula(ref st, out Da);
                            Node Da2 = Da;
                            D = new NodeFunc(nf, Da, Da2);
                            s = s.Trim();
                        }
                        else
                        {
                            string st1 = "";
                            string st2 = "";
                            st1 = st.Substring(0, i2 - 1);
                            st2 = st.Substring(i2, st.Length - i2 - 1);
                            s   = s.Substring(i + 1, s.Length - i - 1);
                            Node Da;
                            PFormula(ref st1, out Da);
                            Node Da2;
                            PFormula(ref st2, out Da2);
                            D = new NodeFunc(nf, Da, Da2);
                            s = s.Trim();
                        }
                        return;
                    }
                    // поиск переменной
                    ok = false; int nv = -1;
                    while ((nv < aVar.Length - 1) && !ok)
                    {
                        ok = st == aVar[++nv].name;
                    }
                    if (ok)
                    {
                        D = new NodeVal(nv);
                        s = s.Trim(); return;
                    }
                    throw new NodeException(10, "ошибка с переменной / лишний знак");
                }
            }
            else
            {
                D = null; throw new NodeException(10, "нехватка данных");
            }
        }