Лекции по построению компилятора на Pascal
{--------------------------------------------------------------}
{ Allocate Storage for a Variable }
procedure Alloc(N: char);
begin
## WriteLn(N, ':', TAB, 'DC 0');
end;
{--------------------------------------------------------------}
Погоняйте программу. Попробуйте входную последовательность, которая объявляет какие-
нибудь переменные, например:
#### pvxvyvzbe.
Видите, как распределяется память? Просто, да? Заметьте также, что точка входа "MAIN"
появляется в правильном месте.
Кстати, "настоящий" компилятор имел бы также таблицу идентификаторов для записи
используемых переменных. Обычно, таблица идентификаторов необходима для записи типа
каждой переменной. Но так как в нашем случае все переменные имеют один и тот же тип,
нам не нужна таблица идентификаторов. Оказывается, мы смогли бы находить
идентификатор даже без различия типов, но давайте отложим это пока не возникнет такая
необходимость.
Конечно, в действительности мы не анализировали правильный синтаксис для объявления
данных, так как он включает список переменных. Наша версия разрешает только одну
переменную. Это также легко исправить.
БНФ для <var-list> следующая:
#### <var-list> ::= <ident> (, <ident>)*
Добавление этого синтаксиса в Decl дает новую версию:
{--------------------------------------------------------------}
{ Parse and Translate a Data Declaration }
procedure Decl;
var Name: char;
begin
## Match('v');
## Alloc(GetName);
## while Look = ',' do begin
##### GetChar;
##### Alloc(GetName);
## end;
end;
{--------------------------------------------------------------}
ОК, теперь откомпилируйте этот код и испытайте его. Попробуйте ряд строк с объявлениями
VAR, попробуйте список из нескольких переменных в одной строке и комбинации этих двух.
Работает?
ИНИЦИАЛИЗАТОРЫ
Пока мы работали с объявлениями данных, меня беспокоила одна вещь - то, что Pascal не
позволяет инициализировать данные в объявлении. Эта возможность по общему признанию
является своего рода излишеством, и ее может не быть в языке, который считается
минимальным языком. Но ее также настолько просто добавить, что было бы позором не
сделать этого. БНФ становится:
#### <var-list> ::= <var> ( <var> )*
#### <var> ::= <ident> [ = <integer> ]
Измените Alloc как показано ниже:
{--------------------------------------------------------------}
{ Allocate Storage for a Variable }