Cтраница 2
Позиционные операнды последовательно переносятся в таблицу позиционных операндов ( блок 6) в те же позиции, в которых при обработке макроопределения помещались соответствующие параметры. [16]
Если заданное здесь арифметическое выражение принимает значение i ( Ijgisgrt, где п - число операндов в макрокоманде), то указанная запись при обработке макроопределения заменяется на i - й операнд обрабатываемой макрокоманды. [17]
Макрокоманда используется для вызова макроопределения. Результат обработки макроопределения ассемблером существенно зависит от операндов макрокоманды, так как значения операндов макрокоманды замещают используемые в макроопределении символические параметры. Размещение и порядок операндов в макрокоманде определяются размещением и порядком символических параметров в поле операндов оператора прототипа. В связи с этим различаются позиционные, ключевые и смешанные макрокоманды. [18]
При обработке макроопределений в момент генерации макрорасширения может появиться необходимость в печати некоторых сообщений. [19]
Две первые таблицы нужны только в процессе обработки макроопределения. В трех последних таблицах фиксируется результат работы блока обработки макроопределений. Эти таблицы используются затем блоком обработки макрокоманд. [20]
Предположим, что мы допускаем реализацию макроопределения внутри макроопределений. Основная проблема здесь состоит в том, что внутреннее макро определено только после того, как выполнен вызов внешнего. Для обеспечения использования внутреннего макро нам придется повторить как просмотр обработки макроопределений, так и просмотр обработки макрокоманд. Однако существует более простое решение, которое обладает дополнительным преимуществом, а именно обеспечивает выполнение всей работы макропроцессора за один просмотр. [21]
Встретив макро-команду в обрабатываемой программе, генератор обращается к соответствующему макроопределению, в котором запрограммирована процедура формирования макрорасширения. В этой процедуре, как правило, используются и средства условной генерации. Выполнив предписанные действия и попав на оператор MEND, макрогенератор завершает обработку макроопределения. [22]
Имя PROGRAM относится к самой внешней процедуре программы, которая должна быть запущена, например MACRO или ARCHIVE. Поле PROGRAM фактически заполняется интерпретатором команды, однако детали здесь вряд ли уместны. С помощью оператора INCLUDET осуществляется подключение файла, как описано в гл. DEFINE служит для обработки макроопределения, как описано в гл. Процедура MESSAGE аналогична WRITELN, за исключением того, что результат ее выполнения гарантированно выводится на терминал получателя, так что она в точности представляет собой упомянутый примитив MESSAGE. Примитив HALT служит для корректного завершения процесса. [23]
По тем же причинам, по которым в ассемблере приходится применять двухпросмотровую схему трансляции, для замены внутренних имен требуется дважды просмотреть тело каждого макроопределения. Во время первого просмотра выявляются все внутренние имена и определяются их адреса относительно начала тела макроопределения. При втором просмотре внутренние имена в операндах заменяются относительными выражениями. Из поля названия внутренние имена удаляются. Эту работу для каждого макроопределения нужно выполнить только один раз, в то время как замену параметров значениями операндов макрокоманды приходится повторять вновь для каждого вхождения макрокоманды. В связи с этим в макрогенераторе обработку макроопределений и обработку макрокоманд выполняют два различных блока. [24]