
- •Лекція №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 : Генератори компіляторів.
Розбір з використанням граматики Ван Вейнгаарда та лінійно-обмеженого автомату.
Умови можливості розбору:
Поняття узагальнюючої довжини:
Присутня тільки сувора граматика, без метаграматики;
За узагальнюючу довжину терміналу суворої граматики приймають постійне число
Узагальнююча довжина форми рівна кількості терміналів метаграматики в цій формі та позначається
узагальнююча довжина лівої частини схеми виводу дорівнює довжині форми в лівій частині та позначається
узагальнююча довжина правої частини схеми виводу дорівнює сумі узагальнюючих довжин форми, терміналів та ком в правій частині, позначається:
Означення. Граматика Ван Вейнгаарда є не скорочуваною граматикою якщо:
існує таке K, при якому для всіх схем суворої граматики та виконується нерівність Ll<=Lr;
всі нетермінальні символи метаграмтики, які входять в ліву частину , входять і в праву частину;
кількість входжень в лівій частині повинно бути < або = кількості входжень в правій частині.
Лінінйно-обмежений автомат – це деяка різновидність машини Т’юрінга. Він відрізняється від машини Тюрінга:
стрічка обмежена;
в діях;
Лінійно-обмежений автомат може виконувати три дії за один крок:
Змінювати стан;
Змінювати теперішній елемент;
Зсув вправо, зсув вліво, або на місці.
Вивід виконується знизу вверх по дереву розбору. Для будь-якої звичайної граматики можна побудувати еквівалентну граматику Ван Вейнгаарда, але для будь-якої граматики Ван Вейнгаарда не можливо побудувати еквівалентну їй звичайну.
Лекція №8. Тема 5 : Генерація коду. Метод включення дій в граматику.
Генерація коду здійснюється за два проходи та використовується за звичай деяка проміжна мова. Це зумовлено :
Бажанням розділити машинно-залежну та машинно-незалежну частини коду;
Оптимізацією коду.
Проміжний код повинен бути:
Машинно-незалежний;
З явною адресацією.
За проміжну мову приймають:
Ассемблер;
Префіксну та постфіксну форми запису;
Четвірки (наприклад, a+b=1;
c-d=2;
1*2=3;
-3=4, в кожній четвірці маємо: два операнди, знак операції та операнд результату – за звичай номер четвірки). Переваги четвірок:
Неявна адресація;
Кожна четвірка відповідає команді;
Добре працює з тимчасовими змінними;
Простіша оптимізація ніж в інших випадках;
Трійки (наприклад, a+b;
c-d;
1*2;
-3, в кожній четвірці маємо: два операнда та знак операції, номер трійки - порядковий номер);
Не пряма трійка, маємо деякі посилання на трійки:
Метод включення дій в граматику.
Розглянемо приклад :
Побудуємо змінену граматику з включеними діями:
Включені дії:
A1: теперішній елемент заносимо в стек;
A2:
Два елементи виймаємо із стеку та формуємо неповну четвірку ЕЛ1, ЕЛ2=Nчетвірки;
N четвірки заносимо в стек;
A3:
Три елементи виймаємо із стеку;
Будуємо четвірку ЕЛ1, ЕЛ2, ЕЛ3=Nчетвірки;
N четвірки заносимо в стек;
A4: один елемент виймаємо з стеку.
Приклад : розглянемо стрічку “-(-a+b)*(c+d)”
№правила |
№включених дій |
Отриманий ланцюг |
Четвірка |
Стек |
0 |
_ |
S <A4> |
_ |
- |
1,5 |
_ |
-<A1>T<A2>Z<A4> |
_ |
- |
2 |
A1 |
-(S)<A2>Z<A4> |
_ |
-,- |
1,5 |
A1 |
-(-<A1>T<A2>Z)<A2>Z<A4> |
_ |
-,- |
3,6 |
_ |
-(-a<A1><A2>+<A1>S<A3>)<A2>Z<A4> |
_ |
-,- |
1,3,7 |
A1,A2,A2 |
-(-a+b<A1><A3>)<A2>Z<A4> |
-a=1 |
1,- |
6 |
A1,A2,A3 |
-(-a+b)*<A1>S<A3><A4> |
1+b=2 -2=3 |
3 |
1,2,7 |
A1 |
-(-a+b)*(S)<A3><A4> |
_ |
*,3 |
1,3,6 |
_ |
-(-a+b)*(c<A1>+<A1>S<A3>)<A3><A4> |
_ |
*,3 |
1,3,7 |
A1,A1 |
-(-a+b)*(c+d<A1><A3>)<A3><A4> |
_ |
+,c,*,3 |
_ |
A1,A3 |
-(-a+b)*(c+d)<A3><A4> |
c+d=4 |
4,*,3 |
_ |
A3,A4 |
-(-a+b)*(c+d) |
3*4=5 |
_ |
В результаті розбору отримали четвірки:
-a=1;
1+b=2;
-2=3;
c+d=4;
3*4=5.
Аналогічно можна перевірити контекстні умови (один мінус, пріоритет *,/).