
- •«Системное программное обеспечение»
- •Лабораторная работа №1 Формирование очередей в динамической памяти
- •Лабораторная работа №2 Программирование конечного автомата
- •Лабораторная работа №3 Программирование конечного автомата для транслитерации
- •2) Исходный текст программы:
- •3) Результат:
- •Лабораторная работа №4 Программирование конечного автомата
- •2) Исходный текст программы:
- •Лабораторная работа №5 Программирование лексического анализатора
- •Лабораторная работа №6 Лексический анализатор. Процедура, которая не смещает указатель входного потока
- •Лабораторная работа №7 Рекурсивный спуск
- •2) Исходный текст программы:
- •Лабораторная работа №8 Синтаксический анализатор логического выражения.
- •2) Исходный текст программы:
- •Лабораторная работа №9 Синтаксический анализ для оператора присваивания
- •2) Исходный текст программы:
- •Лабораторная работа №10 Разработка калькулятора на основе рекурсивного спуска
- •Лабораторная работа №11 Генерация кода на ассемблере для арифметического выражения
Лабораторная работа №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
Результат оказался верным, следовательно арифметический анализатор работает верно.