- •Лекція №1. Тема 1: Компілятори, інтерпретатори, критерії розробки, основні етапи та їх взаємозв’язок . Основні поняття.
- •Критерії розробки трансляторів:
- •Етапи трансляції:
- •Фази трансляції:
- •Лекція №2. Тема 2 : Лексичний аналізатор та його основні задачі. Основна задача лексичного аналізатора.
- •Макроалгоритм та структури даних лексичного аналізатора.
- •Структура даних для розпізнавання роздільників та знаків операцій.
- •Таблиця зарезервованих слів.
- •Таблиця ідентифікаторів.
- •Таблиця типів.
- •Таблиця типів, враховуючи блоки та процедури.
- •Лекція №3. Тема 3 : Синтаксичний аналіз.
- •Метод рекурсивного спуску.
- •Ll(1)-граматика.
- •Приведення до ll(1)-граматики.
- •Алгоритм перевірки належності граматики до класу ll(1)-граматик.
- •Лекція №4. Синтаксичний розбір за допомогою lr(1)-граматики.
- •Лекція №5. Формування lr-таблиці розбору.
- •Лекція №6. Тема 4 : Аналіз контекстних умов.
- •Аналіз контекстних умов за допомогою програмних граматик.
- •Класифікація програмних граматик:
- •Лекція №7. Граматики Ван Вейнгаарда.
- •Розбір з використанням граматики Ван Вейнгаарда та лінійно-обмеженого автомату.
- •Лекція №8. Тема 5 : Генерація коду. Метод включення дій в граматику.
- •Метод включення дій в граматику.
- •Розбір декларативної частини програми.
- •Лекція №9. Тема 6 : Розподіл пам’яті під час виконання (прогону).
- •Структури даних, які необхідні для генерації коду.
- •Лекція №10.
- •Лекція №11. Генерація коду для циклу for.
- •Генерація коду для циклу while.
- •Генерація коду для нескінченого циклу.
- •Генерація коду для декларативної частини програми.
- •Генерація коду вході в процедуру та виході з неї.
- •Лекція №12. Тема 7: Діагностика та виправлення помилок.
- •Точність діагностики помилок.
- •Виправлення помилок.
- •Діагностика помилок.
- •Лекція №13. Тема 8 : Проектування транслятора. Визначення кількості проходів під час трансляції.
- •Тема 9 : Оптимізація коду.
- •Локальна та глобальна оптимізація коду.
- •Критерії оптимізації.
- •Локальна оптимізація коду.
- •Оптимізація лінійної ділянки.
- •Глобальна оптимізація коду.
- •Тема 10 : Генератори компіляторів.
Макроалгоритм та структури даних лексичного аналізатора.
Для розпізнання кожного класу лексем необхідно зробити окрему процедуру , а для ідентифікаторів – дві процедури ( в декларативній і в недекларативній частині ) . Зчитується весь рядок з вихідного тексту , збільшуючи індекс та пропускаючи пробіли, коментарі, знаходимо перший символ. Виділяється лексема і опитуються процедури, тобто визначається клас
лексеми . Якщо виділена лексема не належить ні одному
If a>0 then b:=b+3; - рядок тексту із класу
, то фіксується помилка, а якщо лексема
пізнана – визначаємо номер в класі. Індекс встановлюється на позицію кінця розпізнаної лексеми. Далі лексема передається синтаксичному аналізатору.
Структура даних для розпізнавання роздільників та знаків операцій.
Описуємо масив із 256 байт, де елементами будуть роздільники, наприклад, A[“:”,”;”,”,”,”.”,”^”,”|”].
Таблиця зарезервованих слів.
Для розпізнавання лексичним аналізатором зарезервованих слів використовуються такі структури даних:
Упорядкований масив;
Не упорядкований масив;
Бінарне дерево (урівноважене, пронумероване) або список;
Кінцевий автомат (у вигляді таблиці, у вигляді графа з переходами). Приклад таблиці: маємо список зарезервованих слів [by,begin,end,if,in].

Метод розміщень: щоб скористатися цим методом необхідно вибрати хеш-функцію.
Вона може бути:
швидкою;
компактно розташовувати елементи в пам’яті.
Звідси можна виділити два критерії хеш-функції:
час доступу (середня тривалість, визначається в кожному конкретному випадку);
об’єм пам’яті.
Наприклад, за хеш-функцію можна взяти: залишок від суми кодів двох перших символів зарезервованого слова розділеної на кількість зарезервованих слів, тобто TRUNK((ORD(a1)+ORD(a2)/N)) – так визначається позиція в масиві відповідного елементу. Якщо маємо два зарезервованих слова з однаковими двома першими символами, тоді приймають одне з трьох рішень:
Послідовне заповнення, тобто в першу вільну комірку. Прийнято рахувати, що 60% пам’яті
п
овинно
бути вільною.
Рехешировка, тобто будується функція другої хешировки, яка використовується коли відповідна комірка заповнена, таким чином маємо іншу адресу та заносимо в комірку, яка відповідає цій адресі.
Використовування списку.

Таблиця ідентифікаторів.
Використовуються наступні структури даних для представлення таблиць ідентифікаторів :
Бінарне дерево .
В такій структурі головну роль грає час трансляції.
Масив масивів.
В
сі
літери, які утворюють різні ідентифікатори,
зберігаються в одному масиві літер, а
в кожній структурі запису в таблиці
міститься вказівник на початок рядка
літер, відповідний конкретному
ідентифікаторові, та лічильник кількості
в ньому літер. Щоб перевірити , чи
знаходиться який–небудь відповідний
ідентифікатор в таблиці , необхідно
здійснити лише по-літерне порівняння
з тими ідентифікаторами, які вже
находяться в таблиці та мають відповідну
довжину. Час трансляції в цій структурі
ролі не грає , а максимально економиться
пам’ять.
Метод розміщень(дивитися вище).
Таблиця ідентифікаторів містить:
номер ідентифікатора;
сам ідентифікатор;
вказівник типу;
адресу комірки;
рівень вложеності (явно чи неявно для таблиці ідентифікаторів , враховуючи блоки та процедури).
Таблиця ідентифікаторів, враховуючи блоки та процедури.
Існує два уявлення:
Для кожної процедури чи блоку є своя таблиця ідентифікаторів. Ведеться стек ,

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