Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
72
Добавлен:
27.03.2016
Размер:
3.38 Mб
Скачать

Модуль побудови списку тріад по дереву синтаксичного розбору

Модуль 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, що гранично проста й у коментарях не має потреби.