126
case Operation.EQUALLY:
case Operation.NOTEQUALLY:
case Operation.LESSEQUALLY:
case Operation.MOREEQUALLY:
Pop(ref s, 2);
break;
}
Node D2;
Expression(ref s, out D2);
if (error != 0) return;
Node D1 = D;
D = new NodeOperation(chRelation, D1, D2);
}
}
else
{
D = null; error = 3;
}
}
Существенно изменился
метод для разбора множителей, синтаксиче-
ская диаграмма которого представлена на рисунке 4.21.
Рис. 4.21. Синтаксическая диаграмма для множителей
В метод
Factor
() добавлен разбор функций и переменных:
11 / 23
127
Листинг 4.31. Метод разбора операций отношения
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) //
const
{
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);
if (error != 0) return;
s = s.Trim();
if ((s.Length > 0) && (s[0] != ')'))
{ error = 9; return; }//
нет )
12 / 23
129
st = st.Substring(0, st.Length - 1);
s = s.Substring(i, s.Length-i-1);
Node Da;
PFormula(ref st, out Da);
if (error != 0) return;
D = new NodeFunc(nf, Da);
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;
}
error = 7; //
неизвестная переменная
}
}
else
{
D = null; error = 6; //
ожидается множитель
}
}
Вычисление переменных на втором этапе
решения реализуется с по-
мощью метода
Run_Formula() класса
Operator:
14 / 23