- •Лекція №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 : Генератори компіляторів.
Лекція №10.
Генерація коду для типових конструкцій мов програмування.
Генерація коду для простого виразу.
Побудуємо граматику:

Включимо в цю граматику дії:

Введемо деякі позначення:
i:=i+1 – збільшення лічильника;
4) – побудувати четвірку;
Маємо включені дії:
B1:
CВ в НС;
B2:
Із НС вилучаємо СВ;
Із СЗО вилучаємо знак операції;
4) унарної операції;
СВ результату заносимо в НС;
B3:
Те що і в B2, але із НС вилучається два операнда та будується повна четвірка;
B4:
Знак поміщаємо в СЗО;
E1:
Перевірка відповідності типів та при необхідності будується четвірка приведення типів.
Оператор присвоювання.
Правило:
![]()
Включені дії:
C1:
СВ ідентифікатора заносимо в СЗО;
C2:
Із НС та ВС виймаємо СВ операндів;
4) привласнити СВ ВС,СВ НС,N;
E2:
перевірка відповідності типів, будується додаткова четвірка приведення типів перед четвіркою привласнення.
Оператор IF.
Правило:
![]()
Маємо такі включені дії:
E3:
перевірка типів;
D1:
4) перейти_по_false Li,N;
i заносимо в СЗО;
i=i+1;
D2:
4)перейти Li,N;
j виймаємо із СЗО;
i заносимо в СЗО;
i=i+1;
4) мітка Lj,N;
D3:
виймаємо в j із СЗО ;
4) мітка Lj,N.
Генерація коду для оператора CASE.
Маємо таку граматику:

Маємо такі включені дії:
F1:
CВ ідентифікатора в ВС
I заносимо в СЗО (зарезервуємо мітку для кінця оператора);
F2:
СВ літерала в НС;
F3:
4) порівняти СВ літералу, СВ НС,N;
4) порівняти СВ літерала, СВ ВС,N;
4) перехід_по_більше Li,N;
i заносимо в СЗО;
i=i+1;
звільняємо НС;
4) порівняти СВ НС, СВ ВС,N;
4) перехід_по_більше Li,N;
4)мітка Li-1,N;
F4:
звільнити НС;
4) порівняти СВ НС, СВ ВС,N;
4) перехід_по_рівно Li,N;
i заносимо в СЗО;
i=i+1, вирішити проблему багатьох міток можна двома способами:
В дії <F8> помістити в СЗО особливу мітку, наприклад –1(FFFF), в <F5> виймати з СЗО до цієї особливої мітки і її теж, та побудувати четвірку.
В дії <F8> заносимо мітку в СЗО, яка буде поставлена перед операторами в дії <F5>. В діях <F3> та <F4> побудуємо перехід на цю мітку, залишаючи її в СЗО.
В цій дії ми використаємо перший варіант, а для міток альтернатив – другий.
F5:
4) перейти Li,N;
цикл доки j<>-1:
j виймаємо з СЗО;
4) мітка Lj,N;
i заносимо в СЗО;
i=i+1;
F6:
j вилучаємо із СЗО;
k =значенню СЗО, залишаючи його в СЗО;
4) перейти Lk,N;
4) мітка Lj,N;
F7:
k виймаємо із СЗО;
4) мітка Lk,N;
F8:
-1 заносимо в СЗО.
Лекція №11. Генерація коду для циклу for.
Маємо таку граматику:

Включені дії:
G1:
СВ ідентифікатора заносимо в ВС (якщо немає опису змінної циклу, тоді в робочому стекові виділяється комірка, а потім СВ в ВС);
G2:
4) перенести СВ ВС, СВ НС,N;
звільнити НС;
G3:
4) мітка Li,N;
i заносимо в СЗО;
i=i+1;
4) порівняти СВ НС, СВ ВС,N;
4) перейти_по_більше Li,N;
i заносимо в СЗО;
i=i+1;
G4:
в j виймаємо із СЗО;
в k виймаємо з СЗО;
4) скласти СВ ВС,1,N;
4) перейти Lk,N;
4) мітка Lj,N;
звільнити НС;
звільнити ВС;
E1:
перевірка контекстних умов та типу результату.
Генерація коду для циклу while.
Побудуємо граматику:
![]()
Маємо такі включені дії;
H1:
4) мітка Li,N;
i заносимо в СЗО;
i=i+1;
4) порівняти СВ НС, true,N;
4) перейти_по_false Li,N;
i заносимо в СЗО;
i=i+1;
H2:
в j виймаємо з СЗО;
в k виймаємо з СЗО;
4) перейти Lk,N;
4) мітка Lj,N;
звільнити НС.
