|
Обработка макровызова. На входе этого модуля есть номер элемента в Таблице имен макроопределений и разобранный текст оператора макровызова. Создание пустых: Таблицы локальных переменных, Таблицы меток. Чтение первой строки из Таблицы макроопределений по адресу, записанному в элементе Таблице имен макроопределений. (Здесь и далее мы подразумеваем, что после чтения очередной строки макроопределения указатель для следующего чтения устанавливается на адрес следующей строки, если он не изменен явным образом.) Проверка параметров: сопоставление фактических параметров вызова с формальными параметрами, описанными в заголовке макроопределения (Заголовок находится в строке, только что считанной из Таблицы макроопределений). При несоответствии фактических параметров формальным выдается сообщение об ошибке... ... и обработка макровызова завершается При правильном задании фактических параметров параметры и их значения заносятся в Таблицу локальных переменных. Создается и заполняется Таблица меток макроопределения. При этом текст макроопределения просматривается до оператора MEND, выявляются метки и заносятся в таблицу. Проверяется уникальность меток. После заполнения таблицы меток указатель чтения из Таблицы макроопределений устанавливается на вторую (следующую за заголовком строку) текста макроопределения. Читается следующая строка текста макроопределения. Если строка является комментарием Ассемблера, строка выводится в макрорасширение. Если строка является комментарием Макроязыка, управление передается на чтение следующей строки макроопределения. Выполняется разбор строки. Алгоритм ветвится в зависимости от мнемоники оператора. При обработке оператора LOCL имя локальной переменной ищется сначала в Таблице локальных переменных... ... а затем - в Таблице глобальных переменных. Если имя найдено в одной из таблиц, формируется сообщение о неуникальном имени. В противном случае заносится новая строка в таблицу локальных имен. В любом случае управление передается на чтение следующей строки макроопределения. Обработка оператора GLBL отличается от оператора LOCL только тем, что новая строка создается в Таблице глобальных переменных. При обработке оператора LOCL вычисляется выражение - операнд команды. Вычисление включает в себя подстановку значений входящих в выражение переменных. Возможны ошибки - из-за использования неопределенных имен и ошибок в синтаксисе выражения. Имя переменной ищется сначала в Таблице локальных переменных. Если имя найдено, изменяется его значение в Таблице локальных переменных. Если имя переменной не найдено, оно ищется в Таблице глобальных переменных. Если имя найдено в Таблице глобальных переменных, изменяется его значение в этой таблице. Если имя не найдено ни в одной из таблиц, формируется сообщение о неопределенном имени. При обработке оператора MIF вычисляется условное выражение - 1-й операнд команды (возможны ошибки). Проверяется значение вычисленного условного выражения. Если значение выражения "истина", имя метки - 2-го операнда команды ищется в Таблице меток макроопределения. Если метка найдена в таблице, указатель для следующего чтения из Таблице макроопределений устанавливается на адрес соответствующий метке Если метка найдена в таблице, выдается сообщение о неопределенной метке. При обработке оператора MGO имя метки - операнда команды ищется в Таблице меток макроопределения. Если метка найдена в таблице, указатель для следующего чтения из Таблице макроопределений устанавливается на адрес соответствующий метке. Если метка найдена в таблице, выдается сообщение о неопределенной метке. При обработке оператора MNOTE выводится сообщение, определяемое операндом. Устанавливается и анализируется код серьезности. Код серьезности является общим для всей работы Макропроцессора, его значение изменяется только, если новое значение больше текущего (более серьезная ошибка) Если код серьезности не допускает продолжения работы Макропроцессора, устанавливается признак завершения работы. При обработке оператора MEXIT устанавливается и анализируется код серьезности. Если код серьезности не допускает продолжения работы Макропроцессора, устанавливается признак завершения работы. Освобождаются структуры данных, созданные для обработки макровызова... ...и обработка макровызова завершается. При обработке оператора MEND освобождаются структуры данных, созданные для обработки макровызова... ...и обработка макровызова завершается. Любая другая мнемоника операции означает, что оператор является не оператором Макроязыка, а оператором языка Ассемблера. В этом случае прежде всего проверяется, не имеет ли оператор метки, которая должна быть уникальной. Если оператор имеет такую метку, формируется имя уникальной метки и индекс уникальных меток увеличивается на 1. Выполняются подстановки в операторе языка Ассемблера (значение имен ищутся в Таблицах локальных и глобальных переменных, возможны ошибки). Оператор языка Ассемблера записывается в макрорасширение.
| |