Опис компілятора

Загальна схема компіляції

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

опис

Відповідно до цієї схеми, можна виділити такі функціональні модулі проектованого компілятора:

- менеджер таблиць лексем

Призначення даного модуля – коректне формування та заповнення таблиць лексем, які у тексті вхідний програми. Менеджер таблиць бере участь у формуванні потоку токенів у вигляді взаємодії з лексичним аналізатором.

Цей блок реалізує алгоритм «перенесення-згортка», і основі власних керуючих таблиць здійснює розбір тексту програми у певній граматиці. У результаті виконання алгоритму формується внутрішнє уявлення програми як потоку зошит. Синтаксичний аналізатор взаємодіє з менеджером таблиць лексем визначення семантичної коректності програми та формування узагальненої таблиці лексем.

- генератор вихідної мови

Реалізує заключний етап компіляції, у якому внутрішнє машинно-незалежне уявлення програми як тетрад перетворюється на код програми мовою асемблера. Усі відомості, необхідні реалізації генерації коду, містяться у вхідному потоці тетрад і таблиці лексем.

Результатом трансляції є код програми мовою асемблера. Цей код може бути оброблений асемблером (використовується асемблер 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

Приклади рядкових констант:

Розділювачі можуть означати знаки операцій у виразах, значущісимволи для визначення змінних, констант, операторів та інших конструкцій вхідної мови. Нижче наведено список можливих роздільників: