- •Лабораторна робота № 2 Проектування лексичного аналізу
- •Граматики передування
- •Алгоритм «зсув-згортка» для граматик операторного передування
- •Вимоги до виконання роботи Порядок виконання роботи
- •Вимоги до оформлення звіту Звіт повинен містити наступні розділи:
- •Основні контрольні питання
- •Варіанти завдань Варіанти початкових граматик
- •Початкові граматики і типи допустимих лексем
- •Приклад виконання роботи Завдання для прикладу
- •Побудова матриці операторного передування Побудова множини крайніх правих і крайніх лівих символів
- •Побудова множини крайніх правих і крайніх лівих термінальних символів
- •Заповнення матриці передування
- •Приклади виконання розбору пропозицій вхідної мови
- •Реалізація синтаксичного розпізнавача. Розбиття на модулі
- •Модуль опису матриці передування і правил граматики
- •Модуль структур даних для синтаксичного аналізу і реалізації алгоритму «зсув -згортка»
- •Текст програми розпізнавача
- •Висновки по виконаній роботі
- •Синтаксично керований переклад
- •Способи внутрішнього представлення програм
- •Багатоадресний код з неявно іменованим результатом (тріади)
- •Схеми су-перекладу
- •Загальні принципи оптимізації коду
- •Принципи оптимізації лінійних ділянок
- •Згортка об'єктного коду
- •Виключення зайвих операцій
- •Загальний алгоритм генерації й оптимізації об'єктного коду
- •Вимоги до виконання роботи Порядок виконання роботи
- •Приклад виконання роботи
- •Побудова схем су-перекладу
- •Реалізація генератора списку тріад Розбиття на модулі
- •Модуль опису допустимих типів тріад
- •Модуль опису структур даних для тріад
- •Модуль побудови списку тріад по дереву синтаксичного розбору
- •Модуль обчислення значень тріад на етапі компіляції
- •Модуль, що реалізує алгоритми оптимізації
- •Текст програми генератора списку тріад
- •Висновки по проробленій роботі
Модуль структур даних для синтаксичного аналізу і реалізації алгоритму «зсув -згортка»
Модуль
містить реалізацію алгоритму «зсув
-згортка» і описи всіх структур даних,
необхідних для цієї реалізації. Оскільки
сам алгоритм «зсув –згортка» не залежить
від вхідної мови, реалізуючий його
модуль також не залежить від вхідної
мови і правил початкової граматики
(вони спеціально винесені в окремий
модуль). Основу модуля складають наступні
структури даних:
TSynblnfo — опис двох типів символів граматики: термінальних і нетермінальних;
TSіnbol — опис всіх даних, пов'язаних з поняттям «Символ граматики»;
TSSteck - опис синтаксичного стека.
Структура ТSynblnfo містить інформацію про тип символу граматики — поле SynbType, яке може приймати два значення: SYМB_LEX (термінальний символ) або SYМB_SYNT (нетермінальний символ), і додаткові дані:
посилання на лексему (LexOne) -для термінального символу:
перелік всіх складових (LexLіst) - для нетермінального символу.
Перелік всіх складових нетермінального символу LexLіst побудований на основі динамічного масиву (тип TList з бібліотеки VCL системи програмування Delphi 5). До нього вносяться посилання на символи, на підставі яких створений даний символ, в тому порядку, в якому вони слідують в правилі граматики.
Структура TSіnbol містить інформацію про символ (поле Synbіnfo типу TSynblnfo), а також номер правила граматики, на підставі якого створений символ (поле даних IRuleNum). Для термінальних символів номер правила рівний 0, для нетермінальних символів він може бути від 1 до 13.
Окрім цих даних структура містить методи, необхідні для роботи з символами граматики:
конструктор Createlex для створення термінального символу на основі лексеми;
конструктор CreateSymb для створення нетермінального символу на основі правила граматики і масиву початкових символів;
деструкцію Destroy для звільнення зайнятої пам'яті при видаленні символу (при видаленні нетермінального символу віддаляються всі посилання на його складові і динамічний масив для їх зберігання):
функції, процедури і властивості для роботи з інформацією, які зберігаються в структурі даних.
Оскільки в полі даних Synblnfo структури TSymbol зберігаються всі посилання на складові символи, всередині яких, у свою чергу, можуть зберігатися посилання на їх складові і т. д., то на основі структури TSymbol можна побудувати повне синтаксичне дерево розбору.
Третя структура даних TSymbSteck побудована на основі динамічного масиву типу TLіst з бібліотеки VCL системи програмування Delphi 5. Вона призначена для того, щоб моделювати синтаксичний стек МП- автомата. У цій структурі немає ніяких даних (використовуються тільки дані, успадковані від класу TLіst). але з нею пов'язані методи, необхідні для роботи синтаксичного стеку:
функція очищення стека (Clear) і деструкція для звільнення пам'яті при видаленні стека (Destroy);
функція доступу до символів в стеку починаючи від вершини (GetSymbol);
функція для приміщення в стек чергової вхідної лексеми (Push), при цьому лексема перетвориться в термінальний символ;
функція, що повертає саму верхню лексему в стеку (TopLexem), при цьому нетермінальні символи ігноруються;
функція, що виконує згортку (MakeTopSymb), одержану в результаті згортки, розміщується на вершину стека.
Крім трьох перерахованих раніше структур даних в модулі SyntSynb описана також функція BuildSyntList, що моделює роботу алгоритму «зсув-згортка» для граматик операторного передування. Вхідними даними для функції є список лексем (listLex), який повинен бути заповнений в результаті лексичного аналізу, і синтаксичний стек (synbStecfc), який на початку виконання функції повинен бути порожній. Результатом функції є:
нетермінальний символ (що посилається на корінь синтаксичного дерева), якщо розбір був виконаний успішно;
термінальний символ, що посилається на лексему, де була виявлена помилка, якщо розбір виконаний з помилками.
Функція BuildSyntList моделює алгоритм «зсув-згортка» для граматик операторного передування так, як він був описаний в розділі «Короткі теоретичні відомості».
