Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО лекции.docx
Скачиваний:
32
Добавлен:
01.08.2019
Размер:
92.68 Кб
Скачать

Возможности макроязыков

Определяются ограничениями, которые накладываются на грамматические конструкции. К простейшим макроязыкам относятся а)ограничения: на опережающее использование макроса или б) отсутствие ограничения на опережающее описание макроса

А)M1 MACRO

...

MEND

...

M1

Б) M1

...

M1_MACRO

...

MEND

К усложненным макроязыкам:

А) макроопределение может содержать обращение к другим макросам

M1_MACRO

..

MEND

...

M2_MACRO

...

M1

...

MEND

...

M2

Б) использование вложенных макроопределений

M1_MACRO

...

M2_MACRO

...

MEND

..

MEND

..

M1

..

M2

Особенности использования вложенных макроопределений: при обращении к внутреннему макросу сначала нужно обратиться к внешнему.

Реализация простейшего макропроцессора

Простейший макропроцессор будет распознавать простейший макроязык(опережающее описание макроса и отсутствие вложенных макроопределений и макровызовов).

Для реализации нужно: 2 структуры – таблица макроопределений (ТМО), куда будем заносить тело макроса без изменений и таблица имен макроса(ТИМ), содержащая имена макроса и указатели на начало и конец этого макроса в ТМО.

Рис1

Алгоритм работы простейшего макропроцессора

Организуем цикл по обработке строк исходного текста программы, каждая строка обрабатывается следующим образом:

  1. если в строке встретилась инструкция базового языка(Ассемблера), то она переносится в выходной файл без изменений.

  2. если встретилась директива MACRO, то в таблицу ТИМ заносится имя макроса, а ТМО переносим тело макроса без изменений и устанавливаем указатель на начало и конец этого макроса в ТМО.

  3. если встретилось обращение к макросу, то осуществляем поиск в ТИМ: если поиск неудачен т о ошибка, если поиск удачен, то осуществляем процесс макроподстановки – команды заменяется на тело-содержимое макроса, которое берем из ТМО.

M1_MACRO

ADD R1, R2

MOV R1, R3

MEND

...

M1

M1

...

ADD R1, R2

MOV R1, R3

... ADD R1, R2

MOV R1, R3

...

Если опережающее описание макроса отсутствует

Алгоритм работы макропроцессора:

???

Особенности однопросмотровой схемы: ТИМ можно сделать усложненной структурой(например добавить столбец , в который записывать указатель на вспомогательный список).

Обработка вложенных макросов

1M1_MACRO

2 MOV R1, 0

3 MOV R2, 1

4M2_MACRO

5 MOV R1, 2

6 MOV R2, 3

7 ADD R1, R2

8 MEND

9 ADD R2, R1

10 MEND

ВИ

Адрес

Имя1

РАВИ(реальный адрес внешнего имени)

Необходимо для реализации макропроцессора: булевская переменная Regim=принимает TRUE, если макропроцессор в режиме макрогенерации и false если в режиме макроопределения, переменная level ???

Vvod Str – выбирает(получает) очередную строку либо из файла, либо из ТМО

ObrabStr – в полученной строке анализируем мнемокод операции и переключаем режим работы макропроцессора

ObrabMacro – будет выполнять формирование строк в ТИМ и в ТМО

MacroGen – реализуем работы макропроцессора в режиме макрогенерации

begin

Regim:=false

while МКОП<>END do

begin

VvodStr;

ObrabStr;

end;

end.

procedure VvodStr;

begin

if Regim then

выбрать строку из ТМО и подставить параметры;

else выбрать строку из входного файла;

end;

procedure ObrabStr;

begin

поиск мнемокод операции(МКОП) в ТИМ;

if нашли then

MACROGEN

if МКОП=MACRO then ObrabMacro

else запистаь строку в выходной файл

9.04

Лекция №9

код1

procedure ObrabMacro;

begin

Level:=1;

while level>0 do

begin

VvodStr;

if МКОП=VACRO then level:=level+1

else if МКОП = MEND then level-1

end;

//зааносим в ТИМ указатель н конец и начало макроса

Заносим в таблицу ТИМ заголовок макроса

макрогенерация

prosedure MacroGen;

begin

Regim:=true;

while " пока не конец макроса" do

begin

VvodStr;

ObrabStr;

end;

Regim:=false

end;

ДЗ МОДИФИЦИРОВАТЬ ЭТОТ ПРОГРАММНЫЙ КОД ДЛЯ ТОГО ЧТОБЫ МОЖНО БЫЛО ИСПОЛЬЗОВАТЬ МАКРОКОМАНДЫ ВНУТРИ МАКРОСА

ДЗ Использование макрокоманд внутри макроса

Изменяется только ObrabStr

Procedure ObrabStr;

If Regim = false then

Begin

«поиск МКОП в ТИМ»

If «поиск удачен» then MacroGen;

If МКОП = MACRO then ObrabMacro;

Else «записать строку в исходный файл»

End;

Else

Begin

«поиск МКОП в ТИМ»

If «поиск неудачен» then «ошибка»;

If «поиск удачен» then «запоминаем строку возврата и список фактических параметров этого макроса»;

.\\проверить макрос на зацикливание

MacroGen;

\\ вернуть сохраненный адрес и параметры возврата

Else «записать строку в исходный файл без изменений»

End;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]