|
|
|
|
Макро псевдо-CASE
Последнее макро, которое мы ввели в этой главе,есть макро псевдо-case, представленное Листингом 1-17. Так как макро должно иметь "предвидение"
о поддерживаемых в нем структурах, мы не будем рассматривать его как оператор структурного управления. По своим функциям макро case более походит на
блок диспетчеризации, типа вычисляемого оператора GOTO в языке Фортран.
Листинг 1-17. Описание макро псевдо-саse
----------------------------------------------------------------
@Case MACRO кey,сase_list,jmр_labels
??tmp_1 = 0
IRP match,<&case_list> ;;последователь-
;;ность вариантов
??tmp_1= ??tmp_1 + 1 ;;установить номер
;;индекса
cmp key,&&match ;вариант найден?
??tmp_2= 0
IRP retl,<&jmp_labels> ;;последователь-
;;ность переходов
??tmp_2=0 ??tmp_2 + 1 ;; до достижения
;; индекса
IF (??tmp_1 EQ ??tmp_2)
je &&&retl ; Да!
EXITM
ENDIF ;;конец проверки условия
ENDM ;;закончить 2-ой блок IRP
ENDM ;;закончить 1-ый блок IRP
ENDM ;;закончить макроописание
---------------------------------------------------------------
|
Это макро являет собой хороший пример одновременного синтаксического анализа двух списков. Внешний цикл, irp match,<&case_list>, устанавливает
последовательность элементов списка вариантов, а внутренний цикл, irp retl,<&jmp_labels>, выбирает соответствующие метки переходов.Такое решение может
быть использовано для реализации макросов подстановки.
В макросах подстановки внешний цикл устанавливает последова тельность элементов списка и выявляет совпадение. После определения совпадения, скажем
на элементе xth, макро входит во внутренний цикл и устанавливает последовательность элемента xth этого списка. Одним из возможных вариантов реализации
может быть создание макро переход_по_невыполнению_условия, где выбранный переход должен был бы заменяться на противоположный. Еще раз напомним, что во
вложенных макроблоках необходимо использовать дополнительные амперсанды.
Расширение макро @Case представлено в Листинге 1-18. За то, чтобы в каждом списке появлялся один и тот же номер элемента, отвечает программист. В
противном случае может быть получена неверная структура управления.
Листинг 1-18. Расширение макро псевдо-@Case
----------------------------------------------------------------
@Case al,<'A','B','C','D'>,
2 cmp al,'A' ;вариант соответствует?
3 je subA ; да!
2 cmp al,'B' ;вариант соответствует?
3 je subB ; да!
2 cmp al,'C' ;вариант соответствует?
3 je subC ; да!
2 cmp al,'D' ;вариант соответствует?
3 je subD ; да!
subA:
jmp merge
subB:
jmp merge
subC:
jmp merge
subD:
jmp merge
default:
merge:
----------------------------------------------------------------
|
|
|