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

       

REPEAT-UNTIL


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

REPEAT <block> UNTIL <condition>

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

     REPEAT         { L = NewLabel;

                      PostLabel(L) }

     <block>

     UNTIL

     <condition>    { Emit(BEQ L) }

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

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

{ 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", на жаргоне разработчиков компиляторов.

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

{ 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;

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



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