Лекции по построению компилятора на Pascal

ОПЕРАТОР DO


Из-за всего этого мне захотелось иметь более простую версию цикла FOR. Причина появления всего этого кода выше состоит в необходимости иметь счетчик цикла, доступный как переменная внутри цикла. Если все, что нам нужно это считающий цикл, позволяющий нам выполнить что-то определенное число раз, но не нужен непосредственный доступ к счетчику, имеется более простое решение. Процессор 68000 имеет встроенную команду "уменьшить и переход если не ноль", которая является идеальной для подсчета. Для полноты давайте добавим и эту конструкцию. Это будет наш последний цикл.

Синтаксис и его перевод:

DO

     <expr>         { Emit(SUBQ #1,D0);

                      L = NewLabel;

                      PostLabel(L);

                      Emit(MOVE D0,-(SP) }

     <block>

     ENDDO          { Emit(MOVE (SP)+,D0;

                      Emit(DBRA D0,L) }

Это гораздо проще! Цикл будет выполняться <expr> раз. Вот код:

{--------------------------------------------------------------}

{ Parse and Translate a DO Statement }



procedure Dodo;

var L: string;

begin

   Match('d');

   L := NewLabel;

   Expression;

   EmitLn('SUBQ #1,D0');

   PostLabel(L);

   EmitLn('MOVE D0,-(SP)');

   Block;

   EmitLn('MOVE (SP)+,D0');

   EmitLn('DBRA D0,' + L);

end;

{--------------------------------------------------------------}

Я думаю вы согласитесь, что это гораздо проще, чем классический цикл FOR. Однако, каждая конструкция имеет свое назначение.



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