Давайте создадим компилятор!   ::   Креншоу Джек

Страница: 59 из 382

Кактолько синтаксис определен, включить его в код достаточно просто.

Теперь, все конструкции, с которыми мы будем иметь дело, включают передачу управления, что на уровне ассемблера означает условные и/или безусловные переходы. К примеру простой оператор IF:

IF A ENDIF B...

должен быть переведен в:

Если условие не выполнено то переход на L

A

L: B

...

Ясно, что нам понадобятся несколько процедур, которые помогут нам работать с этими переходами. Ниже я определил две из них. Процедура NewLabel генерирует уникальные метки. Это сделано с помощью простого способа называть каждую метку 'Lnn', где nn – это номер метки, начинающийся с нуля. Процедура PostLabel просто выводит метки в соответствующем месте.

Вот эти две подпрограммы:



{–}

{ Generate a Unique Label }

function NewLabel: string;

var S: string;

begin

Str(LCount, S);

NewLabel := 'L' + S;

Inc(LCount);

end;

{–}

{ Post a Label To Output }

procedure PostLabel(L: string);

begin

WriteLn(L, ':');

end;

{–}



Заметьте, что мы добавили новую глобальную переменную LCount, так что вы должны изменить раздел описания переменных в начале программы, следующим образом:



var Look : char; { Lookahead Character }

Lcount: integer; { Label Counter }



Также добавьте следующий дополнительный инициализирующий код в Init:



LCount := 0;



(Не забудьте сделать это, иначе ваши метки будут выглядеть действительно странными!).

|< Пред. 57 58 59 60 61 След. >|

Java книги

Контакты: [email protected]