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

UptoLike

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

32
При генерации ПОЛИЗа выражений и оператора присваивания элементы
массива
Р записываются последовательно. Семантика условного оператора та-
кова, что значения операндов для операций безусловного перехода и перехода
«по лжи» в момент генерации еще не неизвестны. Поэтому необходимо запо-
минать номера элементов массива
Р, соответствующих этим операндам, а за-
тем, когда станут известны их значения, заполнять пропущенное.
Правила условного оператора и оператора цикла примут вид:
S if E <egbool; p1:=free; free:=free+1; put_lex(‘!F’)> then S
<p2:=free; free:=free+1; put_lex(‘!’); P[p1]:=make(free)> else S
<P[p2]:=make(free)>
S while <p0:=free> E <egbool; p1:=free; free:=free+1; put_lex(‘!F’)>
do S
<P[free]:=make(p0); put_lex(‘!’); P[p1]:=make(free) >
Правила операторов ввода и вывода с учетом действий записи в ПОЛИЗ
будут преобразованы следующим образом:
S write (E <put_lex(‘W’)>) | read (I <checkid; put_l5; put_lex(‘R’)> )
Чтобы в конце ПОЛИЗа была точка, правило Р переписывается в виде:
Pprogram D1 B <put_lex(‘.’)>.
Таким образом, польская инверсная запись очищена от всех служебных
слов, кроме
true и false; от ограничителей остаются только знаки операций и
знаки «:=», «.».
2.7 Интерпретатор программы
Запись программы в форме ПОЛИЗа удобна для последующей интерпре-
тации (выполнения программы) с помощью стека. Массив ПОЛИЗа просматри-
вается один раз слева направо, при этом:
1) если очередной элемент ПОЛИЗа является операндом, то его значение
заносят в стек;
2) если очередной элементоперация, то на «верхушке» стека находятся
ее операнды, которые извлекаются из стека, над ними выполняется соответст-
вующая операция, результат которой заносится в стек;
3) интерпретация продолжается до тех пор, пока не будет считана из
ПОЛИЗа точка, стек при этом должен быть пуст.
Пример 2.18. Интерпретировать ПОЛИЗ программы, заданный таблицей
2.5 при введенном значении
а, равном 7.
Таблица 2.5 – ПОЛИЗ исходной программы
Лексема a r a
5 > 17 !F
b a
3 +
(n, k) (5,1) (2,20) (4,1) (3,1) (2,16) (0,17) (2,19) (5,1) (4,1) (3,2) (2,8)
Номер 1 2 3 4 5 6 7 8 9 10 11
      При генерации ПОЛИЗа выражений и оператора присваивания элементы
массива Р записываются последовательно. Семантика условного оператора та-
кова, что значения операндов для операций безусловного перехода и перехода
«по лжи» в момент генерации еще не неизвестны. Поэтому необходимо запо-
минать номера элементов массива Р, соответствующих этим операндам, а за-
тем, когда станут известны их значения, заполнять пропущенное.
      Правила условного оператора и оператора цикла примут вид:
           S→ if E  then S
            else S
           
           S→ while  E 
           do S 
     Правила операторов ввода и вывода с учетом действий записи в ПОЛИЗ
будут преобразованы следующим образом:
           S→ write (E ) | read (I  )
     Чтобы в конце ПОЛИЗа была точка, правило Р переписывается в виде:
           P→program D1 B .
      Таким образом, польская инверсная запись очищена от всех служебных
слов, кроме true и false; от ограничителей остаются только знаки операций и
знаки «:=», «.».

     2.7 Интерпретатор программы

      Запись программы в форме ПОЛИЗа удобна для последующей интерпре-
тации (выполнения программы) с помощью стека. Массив ПОЛИЗа просматри-
вается один раз слева направо, при этом:
      1) если очередной элемент ПОЛИЗа является операндом, то его значение
заносят в стек;
      2) если очередной элемент – операция, то на «верхушке» стека находятся
ее операнды, которые извлекаются из стека, над ними выполняется соответст-
вующая операция, результат которой заносится в стек;
      3) интерпретация продолжается до тех пор, пока не будет считана из
ПОЛИЗа точка, стек при этом должен быть пуст.
      Пример 2.18. Интерпретировать ПОЛИЗ программы, заданный таблицей
2.5 при введенном значении а, равном 7.
    Таблица 2.5 – ПОЛИЗ исходной программы
    Лексема a         r     a     5     >      17     !F     b     a     3     +
      (n, k) (5,1) (2,20) (4,1) (3,1) (2,16) (0,17) (2,19) (5,1) (4,1) (3,2) (2,8)
   Номер       1     2      3     4     5      6       7     8     9    10    11


                                                                                 32