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

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

');

end;

{–}



Теперь добавьте две новые процедуры:



{–}

{ Process a Data Declaration }

procedure Decl;

begin

Match('v');

GetChar;

end;

{–}

{ Parse and Translate Global Declarations }

procedure TopDecls;

begin

while Look <> 'b' do

case Look of

'v': Decl;

else Abort('Unrecognized Keyword ''' + Look + '''');

end;

end;

{–}



Заметьте, что на данный момент Decl – просто заглушка. Она не генерирует никакого кода и не обрабатывает список... каждая переменная должна быть в отдельном утверждении VAR.

ОК, теперь у нас может быть любое число объявлений данных, каждое начинается с "v" вместо VAR, перед блоком BEGIN. Попробуйте несколько вариантов и посмотрите, что происходит.

ОБЪЯВЛЕНИЯ И ИДЕНТИФИКАТОРЫ



Это выглядит довольно хорошо, но мы все еще генерируем только пустую программу. Настоящий ассемблер должен выдавать директивы ассемблера для распределения памяти под переменные. Пришло время действительно получить какой-нибудь код.

С небольшим дополнительным кодом это легко сделать в процедуре Decl. Измените ее следующим образом:



{–}

{ Parse and Translate a Data Declaration }

procedure Decl;

var Name: char;

begin

Match('v');

Alloc(GetName);

end;

{–}



Процедура Alloc просто выдает команду ассемблеру для распределения памяти:



{–}

{ Allocate Storage for a Variable }

procedure Alloc(N: char);

begin

WriteLn(N, ':', TAB, 'DC 0');

end;

{–}



Погоняйте программу. Попробуйте входную последовательность, которая объявляет какие-нибудь переменные, например:

pvxvyvzbe.

Видите, как распределяется память? Просто, да? Заметьте также, что точка входа «MAIN» появляется в правильном месте.

|< Пред. 170 171 172 173 174 След. >|

Java книги

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