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

       

ОПЕРАТОР LOOP


Мы могли бы остановиться на этом и иметь работающий язык. Много раз было показано, что языка высокого уровня всего с двумя конструкциями IF и WHILE достаточно для написания структурного кода. Но раз уж мы начали, то давайте немного расширим репертуар.

Эта конструкция даже проще, так как она совсем не имеет проверки условия... это бесконечный цикл. Имеет ли смысл такой цикл? Немного сам по себе, но позднее мы собираемся добавить команду BREAK, которая даст нам способ выхода из цикла. Она делает язык значительно более богатым, чем Паскаль, который не имеет команды выхода из цикла и также позволяет избежать забавных конструкций типа WHILE(1) или WHILE TRUE в C и Паскале.

Синтаксис прост:

     LOOP <block> ENDLOOP

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

     LOOP           { L = NewLabel;

                      PostLabel(L) }

     <block>

     ENDLOOP        { Emit(BRA L }

Соответствующий код показан ниже. Так как мы уже использовали "l" для ELSE на этот раз я использовал последнюю букву "p" как "ключевое слово".

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

{ Parse and Translate a LOOP Statement }

procedure DoLoop;

var L: string;

begin

   Match('p');

   L := NewLabel;

   PostLabel(L);

   Block;

   Match('e');

   EmitLn('BRA ' + L);

end;

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

После того, как вы вставите эту подпрограмму, не забудьте добавить строчку в Block для ее вызова.



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