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


Макроопределения внутри макроопределений


Честно говоря, необходимость в таких средствах сомнительна. Она может возникнуть при создании большого макроопределения, в котором есть повторяющиеся фрагменты. Вложенное макроопределение действительно только внутри того макроопределения, в которое оно вложено.

Против такого средства можно привести 2 соображения:

  1. макроопределение не бывает слишком большим - иначе не срабатывают его преимущества над подпрограммой (следует однако признать, что могут существовать довольно большие макроопределения, которые генерируют разнообразные варианты небольших макрорасширений);
  2. в языке Pascal допускаются вложенные процедуры, а в языке C - нет; и C прекрасно обходится без них, да и современная практика программирования на Pascal их практически не использует.

Тем не менее, если вложенные макроопределения все же необходимы, можно предложить следующий вариант их реализации:

  • 1-й проход Макропроцессора работает почти по тому же алгоритму, который приведен нами. Принципиально важно, однако, что Таблица макроопределений и Таблица имен макроопределений имеют последовательную структуру, элементы в них записываются в порядке их поступления.
  • В Макропроцессоре есть некоторая целая переменная - глубина вложенности. Ее исходное значение - 0, при каждом появлении оператора MACRO это значение увеличивается на 1, при каждом появлении оператора MEND - уменьшается на 1.
  • Если при глубине вложенности 0 появляется оператор MACRO, в Таблицу имен макроопределений заносится новый элемент, и текст макроопределения записывается в Таблицу макроопределений - до тех пор, пока глубина вложенности не станет равной 0.
  • Появление оператора MACRO при глубине вложенности, большей 0 не приводит к созданию нового элемента в Таблице имен макроопределений.
  • Таким образом, в Таблице имен макроопределений имеется строка только для самого внешнего макроопределения, а все вложенные пока "не видны" и находятся внутри текста внешнего в Таблице макроопределений.
  • 2-й проход Макропроцессора при обработке макровызова считывает текст макроопределения в некоторый буфер и прежде всего рекурсивно вызывает для его обработки Макропроцессор.
  • Для вложенного вызова Макропроцессора доступны Таблица макроопределений и Таблица имен макроопределений, новые макроопределения, обнаруженные рекурсивным вызовом заносятся в конец этих таблиц.
  • При возврате из рекурсивного вызова макроопределения, дописанные им, удаляются из таблиц.



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