1.11.4. МОДУЛИ КОМПИЛЯТОРА И ИХ ИНТЕРФЕЙСЫ

Компилятор состоит из следующих модулей:

CMP - головная программа

CMPSCN - сканер

CMPPRS - синтаксический анализатор

CMPGEN - генератор кода и ассемблер

CMPDIC - работа со словарем


Головной модуль не имеет интерфейсной части и содержит определение начальной функции Main. Прочие модули состоят из двух частей: интерфейса модуля и реализации модуля.


Модуль CMPSCN имеет следующую интерфейсную часть:

**

** File CMPSCN.RFI

**

$func Init-Scanner s.Channel = ;

$func Read-Token = s.TokenClass s.TokenInfo;

$func Term-Scanner = ;

Из него экспортируются три функции.

Функция Init-Scanner служит для инициализации сканера. Параметр s.Channel является ссылкой на канал, из которого сканер начинает читать литеры. Прежде чем обращаться к Init-Scanner, следует открыть этот канал на чтение.

Функция Term-Scanner должна быть вызвана после того как вся исходная программа будет прочитана. Это дает возможность сканеру закончить свою деятельность и приготовиться к чтению другой программы.

Функция Read-Token выдает очередную лексему исходной программы в виде двух символов: первый символ указывает, к какому классу принадлежит лексема, а второй символ содержит дополнительную информацию о лексеме.


Модуль CMPPRS имеет следующую интерфейсную часть:

**

** File: CMPPRS.RFI

**

$func Parse s.Channel = t.Program;

Из него экспортируется одна функция Parse, которая читает (обращаясь к сканеру) исходную программу из канала s.Channel и выдает абстрактную программу t.Program. Прежде чем обращаться к Parse, следует открыть канал s.Channel на чтение.

Если исходная программа содержит синтаксические ошибки, функция Parse выдает $error(Oe), где Oe - сообщение об ошибке.


Модуль CMPGEN имеет следующую интерфейсную часть:

**

** File: CMPGEN.RFI

**

$func Gen-Code t.Program = t.Code;

$func Write-Code t.Code = ;

Из него экспортируются две функции.

Функция Gen-Code получает абстрактную программу t.Program и выдает скомпилированную программу в машинном коде t.Code, во внутреннем представлении в виде синтаксического дерева.

Функция Write-Code получает программу в машинном коде в виде синтаксического дерева, и превращает ее в поток литер который выводит на стандартное устройство вывода.


Модуль CMPDIC имеет следующую интерфейсную часть:

**

** File: CMPDIC.RFI

**

$func Make-Dic = s.Dic;

$func Lookup-Dic s.Key s.Dic = s.Ref;

$func Allocate-Dic s.Dic s.StartAddr = s.FreeAddr;

Из него экспортируются три функции.

Функция Make-Dic создает новый пустой словарь и выдает ссылку на него.

Функция Lookup-Dic находит в словаре, на который указывает s.Dic, метку, соответствующую ключу s.Key и выдает ее. Если ключ s.Key ранее не был зарегистрирован в словаре, то создается новая уникальная метка, которая связывается с ключом s.Key и выдается в качестве значения.

Функция Allocate-Dic просматривает словарь, на который указывает s.Dic и связывает все зарегистрированные в нем метки с различными адресами. Если в словаре зарегистрировано N ключей, то соответствующим меткам присваиваются последовательные адреса начиная с s.StartAddr. В качестве результата функция выдает первый свободный адрес.