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



              

ВЫПОЛНИМЫЕ УТВЕРЖДЕНИЯ


К этому времени мы можем генерировать пустую программу, которая имеет несколько объявленных переменных и возможно инициализированных. Но пока мы не генерировали ни строки выполнимого кода.

Верите ли вы или нет, но мы почти имеем пригодный для использования компилятор! Отсутствует только выполнимый код, который должен входить в основную программу. Но этот код - это только операции присваивания и операторы управления... все вещи, которые мы сделали раньше. Так что у нас не должно занять слишком много времени предусмотреть также и их.

БНФ определение, данное раньше для основной программы, включало операторный блок, который мы пока что игнорировали:

     <main> ::= BEGIN <block> END

Сейчас мы можем рассматривать блок просто как серию операций присваивания:

     <block> ::= (Assignment)*

Давайте начнем с добавления синтаксического анализатора для  блока. Мы начнем с процедуры-заглушки для операции присваивания:

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

{ Parse and Translate an Assignment Statement }

procedure Assignment;

begin

   GetChar;

end;

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

{ Parse and Translate a Block of Statements }

procedure Block;

begin

   while Look <> 'e' do

      Assignment;

end;

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

Измените процедуру Main чтобы она вызывала Block как показано ниже:

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

{ Parse and Translate a Main Program }

procedure Main;

begin

   Match('b');

   Prolog;

   Block;

   Match('e');

   Epilog;

end;

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

Эта версия все еще не генерирует никакого кода для "операций присваивания"... все что она делает это съедает символы до тех пор, пока не увидит "e", означающее "END". Но она устанавливает основу для того, что следует дальше.




Содержание  Назад  Вперед