- •Лекція №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 : Генератори компіляторів.
Лекція №4. Синтаксичний розбір за допомогою lr(1)-граматики.
Цей метод розбору знизу вверх застосовується до широкого класу мов та граматик. Синтаксичний аналізатор, який працює за принципом “знизу вверх”, зводить речення мови до початкового символу шляхом послідовного застосування правил граматики. Розглянемо, наприклад, мову, яка генерується правилами:

Таблиця розбору.
-
стан
S
IDLIST
ID
real
,
a,b,c,d
#
1
End
S2
2
S5
S4
S3
3
R4
R4
4
R3
R3
5
S6
R1
6
S7
7
R2
S3
R2
Si - елементи зсуву, означають, що в стек символів занесемо заголовок колонки, в стек станів – i, якщо на вході термінал – він приймається та перехід в стан i.
Ri – виконується приведення за допомогою правила i. Із двох стеків виймаються стільки елементів скільки елементів в правій частині i-го правила. Поточним елементом стає нетермінал в лівій частині та виконується перехід в стан з вершини стеку станів.
Речення
real a,b,c
належить цій мові та може бути розібрана знизу вверх наступним чином:


Розшифруємо дії, які були виконані :
Вхідний символ – real, із елементу таблиці розбору (1, real) зсув в стан 2;
Вхідний символ – a, зсув в стан 3;
Вхідний символ - <,>, скористаємося правилом 4;
Вхідний символ – ID, зсув в стан 4;
Вхідний символ - <,>, скористаємося правилом 3;
Вхідний символ – IDLIST, зсув в стан 5;
Вхідний символ - <,>, зсув в стан 6;
Вхідний символ – b, зсув в стан 3;
Вхідний символ - <,>, скористаємося правилом 4;
Вхідний символ – ID, зсув в стан 7;
Вхідний символ - <,>, приведення за допомогою правила 2;
Вхідний символ – IDLIST, зсув в стан 5;
Вхідний символ - <,>, зсув в стан 6;
Вхідний символ – с, зсув в стан 3;
Вхідний символ - <#>, скористаємося правилом 4;
Вхідний символ – ID, зсув в стан 7;
Вхідний символ - <#>, скористаємося правилом 2;
Вхідний символ – IDLIST, зсув в стан 5;
Вхідний символ - <#>, приведення за допомогою правила 1;
Вхідний символ – S, тобто END.
Розбір успішно закінчено. Зазначимо, що після зсуву вхідним символом завжди є наступний символ, а після приведення – символ, до якого тільки що привела дія.
Лекція №5. Формування lr-таблиці розбору.
Щоб побудувати LR-таблицю розбору необхідно:
Визначити множину станів (їх 7);
Ввести поняття конфігурації: (i,j) – номер позиції в правій частині правила.

Стани в таблиці розбору приблизно відповідають конфігураціям в граматиці, з тією лише різницею, що конфігурації, які не відрізняються для аналізатора, є одним і тим же станом. Розпочавши з конфігурації (1,0) і послідовно виконуючи операцію замикання та утворення спадкоємця до тих пір, доки всі конфігурації не будуть включені в який-небудь стан. Там, де ряд конфігурацій міститься в одному замиканні, кожна із них буде відповідати одному станові. Нова конфігурація, яку отримуємо за допомогою операції утворення спадкоємця, називається базовою. Якщо за базовою конфігурацією, наступний нетермінал, тоді всі конфігурації, які відповідають точці зліва віл кожної правої частини правила для даного нетермінала (і далі рекурсивно), сконцентруються в замиканні цієї базової конфігурації. Так, сім станів можна описати наступним чином:
-
Стан
База
Замикання
1
(1,0)
(1,0)
2
(1,1)
(1,1) (2,0) (3,0) (4,0)
3
(4,1)
(4,1)
4
(3,1)
(3,1)
5
(1,2) (2,1)
(2,1) (1,2)
6
(2,2)
(2,2) (4,0)
7
(2,3)
(2,3)
В особливому випадку LR(0)-граматики отримаємо таблицю:
-
S
IDLIST
ID
real
a,b,c,d
,
#
1
S2
2
S5
S4
S3
3
R4
R4
R4
R4
R4
R4
R4
4
R3
R3
R3
R3
R3
R3
R3
5
R1
R1
R1
R1
R1
R1
S6
6
S7
S3
7
R2
R2
R2
R2
R2
R2
R2
Для всіх кінцевих станів у всьому рядку можемо проставити відповідні приведення. Якщо вдається всі рядки вдало заповнити символами приведення для кінцевого стану всіх правил, тоді побудова таблиці розбору є закінченою і дана граматика є LR(0)-граматикою, а якщо ні – виконується процедура побудови SLR(1)-граматики. Аналогічно будується таблиця зсувів, а для правил приведення беремо один символ слідування.
-
S
IDLIST
ID
real
a,b,c,d
,
#
1
S2
2
S5
S4
S3
3
R4
R4
4
R3
R3
5
S6
R1
6
S7
S3
7
R2
R2
LALR(1)-граматика (LR(1)-граматика з попереднім оглядом символів). Таблиця розбору має ту ж кількість станів, але множина символів слідування в ній зважують на лівий контекст. Маємо :
-
Стан
Конфігурація
Символи слідування
1
(1,0)
{#}
2
(1,1)
{a,b,c,d}
(2,0)
{a,b,c,d}
(3,0)
{a,b,c,d}
(4,0)
{a,b,c,d}
3
(4,1)
{, #}
4
(3,1)
{, #}
5
(2,1)
{,}
(1,2)
{#}
6
(2,2)
{a,b,c,d}
(4,0)
{a,b,c,d}
7
(2,3)
{, #}
Потім по описаним раніше правилам будується таблиця розбору LALR(1)-граматики. Якщо не вдалося побудувати LALR(1)-таблицю розбору, тоді застосовується, якщо можливо, метод LR(1)-таблиці розбору. Описаний алгоритм залишається постійним незалежно від того, яка граматика розглядається: LR(0), SLR(1), LALR(1), LR(1). Алгоритм побудови таблиці розбору стає складнішим по мірі ускладнення (універсальності) граматики.
Дамо порівняльну характеристику для LL(1) та LR(1)-розбору:
Об’єм пам’яті для таблиці розбору по методу LR(1) на порядок більший від об’єму для LL(1) методу.
LL(1) - аналізатор на 10-20% швидше діє ніж LR(1)-аналізатор.
З технологічної точки зору LL(1)-таблиці будуються краще.
