- •Лабораторна робота № 2 Проектування лексичного аналізу
- •Граматики передування
- •Алгоритм «зсув-згортка» для граматик операторного передування
- •Вимоги до виконання роботи Порядок виконання роботи
- •Вимоги до оформлення звіту Звіт повинен містити наступні розділи:
- •Основні контрольні питання
- •Варіанти завдань Варіанти початкових граматик
- •Початкові граматики і типи допустимих лексем
- •Приклад виконання роботи Завдання для прикладу
- •Побудова матриці операторного передування Побудова множини крайніх правих і крайніх лівих символів
- •Побудова множини крайніх правих і крайніх лівих термінальних символів
- •Заповнення матриці передування
- •Приклади виконання розбору пропозицій вхідної мови
- •Реалізація синтаксичного розпізнавача. Розбиття на модулі
- •Модуль опису матриці передування і правил граматики
- •Модуль структур даних для синтаксичного аналізу і реалізації алгоритму «зсув -згортка»
- •Текст програми розпізнавача
- •Висновки по виконаній роботі
- •Синтаксично керований переклад
- •Способи внутрішнього представлення програм
- •Багатоадресний код з неявно іменованим результатом (тріади)
- •Схеми су-перекладу
- •Загальні принципи оптимізації коду
- •Принципи оптимізації лінійних ділянок
- •Згортка об'єктного коду
- •Виключення зайвих операцій
- •Загальний алгоритм генерації й оптимізації об'єктного коду
- •Вимоги до виконання роботи Порядок виконання роботи
- •Приклад виконання роботи
- •Побудова схем су-перекладу
- •Реалізація генератора списку тріад Розбиття на модулі
- •Модуль опису допустимих типів тріад
- •Модуль опису структур даних для тріад
- •Модуль побудови списку тріад по дереву синтаксичного розбору
- •Модуль обчислення значень тріад на етапі компіляції
- •Модуль, що реалізує алгоритми оптимізації
- •Текст програми генератора списку тріад
- •Висновки по проробленій роботі
Текст програми розпізнавача
Крім перерахованих вище модулів необхідний ще модуль, що забезпечує інтерфейс з користувачем. Цей модуль (FornLab3) реалізує графічне вікно TLab3Form на основі класу TForm бібліотеки VCL і включає дві складові:
файл програмного коду (файл FormLab3.pas);
файл опису ресурсів призначеного для користувача інтерфейсу (файл FormLab3.dfm)
Модуль FormLab3 побудований на основі модуля FormLab2, який використовувався для реалізації інтерфейсу з користувачем в лабораторній роботі № 2. Він містить всі дані, керуючі елементи і інтерфейсні елементи , які були використані в лабораторній роботі № 2. Оскільки першим етапом лабораторної роботи № 3 є лексичний аналіз, який виконується модулями, створеними для лабораторної роботи № 2.
Окрім даних, використовуваних для виконання лексичного аналізу так, як це було описано в лабораторній роботі № 2, модуль містить поле synbStack, яке є синтаксичним стеком, використовуваним для виконання синтаксичного аналізу. Цей стек ініціалізувався при створенні інтерфейсної форми і знищується при її закритті. Він також очищається всякий раз, коли запускаються процедури лексичного і синтаксичного аналізу.
Окрім органів управління, використаних в лабораторній роботі № 2, інтерфейсна форма, описана в модулі FormLab3 , містить органи керування для синтаксичного аналізатора лабораторної роботи № 3:
в багатосторінковій вкладці (PageControll) з’явилася нова закладка (SheetSynt) з назвою «Синтаксис»;
на закладці SheetSynt розташований інтерфейсний елемент для проглядання ієрархічних структур (TreeSynt типу TTreeView).
Зовнішній вигляд нової закладки інтерфейсної форми TLab3Form приведений на мал 3.3.
Читання вмісту вхідного файлу організоване так само, як в лабораторній роботі № 2 .
Після читання файлу виконується лексичний аналіз, як це було описано в лабораторній роботі № 2.
Якщо лексичний аналіз виконаний успішно, то в список лексем listLex додається інформаційна лексема, що позначає кінець рядка, після чого викликається функція виконання синтаксичного аналізу BuildSyntList на вхід якої подаються список лексем (ListLex) і синтаксичний стек (symbStack). Результат виконання функції запам'ятовується в тимчасовій змінній symbRes.
Якщо змінна symbRes містить посилання на лексему, це означає, що синтаксичний аналіз виконаний з помилками і ця лексема якраз указує на те місце, де була виявлена помилка. Тоді список рядків вхідного файлу позиціонується на вказане місце помилки, а користувачеві видається повідомлення про помилку. Інакше, якщо помилок не виявлено, змінна symbRes указує на корінь побудованого синтаксичного дерева. Тоді інтерфейсний елемент TreeSynt записується посилання на корінь синтаксичного дерева, після чого все дерево відображається на екрані за допомогою функції MakeTree.
Функція MakeTree забезпечує рекурсивне відображення синтаксичного дерева в інтерфейсному елементі типу TTreeVіew Елемент типу TTrееVіew є стандартним інтерфейсним елементом в ОС типу Windows для відображення ієрархічних структур (наприклад він використовується для відображення файлової структури).
Мал. 3.3. Зовнішній вигляд третьої закладки інтерфейсної форми для лабораторної роботи № 3
Повний текст програмного коду модуля інтерфейсу з користувачем та опис ресурсів призначеного для користувача інтерфейсу знаходяться в архіві, що знаходиться на веб-сайті видавництва, в файлах FormLab3.pas і Formlab3.dtm відповідно.
Повний текст всіх програмних модулів, що реалізовують розглянутий приклад для лабораторної роботи № 3, можна знайти в архіві, що знаходиться на веб-сайті видавництва, в підкаталогах LABS та COMMON (у підкаталог COMMON винесені ті програмні модулі, початковий текст яких не залежить від вхідної мови і завдання по лабораторній роботі). Головним файлом проекту є файл LAB3.DPR у підкаталозі LAB6. Крім того, текст модуля SyntSymb приведений в лістингу П3.7 в додатку 3.
