- •Лабораторна робота № 2 Проектування лексичного аналізу
- •Граматики передування
- •Алгоритм «зсув-згортка» для граматик операторного передування
- •Вимоги до виконання роботи Порядок виконання роботи
- •Вимоги до оформлення звіту Звіт повинен містити наступні розділи:
- •Основні контрольні питання
- •Варіанти завдань Варіанти початкових граматик
- •Початкові граматики і типи допустимих лексем
- •Приклад виконання роботи Завдання для прикладу
- •Побудова матриці операторного передування Побудова множини крайніх правих і крайніх лівих символів
- •Побудова множини крайніх правих і крайніх лівих термінальних символів
- •Заповнення матриці передування
- •Приклади виконання розбору пропозицій вхідної мови
- •Реалізація синтаксичного розпізнавача. Розбиття на модулі
- •Модуль опису матриці передування і правил граматики
- •Модуль структур даних для синтаксичного аналізу і реалізації алгоритму «зсув -згортка»
- •Текст програми розпізнавача
- •Висновки по виконаній роботі
- •Синтаксично керований переклад
- •Способи внутрішнього представлення програм
- •Багатоадресний код з неявно іменованим результатом (тріади)
- •Схеми су-перекладу
- •Загальні принципи оптимізації коду
- •Принципи оптимізації лінійних ділянок
- •Згортка об'єктного коду
- •Виключення зайвих операцій
- •Загальний алгоритм генерації й оптимізації об'єктного коду
- •Вимоги до виконання роботи Порядок виконання роботи
- •Приклад виконання роботи
- •Побудова схем су-перекладу
- •Реалізація генератора списку тріад Розбиття на модулі
- •Модуль опису допустимих типів тріад
- •Модуль опису структур даних для тріад
- •Модуль побудови списку тріад по дереву синтаксичного розбору
- •Модуль обчислення значень тріад на етапі компіляції
- •Модуль, що реалізує алгоритми оптимізації
- •Текст програми генератора списку тріад
- •Висновки по проробленій роботі
Висновки по виконаній роботі
В результаті лабораторної роботи № 3 побудований синтаксичний аналізатор на основі граматики операторного передування. Синтаксичний аналіз дозволяє перевіряти відповідність структури початкового тексту заданій граматиці вхідної мови. Синтаксичний аналіз дозволяє виявляти будь-які синтаксичні помилки у вхідній програмі. При наявності однієї помилки користувачеві видається повідомлення з вказівкою місцезнаходження помилки в вихіному тексті. Аналіз типу виявленої помилки не проводиться. За наявності декількох помилок в початковому тексті виявляється тільки перша з них, після чого подальший аналіз не виконується.
Результатом роботи синтаксичного аналізатора є структура даних, що представляє синтаксичне дерево. У комплексі з лексичним аналізатором, створеним при виконанні лабораторної роботи № 2, побудований синтаксичний аналізатор дозволяє виконувати підготовку даних, необхідних для виконання наступної лабораторної роботи, пов'язаної з генерацією кола.
ЛАБОРАТОРНА РОБОТА № 4
Генерація і оптимізація об'єктного коду
Мета роботи
Мета роботи: вивчення основних принципів генерації компілятором його коду, ознайомлення з методами оптимізації результуючого об'єктного кола для лінійної ділянки програми з допомогою згортки і виключення зайвих операцій.
Короткі теоретичні відомості
Загальні принципи генерації коду
Генерація об'єктного коду — це переклад компілятором внутрішнього представлення початкової програми в ланцюжок символів вихідної мови. Оскільки вихідною мовою компілятора (на відміну від транслятора) може бути тільки або мова «асемблер», або мова машинних кодів, то генерація коду породжує результуючу об'єктну програму на мові асемблера або безпосередньо на машинній мові (у машинних кодах).
Генерація об'єктного коду виконується після того, як виконані лексичний і синтаксичний аналіз програми і всі необхідні дії по підготовці до генерації коду: перевірені семантичні угоди вхідної мови (семамтичний аналіз), виконана ідентифікація імен змінних і функцій, розподілений адресний простір під функції і змінні.
У даній лабораторній роботі використовується гранично проста вхідна мова, тому немає необхідності виконувати всі перераховані перетворення. Вважатимемо, що всі вони вже виконані. Детальніше всі ці фази компіляції описані в (1-4,7), тут буде йти мова про самі примітивні прийоми семантичного аналізу, які будуть проілюстровані на прикладі виконання лабораторної роботи.
Внутрішнє представлення програми може мати будь-яку структуру залежно від реалізації компілятора, в той час як результуюча програма завжди є лінійною послідовністю команд. Тому генерація об'єктного кола (об'єктної програми) в любому випадку повинна виконувати дії, пов'язані з перетворенням складних синтаксичних структур в лінійні ланцюжки.
Генерацію коду можна вважати функцією, визначеною на синтаксичному дереві, побудованому в результаті синтаксичного аналізу, і на інформації, що міститься в таблиці ідентифікаторів. Характер відображення вхідної програми в послідовність команд, виконуваного генерацією, залежить від вхідної мови, архітектура цільової обчислювальної системи, на яку орієнтована результуюча програма, а також від якості бажаного об'єктного кола.
В ідеалі компілятор повинен виконати синтаксичний аналіз всієї вхідної програми, потім провести її семантичний аналіз, після чого приступати до підготовки генерації і безпосередньо генерації коду. Проте така схема роботи компілятора практично майже ніколи не застосовується. Річ у тому, що в загальному випадку жоден семантичний аналізатор і жоден компілятор не здатні проаналізувати і оцінити сенс всієї початкової програми в цілому. Формальні методи аналізу семантики застосовні тільки до дуже незначної частини можливих початкових програм. Тому у компілятора немає практичної можливості породжувати еквівалентну результуючу програму на основі всієї початкової програми.
Як правило, компілятор виконує генерацію результуючого коду поетапно, на основі закінчених синтаксичних конструкцій вхідної програми. Компілятор виділяє закінчену синтаксичну конструкцію з тексту початкової програми, породжує для неї фрагмент результуючого коду і поміщає його в текст результуючої програми. Потім він переходить до наступної синтаксичної конструкції. Так продовжується доти, поки не буде розібрана вся початкова програма. В якості аналізованих закінчених синтаксичних конструкцій виступають блоки операторів, опису процедур і функцій. Їх конкретний склад залежить від вхідної мови і реалізації компілятора.
Сенс (семантику) кожній такій синтаксичній конструкції вхідної мови можна визначити, виходячи з її типу, а тип визначається синтаксичним аналізатором на основі граматики вхідної мови. Прикладами типів синтаксичних конструкцій можуть служити оператори циклу, умовні оператори, оператори вибору. Одні і ті ж типи синтаксичних конструкцій характерні для різних мов програмування, при цьому вони розрізняються синтаксисом (який задасться граматикою мови), але мають схожий сенс (який визначається семантикою). Залежно від типу синтаксичної конструкції виконується генерація кола результуючої програми, відповідного даній синтаксичній конструкції. Для семантично схожих конструкції різних вхідних мов програмування може породжуватися типовий результуючий код.
