Опис компілятора
Загальна схема компіляції
У загальному вигляді процес перекладу тексту програми мовою ПАСКАЛЬ до тексту програми мовою асемблера можна представити у вигляді наступної схеми:

Відповідно до цієї схеми, можна виділити такі функціональні модулі проектованого компілятора:
- менеджер таблиць лексем
Призначення даного модуля – коректне формування та заповнення таблиць лексем, які у тексті вхідний програми. Менеджер таблиць бере участь у формуванні потоку токенів у вигляді взаємодії з лексичним аналізатором.
Цей блок реалізує алгоритм «перенесення-згортка», і основі власних керуючих таблиць здійснює розбір тексту програми у певній граматиці. У результаті виконання алгоритму формується внутрішнє уявлення програми як потоку зошит. Синтаксичний аналізатор взаємодіє з менеджером таблиць лексем визначення семантичної коректності програми та формування узагальненої таблиці лексем.
- генератор вихідної мови
Реалізує заключний етап компіляції, у якому внутрішнє машинно-незалежне уявлення програми як тетрад перетворюється на код програми мовою асемблера. Усі відомості, необхідні реалізації генерації коду, містяться у вхідному потоці тетрад і таблиці лексем.
Результатом трансляції є код програми мовою асемблера. Цей код може бути оброблений асемблером (використовується асемблер TASM) для отримання об'єктного модуля. Результуючий об'єктний модуль може бути скомпонований з допоміжними бібліотеками (використовується компонувальник TLINK) для отримання модуля, що виконується.
Розробка лексичного аналізатора
Призначення лексичного аналізатора
Лексичний аналіз – перший етап компіляції. У компіляторі, що розробляється, лексичний аналіз виконується за один прохід по тексту програми і вирішує наступні завдання:
- виділення у вихідному тексті програми мінімальних синтаксично значущих конструкцій (лексем) та заповнення таблиці лексем;
- Формування потоку токенів, що відповідають вихідному тексту програми;
- Виявлення помилок появи неприпустимих символів у вихідному тексті програми.
Лексичний аналізатор взаємодіє з менеджером таблиць лексем, щоб коректно заповнити відповідні таблиці та сформувати необхідний потік токенів. Результати роботи лексичного аналізатора є вихідними даними наступного етапу компіляції – синтаксичного аналізу.
Типи виділених лексем
Щоб спростити роботу синтаксичного аналізатора, вихідний текст програми вигідно уявити над вигляді потоку символів (як готує його користувач), а вигляді потоку лексем. Кожна лексема може бути описана автоматною граматикою, їхнє розпізнавання можна здійснити за допомогою кінцевого детермінованого автомата. Вхідна програма може містити такі види лексем:
- ключові слова та ідентифікатори;
- цілочисленні, речові та рядкові константи;
- односимвольні та двосимвольні роздільники;
- Незначні символи (пробіли, табуляція, переклад каретки).
Опис ключових слів та ідентифікаторів
Ідентифікатор- послідовність літер, цифр та символу підкреслення, що починається з літери або символу підкреслення. Цьому відповідає наступна автоматна граматика:
identifier letter idrest underline idrest
idrest letter idrest underline idrest digitidrest eps
Ряд ідентифікаторів має певне значення, і користувач не може використовувати їх для іменування програми, констант та змінних. Такі ідентифікатори називаються ключовими словами . Список ключових слів вхідної мови:
програма, почати, завершити, integer, реальний, boolean, char, string, true, false, stack, push, pop, top, for, to, do, or, and, не, if, then, else, read, write, writeln, const, var.
Попереднє складання таблиці ключових слів мови дозволяє спростити роботу лексичного аналізатора. Тобто робота лексичного аналізатора зводиться до виділення у тексті програми довільного ідентифікатора, а менеджер таблиць розпізнає серед виділених ідентифікаторів ключові слова.
_, _2382, hello, summer07, Marry_005 і так далі.
Довжина ідентифікатора потенційно не обмежена.
Опис цілісних, речових та рядкових констант
У тексті програми можуть бути явно вказані цілі (intnum), речові (realnum) і рядкові константи (strvalue) (загальна назва таких констант - "літерали"). Для кожного типу літералів представлена своя автоматна граматика:
intnum digit digits
digits digit digits eps
realnum digit fullpart
fullpart digit fullpart period fracpart e scipart
fracpart digit fracpart eps
scipart + power - power
power digit powerrest
powerrest digit powerrest eps
strvalue quote strrest
strrest symbol strrest quote
Приклади цілісних констант:
Приклади речових констант:
0.909, 12., 44e+05, 1E-12
Приклади рядкових констант:
Розділювачі можуть означати знаки операцій у виразах, значущісимволи для визначення змінних, констант, операторів та інших конструкцій вхідної мови. Нижче наведено список можливих роздільників: