Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
spo_otchet_chumak.doc
Скачиваний:
5
Добавлен:
01.04.2025
Размер:
206.85 Кб
Скачать

Лабораторная работа №10 Разработка калькулятора на основе рекурсивного спуска

1)Цель работы: Добавить в программу, модифицированную в предыдущей лабораторной работе, возможность вычисления простого арифметического выражения: реализовать сложение, вычитание, умножение и целочисленное деление.

Изменим процедуры обработки арифметического выражения следующим образом:

procedure ff(var resff:integer);

begin

scan(T,n);

if (T='i') then

begin

if not ((ub-length(sl))=1) then bofl:=false;

scan1(T,n);

if ((T='r')and(n=8)) then oppr(mid);

end

else if (T='c') then

begin

resff:=num;

end

else if (T='k') then

begin

if (n=4) then {opw};

end

else if (T='l') then

begin

end

else if ((T='r')and(n=5)) then

begin

ee(resff);

scan(T,n);

if ((T='r')and(n=6)) then begin end

else err(0);

end

else err(2);

end;

procedure tt(var restt:integer);

var rt:integer;

begin

ff(rt);

scan1(T,n);

while (not((T='r') and ((n=1) or (n=2) or (n=6) or (n=7)))) do

begin

scan(T,n);

if ((T='r') and (n=3)) then

begin

ff(mid);

restt:=rt*mid;

end

else

if ((T='r') and (n=4)) then

begin

ff(mid);

restt:=rt div mid;

end

else

err(1);

scan1(T,n);

end; end;

procedure ee(var resee:integer);

var re:integer;

begin

tt(re);

While (not(((T='r') and (n=7))or((T='r') and (n=6)))) do

begin

scan(T,n);

if ((T='r') and (n=1)) then

begin

tt(mid);

resee:=re+mid;

end

else

if ((T='r') and (n=2)) then

begin

tt(mid);

resee:=re-mid;

end

else

err(1);

scan1(T,n);

end; end;

Содержимое файла: 19+(32/8)-(45*3)#

В результате сканирования исходного текста получим сообщение:

Строка правильная

158

Результат оказался верным, следовательно арифметический анализатор работает верно.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]