Системное программирование. Конспект лекций


Алгоритм обработки макровызова следующий


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



  • Содержание раздела