Реферат: Структура и реализация макроязыков
}
}
переход к компиляции
конец алгоритма
ОДНОПРОСМОТРОВЫЙ АЛГОРИТМ
Предположим, что мы допускаем реализацию макроопределения внутри макроопределений. Основная проблема здесь заключена в том, что внутреннее макро определено только после того, как выполнен вызов внешнего. Для обеспечения использования внутреннего макро нам придется повторять как просмотр обработки макроопределений, так и просмотр обработки макрокоманд. Однако существует и еще одно решение, которое позволяет произвести распознавание и расширение в один просмотр.
Рассмотрим аналогию с ассемблером. Макроопределение должно обрабатываться до обработки макрокоманд, поскольку макро должны быть определены для процессора раньше, чем макрокоманды обращения к ним. Однако, если мы наложим ограничение, что каждое макроопределение должно быть определено до того, как произойдет обращение к нему, мы устраним основное препятствие для однопросмотровой обработки. Заметим, что то же самое может быть верно и для символических имен в ассемблере, но такое требование было бы неоправданным ограничением для программиста. В случае же макрорасширения может быть вполне естественно потребовать, чтобы объявления макро предшествовали вызовам. Это не накладывает очень существенных ограничений на использование аппарата макрокоманд. Этот механизм даже не запрещает обращение макро к самому себе, поскольку обращение ведется в тот момент, когда имя макроса уже определено. Расширение же макроса идет не в процессе разбора макроса, а в процессе последующего вызова.
Предложенный ниже алгоритм объединяет два вышеприведенных алгоритма для двупросмотрового макроассемблера в один.
АЛГОРИТМ
Однопросмотровый макроассемблер
Начало алгоритма
МТДС = 0
МНТС = 0
ФЛАГ ВЫХОДА = 0
цикл пока !(ФЛАГ ВЫХОДА) {
чтение следующей строки ВХТ
НАЙДЕНО = поиск кода в МНТ
если (НАЙДЕНО) {
МДИ = 1
УКАЗАТЕЛЬ = индекс из МНТ
Заполнение списка параметров АЛА
цикл {
УКАЗАТЕЛЬ ++
чтение след. строки из МДТ
подстановка параметров
вставка во ВХТ
} пока !(операция MEND)
иначе если !(операция MACRO) {
вывод строки в ВЫХТ1