- •Лабораторна робота № 2 Проектування лексичного аналізу
- •Граматики передування
- •Алгоритм «зсув-згортка» для граматик операторного передування
- •Вимоги до виконання роботи Порядок виконання роботи
- •Вимоги до оформлення звіту Звіт повинен містити наступні розділи:
- •Основні контрольні питання
- •Варіанти завдань Варіанти початкових граматик
- •Початкові граматики і типи допустимих лексем
- •Приклад виконання роботи Завдання для прикладу
- •Побудова матриці операторного передування Побудова множини крайніх правих і крайніх лівих символів
- •Побудова множини крайніх правих і крайніх лівих термінальних символів
- •Заповнення матриці передування
- •Приклади виконання розбору пропозицій вхідної мови
- •Реалізація синтаксичного розпізнавача. Розбиття на модулі
- •Модуль опису матриці передування і правил граматики
- •Модуль структур даних для синтаксичного аналізу і реалізації алгоритму «зсув -згортка»
- •Текст програми розпізнавача
- •Висновки по виконаній роботі
- •Синтаксично керований переклад
- •Способи внутрішнього представлення програм
- •Багатоадресний код з неявно іменованим результатом (тріади)
- •Схеми су-перекладу
- •Загальні принципи оптимізації коду
- •Принципи оптимізації лінійних ділянок
- •Згортка об'єктного коду
- •Виключення зайвих операцій
- •Загальний алгоритм генерації й оптимізації об'єктного коду
- •Вимоги до виконання роботи Порядок виконання роботи
- •Приклад виконання роботи
- •Побудова схем су-перекладу
- •Реалізація генератора списку тріад Розбиття на модулі
- •Модуль опису допустимих типів тріад
- •Модуль опису структур даних для тріад
- •Модуль побудови списку тріад по дереву синтаксичного розбору
- •Модуль обчислення значень тріад на етапі компіляції
- •Модуль, що реалізує алгоритми оптимізації
- •Текст програми генератора списку тріад
- •Висновки по проробленій роботі
Модуль побудови списку тріад по дереву синтаксичного розбору
Модуль Trdмake містить функцію, що будує список тріад на основі дерева синтаксичного розбору. Ця функція працює з типами тріад, описаними в модулі Тгdтуре, і зі структурами даних, описаними в модулі Triads. Дерево синтаксичного розбору описано структурами даних з модуля SyntSymb, що був створений при виконанні лабораторної роботи № 3. Функція побудови списку тріад на основі синтаксичного дерева залежить від вхідної мови, а тому винесено в окремий модуль.
Модуль містить одну функцію, доступну ззовні, - МakeTriadList. Вхідними даними цієї функції є:
symbTop - посилання на корінь синтаксичного дерева, по якому будується список тріад;
listTriad - список, у який повинні бути записані побудовані тріади.
Результатом виконання функції є порожнє посилання, якщо при побудові списку тріад не було виявлено семантичних помилок, або ж посилання на лексему, біля якої виявлена семантична помилка, якщо така помилка виявлена. Генератор списку тріад виявляє один вид семантичних помилок - присвоювання значення константі.
Функція МakeTriadList виконує побудову списку тріад, додає в кінець списку тріад завершальну тріаду типу N0P(No Operation- Немає операції), щоб коректно обробляти посилання на кінець списку тріад, а також забезпечує розміщення прапорів IsLinked для всіх тріад у списку.
Функція МakeTriadList побудована на основі внутрішньої функції модуля Trdмake - МakeTriadList0P, що і виконує головні дії в породженню списку тріад. Ця функція обробляє ті ж вхідні дані й має такий же результат виконання, що й функція МakeTriadList.
Функція МakeTriadList0P реалізує схеми СУ-перекладу, які були розглянуті вище. Вибір схеми СУ-перекладу відбувається по номеру правила остовної граматики G, узятого з поточного нетермінованого символу дерева:
для правил 2 і 5 - схема повного умовного оператора;
для правила 3 - схема неповного умовного оператора,
для правил 4 і 6 - схема оператора присвоювання:
для правил 7,8 і 10 - схема для бінарних лінійних операцій;
для правила 13 - схема для дужок;
в інших випадках - схема для крапки з комою.
Функція МakeTriadList0P містить дві допоміжні функції:
функцію МakeOperand для породження коду, пов'язаного з дочірнім вузлом дерева (одним з операндів);
функцію МakeOperation, що реалізує схему СУ-перекладу для бінарних лінійних операцій залежно від типу операції.
Для побудови коду для низлежачих нетермінованих символів по дереву функції МakeTriadList0P рекурсивно викликає сама себе. Цей виклик реалізований у функції МakeOperand. якщо низлежачий вузол є нетермінованим символом, а також прямо для вузлів, зв'язаних з дужками й із крапкою з комою (як було розглянуто раніше при побудові схем СУ-перекладу).
Модуль обчислення значень тріад на етапі компіляції
Модуль ТrdCalc містить функцію, що викликається, коли необхідно обчислити значення тріади на етапі компіляції. Ця функція потрібна для алгоритму оптимізації методом згортки об'єктного коду. Вона залежить від типів тріад, які залежать від вхідної мови, тому винесено в окремий модуль.
Модуль містить одну-єдину функцію CalcTriad, що гранично проста й у коментарях не має потреби.
