1.11.4. МОДУЛИ КОМПИЛЯТОРА И ИХ ИНТЕРФЕЙСЫ Компилятор состоит из следующих модулей:
CMP
- головная программаCMPSCN
- сканерCMPPRS
- синтаксический анализаторCMPGEN
- генератор кода и ассемблерCMPDIC
- работа со словарем**
** 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 выдает очередную лексему исходной программы в виде двух символов: первый символ указывает, к какому классу принадлежит лексема, а второй символ содержит дополнительную информацию о лексеме.**
** File: CMPPRS.RFI
**
$func Parse s.Channel = t.Program;
Из него экспортируется одна функция Parse, которая читает (обращаясь к сканеру) исходную программу из канала s.Channel и выдает абстрактную программу t.Program. Прежде чем обращаться к Parse, следует открыть канал s.Channel на чтение. Если исходная программа содержит синтаксические ошибки, функция Parse выдает $error(Oe), где Oe - сообщение об ошибке.**
** File: CMPGEN.RFI
**
$func Gen-Code t.Program = t.Code;
$func Write-Code t.Code = ;
Из него экспортируются две функции. Функция Gen-Code получает абстрактную программу t.Program и выдает скомпилированную программу в машинном коде t.Code, во внутреннем представлении в виде синтаксического дерева. Функция Write-Code получает программу в машинном коде в виде синтаксического дерева, и превращает ее в поток литер который выводит на стандартное устройство вывода.**
** 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. В качестве результата функция выдает первый свободный адрес.