Разработка компиляторов. Ишакова Е.Н. - 34 стр.

UptoLike

Составители: 

34
Таблицы
переменных
Стек
Те
кущий
элемент
ПОЛИЗа
Операция
адреса значения
пуст 15 меткав стек
1) a
2) b
1) 7
2) 10
19 16
переход к элементу ПОЛИЗ с номе-
ром, извлекаемым из верхушки стека
1) a
2) b
1) 7
2) 10
пуст 19 интерпретация завершена
1) a
2) b
1) 7
2) 10
Пример 2.19. Построим интерпретатор ПОЛИЗа для языка М.
Введем следующие обозначения процедур и функций:
1)
addr(1) – функция, выдающая адрес ячейки, отведенной для хранения
лексемы
l;
2)
cont(А) – функция, выдающая содержимое ячейки с адресом А;
3)
let(А, х) – процедура записи в ячейку с адресом А значения х;
4)
inst(x) – процедура записи в стек значения х;
5)
outst(x) – процедура считывания из стека значения х.
Тело интерпретатора ПОЛИЗа будет иметь следующий вид:
free:=1; {на начало P}
repeat
LEX
:=P[free]; {очередная лексема}
n
:=LEX[1]; k:=LEX[2];
case n of
0: inst(k); {метка - в стек}
5: inst(addr(LEX)); {адрес - в стек}
1,3,4: inst(cont(addr(LEX))); {значение - в стек}
2: {знак операции}
case k of
8{+}: begin outst(у); outst(x); inst(x+y) end;
9{-}: begin outst(у); outst(x); inst(x-y) end;
{аналогично для *, / и других операций}
14{¬}: begin outst(x); inst(not x) end;
5{:=} begin outst(x); outst(А); let(А, х) end;
18{!}: begin outst(free); free:=free-1 end;
19{!F}: begin
outst
(free1); outst(B);
if B
=false then free:=free1-1;
end
;
20{R}: begin outst(A); read(x); let(А, х) end;
21{W}: begin outst(x); write(x) end
end
             Те                                                   Таблицы
         кущий                                                   переменных
   Стек                                   Операция
        элемент
                                                               адреса значения
        ПОЛИЗа
                                                                1) a   1) 7
пуст           15                    метка – в стек
                                                                2) b   2) 10
                         переход к элементу ПОЛИЗ с номе-       1) a   1) 7
 19            16
                        ром, извлекаемым из верхушки стека      2) b   2) 10
                                                                1) a   1) 7
пуст           19             интерпретация завершена
                                                                2) b   2) 10
   Пример 2.19. Построим интерпретатор ПОЛИЗа для языка М.
   Введем следующие обозначения процедур и функций:
   1) addr(1) – функция, выдающая адрес ячейки, отведенной для хранения
   лексемы l;
   2) cont(А) – функция, выдающая содержимое ячейки с адресом А;
   3) let(А, х) – процедура записи в ячейку с адресом А значения х;
   4) inst(x) – процедура записи в стек значения х;
   5) outst(x) – процедура считывания из стека значения х.
   Тело интерпретатора ПОЛИЗа будет иметь следующий вид:
 free:=1; {на начало P}
repeat
    LEX:=P[free]; {очередная лексема}
    n:=LEX[1]; k:=LEX[2];
    case n of
       0: inst(k); {метка - в стек}
       5: inst(addr(LEX)); {адрес - в стек}
       1,3,4: inst(cont(addr(LEX))); {значение - в стек}
       2: {знак операции}
           case k of
              8{+}: begin outst(у); outst(x); inst(x+y) end;
              9{-}: begin outst(у); outst(x); inst(x-y) end;
              …{аналогично для *, / и других операций}
              14{¬}: begin outst(x); inst(not x) end;
              5{:=} begin outst(x); outst(А); let(А, х) end;
              18{!}: begin outst(free); free:=free-1 end;
              19{!F}: begin
                         outst(free1); outst(B);
                         if B=false then free:=free1-1;
                      end;
              20{R}: begin outst(A); read(x); let(А, х) end;
              21{W}: begin outst(x); write(x) end
           end
                                                                          34