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, "нехватка данных"); } }
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, "нехватка данных"); } }