- •Лабораторна робота № 2 Проектування лексичного аналізу
- •Граматики передування
- •Алгоритм «зсув-згортка» для граматик операторного передування
- •Вимоги до виконання роботи Порядок виконання роботи
- •Вимоги до оформлення звіту Звіт повинен містити наступні розділи:
- •Основні контрольні питання
- •Варіанти завдань Варіанти початкових граматик
- •Початкові граматики і типи допустимих лексем
- •Приклад виконання роботи Завдання для прикладу
- •Побудова матриці операторного передування Побудова множини крайніх правих і крайніх лівих символів
- •Побудова множини крайніх правих і крайніх лівих термінальних символів
- •Заповнення матриці передування
- •Приклади виконання розбору пропозицій вхідної мови
- •Реалізація синтаксичного розпізнавача. Розбиття на модулі
- •Модуль опису матриці передування і правил граматики
- •Модуль структур даних для синтаксичного аналізу і реалізації алгоритму «зсув -згортка»
- •Текст програми розпізнавача
- •Висновки по виконаній роботі
- •Синтаксично керований переклад
- •Способи внутрішнього представлення програм
- •Багатоадресний код з неявно іменованим результатом (тріади)
- •Схеми су-перекладу
- •Загальні принципи оптимізації коду
- •Принципи оптимізації лінійних ділянок
- •Згортка об'єктного коду
- •Виключення зайвих операцій
- •Загальний алгоритм генерації й оптимізації об'єктного коду
- •Вимоги до виконання роботи Порядок виконання роботи
- •Приклад виконання роботи
- •Побудова схем су-перекладу
- •Реалізація генератора списку тріад Розбиття на модулі
- •Модуль опису допустимих типів тріад
- •Модуль опису структур даних для тріад
- •Модуль побудови списку тріад по дереву синтаксичного розбору
- •Модуль обчислення значень тріад на етапі компіляції
- •Модуль, що реалізує алгоритми оптимізації
- •Текст програми генератора списку тріад
- •Висновки по проробленій роботі
Текст програми генератора списку тріад
Крім перерахованих модулів необхідний ще модуль, що забезпечує інтерфейс із користувачем. Цей модуль (FormLab4) реалізує графічне вікно TLab4Form на основі класу TForm бібліотеки VCL і містить у собі дві складові:
файл програмного коду (файл FormLab4. pas);
файл опису ресурсів користувальницького інтерфейсу (файл FormLab4.dfm).
Модуль FormLab4 побудований на основі модуля FomLab3, що використовувався для реалізації інтерфейсу з користувачем у лабораторній роботі № 3. Він містить всі дані, керуючі й інтерфейсні елементи, які були використані в лабораторних роботах № 2 і 3. Такий підхід виправданий, оскільки першим етапом лабораторної роботи № 4 є лексичний аналіз, що виконується модулями, створеними для лабораторної роботи № 2, а другим етапом - синтаксичний аналіз, що виконується модулями, створеними для лабораторної роботи № 3.
Крім даних, використовуваних для виконання лексичного й синтаксичного аналізу тому, що це було описано в лабораторних роботах №2 і 3,модуль містить поле listTriad, яке являє собою список тріад. Цей список ініціалізується при створенні інтерфейсної форми й знищується при її закритті. Він також очищається кожен раз, коли запускаються процедури лексичного й синтаксичного аналізу.
Крім органів керування, використаних у лабораторній роботі № 3, інтерфейсна форма, описана в модулі FormLab4, містить органи керування для генератора списку тріад лабораторної роботи №4:
у багатосторінковій вкладці (PegeControl1) з'явилася нова закладка (SheetTrlad) за назвою «Тріади»;
на закладці SheetTriad розташовані інтерфейсні елементи для висновку й перегляду списків тріад (група із заголовком і список рядків для відображення кожного списку тріад):
GroupTriadAll і ListTriadAll - для відображення повного списку тріад, побудованого до застосування алгоритмів оптимізації;
GroupTriadConst і ListTriadConst - для відображення списку тріад, побудованого після оптимізації методом згортки об'єктного коду;
GroupTriadSame і ListTriadSame - для відображення списку тріад, побудованого після оптимізації методом виключення зайвих операцій.
на тій же закладці SheetTriad розташовані два сплиттера для керування розмірами списків тріад;
на першій закладці SheetFile («Вихідний файл») з'явилися два додаткових органи керування - прапорці із двома станами («порожньо» або «відзначене»):
CheckDel_C - при установці цього прапорця тріади типу С видаляються зі списку тріад після виконання оптимізації методом згортки об'єктного коду;
CheckDelSаmе - при установці цього прапорця тріади типу same видаляються зі списку тріад після виконання оптимізації методом виключення зайвих операцій.
Зовнішній вигляд нової закладки інтерфейсної форми TLab4Form наведений на мал. 4.3. Читання вмісту вхідного файлу організовано точно так само, як у лабораторній роботі № 2.
Після читання файлу виконується лексичний аналіз, як це було описано в лабораторній роботі № 2, а потім, при успішному виконанні лексичного аналізу, синтаксичний аналіз, як це було описано в лабораторній роботі № 3.
Якщо синтаксичний аналіз виконаний успішно, отримана в результаті його виконання змінна symbRes указує на корінь побудованого синтаксичного дерева. Тоді, після того як синтаксичне дерево відобразиться на екрані за допомогою функції МаkеТгее, викликається функція побудови списку тріад по синтаксичному дереву MakeTriadList (з модуля TrdMake). Список тріад запам'ятовується в список listTriad, а результат виконання функції - у тимчасову змінну lехтmр.
Рис. 4.3. Зовнішній вигляд четвертої закладки інтерфейсної форми для лабораторної роботи № 4
Якщо змінна lexTmp після побудови списку тріад містить непусте посилання на лексему, це значить, що вихідна програма містить семантичну помилку. Лексема, на яку вказує lexTmp, визначає місце, де виявлена помилка. У цьому випадку список рядків позиціонується на місце помилки й користувачеві видається відповідне повідомлення.
Інакше, якщо змінна lexTmp після побудови списку тріад містить порожнє посилання (nil), це значить, що побудова списку тріад виконано без помилок, і список listTriad містить всі побудовані тріади в порядку їхнього проходження. Список тріад відображається на екрані в списку рядків ListTriadAll, після чого виконується оптимізація методом згортки об'єктного коду - викликається процедура OptimizeConst. Якщо встановлено прапорець CheckDel_C, то після оптимізації методом згортки об'єктного коду зі списку тріад віддаляються тріади типу С (викликається функція DelTriadTypes з параметром TRD_CONST), після чого список тріад відображається в списку рядків ListTriadConst, потім виконується оптимізація методом виключення зайвих операцій - викликається процедура OptimizeSame. Якщо встановлено прапорець CheckDelSame, то після оптимізації методом виключення зайвих операцій зі списку тріад віддаляються тріади типу same (викликається функція DelTriadTypes з параметром TRD_SAME), після чого список тріад відображається в списку рядків ListTriadSame.
Повний текст програмного коду модуля інтерфейсу з користувачем і опис ресурсів користувальницького інтерфейсу можна знайти в архіві, що розташовується на веб-сайті видавництва, у файлах FormLab4. pas і FormLab4.dfm відповідно.
Повний текст всіх програмних модулів, що реалізують розглянутий приклад для лабораторної роботи № 4, можна знайти в архіві, що розташовується на веб-сайті видавництва, у підкаталогах LABS і COMMON (у підкаталог COMMON винесені ті програмні модулі, вихідний текст яких не залежить від вхідної мови й завдання по лабораторній роботі). Головним файлом проекту є файл LAB4.DPR у підкаталозі LABS. Крім того, текст модуля Triads наведений у лістингу ПЗ.10, а текст модуля TrdOpt - у лістингу П3.11 у додатку 3.
