Листинг 4.30. Метод разбора операций отношения
void PFormula(ref string s, out Node D)
{
s = s.Trim();
if (s.Length != 0)
{
Expression(ref s, out D);
if (error != 0) return;
s = s.Trim();
Operation chRelation = SetChRelation(s);
if (chRelation != Operation.NONE)
{
switch (chRelation)
{
case Operation.LESS:
case Operation.MORE:
Pop(ref s, 1); break;
10 / 23
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
128
Pop(ref s, 1);
}
else // NOT |
функция | переменная
{
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 ((nfok = st == nameFunc[++nf];
if (ok)
{
if ((s.Length == 1)||(s[0] != '('))
{//
нет скобки "("
error = 8; return;
}
s = s.Trim();
st = ""; k = 1; int i = 0;
while ((i < s.Length) && (k != 0))
{
st += s[++i];
switch (s[i])
{
case '(': ++k; break;
case ')': --k; break;
}
}
13 / 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
130
Do'stlaringiz bilan baham: |