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