Структура и реализация макроязыковРефераты >> Программирование и компьютеры >> Структура и реализация макроязыков
МАКРОЯЗЫК И МАКРОПРОЦЕССОР
Оператор, работающий в какой-либо системе, часто встречается с необходимостью повторять некоторые последовательности действий много раз? Такая последовательность может, например, состоять из ввода некоторой текстовой последовательности, нажатии определенной последовательности клавиш, выполнении однотипного ряда каких-либо арифметических операций. В подобных случаях часто можно воспользоваться аппаратом макрокоманд.
Макрокоманды (часто называемые макро или макрос) являются однострочными сокращениями для группы команд. Используя макрокоманду, программист по существу определяет одну “команду” для представления некоторой последовательности команд.
Определяя соответствующие макрокоманды, оператор может удобным для себя образом вводить свои собственные средства более высокого уровня, не заботясь о структуре системы. Он может достигнуть краткости и простоты управления системой, не теряя при этом основных преимуществ использования исходной системы, такой, как например язык ассемблера. Крупные макрооперации упрощают пользование, отладку и модификацию программ, и облегчают стандартизацию. Многие разработчик вычислительных машин используют макрокоманды для автоматизации составления “подходящих” операционных систем в процессе, называемом генерацией системы
МАКРОКОМАНДЫ
В своей простейшей форме макрокоманда представляет собой сокращение для обозначения последовательности операций
Рассмотрим следующий набор команд, взятый из макроязыка IDE для Borland C++ версии 3.1 (TEMC). Рассмотрим следующую программу, написанную с помощью этих операций
Пример 1
.
.
.
SetPrevPos;
FixScreenPos;
PageScreenUp;
FixCursorPos;
.
.
.
SetPrevPos;
FixScreenPos;
PageScreenUp;
FixCursorPos;
.
.
.
В приведенной программе последовательность команд
SetPrevPos;
FixScreenPos;
PageScreenUp;
FixCursorPos;
встречается дважды.
Аппарат макрокоманд позволяет присвоить этой последовательности имя и использовать это имя вместо нее. Можно также определить некоторый макроязык, позволяющий рассматривать данную конструкцию, как определение и в дальнейшем использовать это определение.
Фактически, макропроцессор представляет собой отдельный языковой процессор со своим собственным языком.
Форматы макроопределений в различных системах может отличаться друг от друга. В данном случае последовательность команд, определяющая макрокоманду имеет следующий формат
MACRO <macro name>
-----------------
-----------------
-----------------
END;
Псевдокоманда MACRO - первая строка определения - определяет следующий за ней идентификатор, как имя макрокоманды. Вслед за этой строкой располагается последовательность команд, называемых “телом макроопределения”. Определение заканчивается строкой с псевдокомандой END.
Если макрокоманда определена, то использование имени соответствующей макрокоманды в качестве мнемоники кода в программе эквивалентно использованию соответствующей последовательности команд. Если повторяющейся последовательности команд дать имя “MacPageUp”, то наш пример можно будет переписать следующим образом:
Исходный текст |
Расширение исходного текста |
MACRO MacPageUp SetPrevPos; FixScreenPos; PageScreenUp; FixCursorPos; END; . . . MacPageUp . . . MacPageUp . . . |
. . . SetPrevPos; FixScreenPos; PageScreenUp; FixCursorPos; . . . SetPrevPos; FixScreenPos; PageScreenUp; FixCursorPos; . . . |
В данном случае макропроцессор заменяет каждую макрокоманду (макровызов) строками:
SetPrevPos;
FixScreenPos;
PageScreenUp;
FixCursorPos;
Такой процесс замены называется расширением макрокоманды. Заметим, что само макроопределение не появляется в расширении исходного текста. Определение сохраняется макропроцессором. Вхождение в исходную программу имени макрокоманды как мнемоники операции называется макровызовом.
ОПЕРАТОРЫ МАКРОКОМАНД
Аппарат макрокоманд в том виде, как он был описан до сих пор, позволяет подставлять последовательности команд вместо макровызовов, причем все обращения к макроопределению будут заменены идентичными последовательностями команд. Такой аппарат недостаточно гибок: в макровызове нет средств модифицировать коды, которые его заменяют. Существенное расширение возможностей макросредств достигается добавлением операндов (параметров) макрокоманд.
Рассмотрим следующую программу:
Пример 2:
.
.
.
SetPrevPos;
MoveToMark(1);
CenterFixScreenPos;
.
.
.
SetPrevPos;
MoveToMark(2);
CenterFixScreenPos;
.
.
.
В данном случае последовательности команд очень похожи, но не абсолютно идентичны. В первой последовательности используется операнд “1”, а во втором - операнд “2”. Можно считать, что они выполняют одну и ту же операцию с переменным параметром, или операндом. Такой параметр называют “операндом макрокоманды” или “формальным параметром”, и он обычно объявляется в той же строке, где и имя макроса. В случае работы с языком макроассемблера, он обычно помечается символом &, что отличает его как символ макроязыка от символов ассемблера. В нашем случае, фирма Борланд не предусмотрела в своем макроязыке работы с макрооперандами, однако можно предположить, что если бы макроопределения в языке TEMC могли бы обрабатывать подобную ситуацию, то формат макроопределения мог бы выглядеть следующим образом:
MACRO <macro name>(<paramlist>)
-----------------