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

UptoLike

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

25
При выполнении процедуры D вводится стековая переменная-массив, в
которую заносится контрольное число 0. По мере успешного выполнения про-
цедуры I в стек заносятся номера считываемых из файла лексем, под которыми
они записаны в таблице идентификаторов. Как только при считывании лексем
встречается лексема «:», из стека извлекаются записанные номера и по ним в
таблице идентификаторов проставляется 1 в поле «описан» (к этому моменту
там должен быть 0). Если очередная лексема будет «int» или «bool», то попутно
в таблице идентификаторов поле «тип» заполняется соответствующим типом.
Пример 2.11. Пусть фрагмент описания на модельном языке имеет вид:
var k, sum: intТогда соответствующий фрагмент файла лексем: (1, 2) (4, 1)
(2, 3) (4, 2)…Содержимое стека при выполнении процедуры D представлено на
рисунке 2.7.
Рисунок 2.7 – Содержимое стека при выполнении процедуры D
Для реализации обработки описаний введем следующие обозначения пе-
ременных и процедур:
1) LEXпеременная, хранящая значение очередной лексемы,
представляющая собой одномерный массив размером 2, т.е. для лексемы (n, k)
LEX[1]=n, LEX[2]=k;
2) gl процедура считывания очередной лексемы в переменную LEX;
3) inst(l) - процедура записи в стек числа l;
4) outst(l) – процедура вывод из стека числа l;
5) instlпроцедура записи в стек номера, под которым лексема хранится в
таблице идентификаторов, т.е. inst(LEX[2]);
6) dec(t) - процедура вывода всех чисел из стека и вызова процедуры
decid(1, t);
7) decid(l, t) – процедура проверки и заполнения поля «описан» и «тип»
таблицы идентификаторов для лексемы с номером l и типа t.
Процедуры dec и decid имеют вид:
procedure decid (l:..; t:...);
begin
if TI[l].descrid =1 then ERR
else begin
TI[l].descrid: = 1;
TI[l].typid:= t
end
end;
procedure dec(t: ...);
begin
outst(l);
0 1
2
       При выполнении процедуры D вводится стековая переменная-массив, в
которую заносится контрольное число 0. По мере успешного выполнения про-
цедуры I в стек заносятся номера считываемых из файла лексем, под которыми
они записаны в таблице идентификаторов. Как только при считывании лексем
встречается лексема «:», из стека извлекаются записанные номера и по ним в
таблице идентификаторов проставляется 1 в поле «описан» (к этому моменту
там должен быть 0). Если очередная лексема будет «int» или «bool», то попутно
в таблице идентификаторов поле «тип» заполняется соответствующим типом.
       Пример 2.11. Пусть фрагмент описания на модельном языке имеет вид:
var k, sum: int … Тогда соответствующий фрагмент файла лексем: (1, 2) (4, 1)
(2, 3) (4, 2)…Содержимое стека при выполнении процедуры D представлено на
рисунке 2.7.

       0    1    2


     Рисунок 2.7 – Содержимое стека при выполнении процедуры D
      Для реализации обработки описаний введем следующие обозначения пе-
ременных и процедур:
      1) LEX – переменная, хранящая значение очередной лексемы,
представляющая собой одномерный массив размером 2, т.е. для лексемы (n, k)
LEX[1]=n, LEX[2]=k;
      2) gl – процедура считывания очередной лексемы в переменную LEX;
      3) inst(l) - процедура записи в стек числа l;
      4) outst(l) – процедура вывод из стека числа l;
      5) instl – процедура записи в стек номера, под которым лексема хранится в
таблице идентификаторов, т.е. inst(LEX[2]);
      6) dec(t) - процедура вывода всех чисел из стека и вызова процедуры
decid(1, t);
      7) decid(l, t) – процедура проверки и заполнения поля «описан» и «тип»
таблицы идентификаторов для лексемы с номером l и типа t.
      Процедуры dec и decid имеют вид:
     procedure decid (l:..; t:...);
     begin
        if TI[l].descrid =1 then ERR
        else begin
                  TI[l].descrid: = 1;
                  TI[l].typid:= t
              end
     end;
     procedure dec(t: ...);
     begin
        outst(l);

                                                                             25