Содержание материала

REPEAT-UNTIL

Имеется одна конструкция, которую я взял напрямую из Паскаля. Синтаксис:

     REPEAT <block> UNTIL <condition>

и синтаксически-управляемый перевод:

     REPEAT         { L = NewLabel;

                      PostLabel(L) }
     <block>
     UNTIL

     <condition>    { Emit(BEQ L) }

Как обычно, код вытекает отсюда довольно легко:

Code:

{ Parse and Translate a REPEAT Statement }

procedure DoRepeat;

var L: string;

begin

   Match('r');

   L := NewLabel;

   PostLabel(L);

   Block;

   Match('u');

   Condition;

   EmitLn('BEQ ' + L);

end;

 

 

 

 

Как и прежде, мы должны добавить вызов DoRepeat в Block. Хотя на этот раз есть различия. Я решил использовать "r" вместо REPEAT (естественно), но я также решил использовать "u" вместо UNTIL. Это означает, что "u" должен быть добавлен к множеству символов в условии while. Это символы, которые сигнализируют о выходе из текущего блока... символы "follow", на жаргоне разработчиков компиляторов.

Code:

{ Recognize and Translate a Statement Block }

procedure Block;

begin

   while not(Look in ['e', 'l', 'u']) do begin

      case Look of

       'i': DoIf;

       'w': DoWhile;

       'p': DoLoop;

       'r': DoRepeat;

       else Other;

      end;

   end;

end;

 

 
 

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить