double arrow

Обработка описаний

Задача обработки описаний - проверить, все ли переменные программы описаны правильно и только один раз. Эта задача решается следующим образом.

Таблица идентификаторов, введенная на этапе лексического анализа, расширяется, приобретая вид таблицы 4.1. Описание таблицы идентификаторов будет иметь вид:

type ---

tabid = record

id: string;

descrid: byte;

typid: string [4];

addrid: word

end;

var

TI: array [1.. n] of tabid;

Таблица 4.1 – Таблица идентификаторов на этапе СеА

Номер Идентификатор Описан Тип Адрес
  K   Int
  Sum  

Поле «описан» таблицы на этапе лексического анализа заполняется нулем, а при правильном описании переменных на этапе семантического анализа заменяется единицей.

При выполнении процедуры D вводится стековая переменная-массив, в которую заносится контрольное число 0. По мере успешного выполнения процедуры I в стек заносятся номера считываемых из файла лексем, под которыми они записаны в таблице идентификаторов. Как только при считывании лексем встречается лексема «:», из стека извлекаются записанные номера и по ним в таблице идентификаторов проставляется 1 в поле «описан» (к этому моменту там должен быть 0). Если очередная лексема будет «int» или «bool», то попутно в таблице идентификаторов поле «тип» заполняется соответствующим типом.

Пример Пусть фрагмент описания на модельном языке имеет вид: var k, sum: int … Тогда соответствующий фрагмент файла лексем: (1, 2) (4, 1) (2, 3) (4, 2)…Содержимое стека при выполнении процедуры D представлено на рисунке 2.7.

 
 


Рисунок 4.5 – Содержимое стека при выполнении процедуры 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);

while l <>0 do

begin

decid (l, t);

outst (l)

end

end;

Правило и процедура D с учетом семантических проверок принимают вид:

D ® < inst (0)> I <instl > {, I < instl > }: (int < deс (‘ int ’)> | bool < dec (‘ bool ’)>)

procedure D;

begin

inst (0);

I;

instl;

while EQ (‘,’) do

begin

gl; I; instl

end;

if EQ (‘:’) then gl else ERR;

if EQ (‘ int ’) then

begin

gl; dec (‘ int ’)

end

else

if EQ (‘ bool ’)

then

begin

gl; dec (‘ bool ’)

end

else ERR

end;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: