111
SetConst(ref s, out xt, out k, out t);
if (error != 0) return;
if (t == TypeVal.tFloat)
D = new NodeConst(t, xt);
else
D = new NodeConst(t, k);
}
else
if (s[0] == '(') //
формула в скобках
{
Pop(ref s, 1);
Expression(ref s, out D);
if (error != 0) return;
s
=
s.Trim();
if ((s.Length > 0) & (s[0] != ')'))
{ error = 9; return; }//
нет )
Pop(ref s, 1);
}
}
else
{
D = null; error = 6; //
ожидается множитель
}
}
Метод
Factor() замыкает рекурсию,
вызывая метод Expression().
На рисунке 4.14 представлена диаграмма этого метода.
19 / 23
112
Рис. 4.14. Диаграмма метода Factor()
Синтаксическая диаграмма числовой константы
представлена на ри-
сунке 4.15.
Рис. 4.15. Синтаксическая диаграмма числовой константы
Метод разбора константы представлен в листинге 4.25.
Листинг 4.25. Разбор константы
void SetConst(ref string s, out
double x, out int k,
out TypeVal t)
{
s = s.Trim(); x = 0; k = 0;
t = TypeVal.tInt; string st = ""; x = 0;
while(true)
{
if ((s != "") && Test(s[0], '0', '1', '2',
'3', '4', '5', '6', '7', '8', '9', ','))
{
if (s[0] == ',') t = TypeVal.tFloat;
st += Pop(ref s, 1);
}
else
if ((s!="")&& Test(s[0], 'e', 'E') &&
20 / 23
113
Test(s[1],
'0','1','2','3','4','5','6','7','8','9',
',', '+','-'))
{
st += s[0];
st += Pop(ref s, 1);
}
else
break;
} // end while(true)
if (t == TypeVal.tInt)
k = Convert.ToInt32(st);
else
x = Convert.ToDouble(st);
s = s.Trim();
}
Для запуска механизма вычисления выражения надо обратиться к свой-
ству
Value корня дерева, который с помощью метода
DoOperation() оп-
росит всех своих потомков и вычислит у всех значения
Value.
Do'stlaringiz bilan baham: