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

       

ОБЪЯВЛЕНИЕ ТИПОВ


Распределение памяти различных размеров не сложнее чем изменение процедуры TopDecl для распознавания более чем одного ключевого слова. Здесь необходимо принять ряд решений, с точки зрения того, каков должен быть синтаксис и т.п., но сейчас я собираюсь отложить  все эти вопросы и просто объявить не подлежащий утверждению указ что наш синтаксис будет таким:

    <data decl> ::= <typename>  <identifier>

где:

    <typename> ::= BYTE | WORD | LONG

 (По удивительному совпадению, первые буквы этих наименований оказались те же самыми что и спецификации длины ассемблерного кода 68000, так что такой выбор сэкономит нам немного работы.)

Мы можем создать код, который позаботится об этих объявлениях, внеся всего лишь небольшие изменения. Обратите внимание, что в подпрограммах, показанных ниже, я отделил генерацию код в Alloc от логической части. Это соответствует нашему желанию изолировать машинно-зависимую часть компилятора.

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

{ Generate Code for Allocation of a Variable }

procedure AllocVar(N, T: char);

begin

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

end;

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

{ Allocate Storage for a Variable }

procedure Alloc(N, T: char);

begin

   AddEntry(N, T);

   AllocVar(N, T);

end;

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

{ Parse and Translate a Data Declaration }

procedure Decl;

var Typ: char;

begin

   Typ := GetName;

   Alloc(GetName, Typ);

end;

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

{ Parse and Translate Global Declarations }

procedure TopDecls;

begin

   while Look <> '.' do begin

      case Look of

        'b', 'w', 'l': Decl;

      else Abort('Unrecognized Keyword ' + Look);

      end;

      Fin;

   end;

end;

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

Внесите показанные изменения в эти процедуры и испытайте программу. Используйте одиночные символы "b", "w" и "l" как ключевые слова (сейчас они должны быть в нижнем регистре). Вы увидите, что в каждом случае мы выделяем память соответствующего объема. Обратите внимание, глядя на дамп таблицы идентификаторов, что размеры также сохранены для использования позже. Какого использования? Хорошо, это тема остальной части этой главы.



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