- •Міністерство освіти і науки, молоді та спорту України Національний університет “Львівська політехніка”
- •Розробка системних програмних модулів та компонент систем програмування
- •Розробка системних програмних модулів та компонент систем програмування мета курсової роботи
- •Структура та обсяг курсової роботи
- •Вимоги до оформлення
- •Захист роботи
- •Теоретичні відомості
- •1. Лексичний аналіз
- •1.2.1. Особливості побудови лексичного аналізатора засобами скінченного автомату
- •1.2.2. Приклад побудови лексичного аналізатора засобами скінченного автомату
- •1.2. Побудова лексичного аналізатора засобами скінченного автомату
- •1.3. Інші способи Побудови лексичного аналізатора
- •1.3.1. Побудова лексичного аналізатора засобами регулярних виразів
- •1.3.2. Побудова лексичного аналізатора засобами спеціалізованого програмного забезпечення
- •1.3.3. Приклад файлу з правилами виділення лексем для Flex
- •2. Синтаксичний аналіз
- •2.1. Визначення синтаксичних правил мови програмування за допомогою формул Бекуса-Наура
- •2.1.1. Приклад визначення натуральних чисел за допомогою формул бнф
- •2.1.2. Формули Бекуса-Наура для мови Pascal
- •2.2. Способи побудови синтаксичного аналізатора
- •2.2.1. Низхідний аналіз
- •2.2.2. Приклад низхідного граматичного розбору
- •2.2.3. Розробка низхідного синтаксичного аналізатора
- •2.2.3.1. Опис вхідної мови в термінах нотації Бекуса-Наура
- •2.2.3.2. Розробка дерева граматичного розбору
- •2.2.4. Висхідний аналіз
- •2.2.5. Генератори синтаксичних аналізаторів
- •2.2.6. Приклад тексту специфікації для zubr
- •3. Генератор коду
- •3.1. Загальні принципи генерації коду
- •3.2. Способи внутрішнього представлення програм
- •3.2.1. Багатоадресний код з неявно іменованим результатом (тріади)
- •3.2.2. Постфіксна форма запису операцій (зворотний польський запис)
- •3.2.3. Перетворення з інфіксної нотації в зпз
- •3.3. Обчислення виразів на стековій машині
- •3.4. Генерація коду з використанням співпроцесора
- •Література
- •Завдання на курсову роботу
1.2. Побудова лексичного аналізатора засобами скінченного автомату
1.2.1. Особливості побудови лексичного аналізатора засобами скінченного автомату
При побудові лексичного аналізатора (сканера) всі символи вхідного тексту програми поділяють на символи, що належать будь-яким лексемам, і символи, що розділяють лексеми: пробiли, знаки операцiй i спецiальні символи (новий рядок, знак табуляції). Це дає можливість побудувати скінченний автомат, який видiляє та розпізнає iдентифiкатори, лiтерали i термiнальнi символи (операцiї, ключові слова, тощо), а також видаляє коментарі, прбіли, інші спеціальні символи. Розроблений скінченний автомат можна реалізувати за допомогою операцій обробки рядків реалізованих в стандартних бібліотеках мови С/С++, наприклад, strtok(), strstr(), srtcmp(). При цьому текст вхiдної програми проглядається послiдовно з початку до кінця. При виділенні лексеми вона розпізнається та записується у таблицю лексем за допомогою відповідного номера лексеми, що є унікальним для кожної лексеми із усього можливого їх набору. Це дає можливість наступним фазам компiляції звертатись лексеми не як до послідовності символів, а як до унікального номера лексеми, що значно спрощує роботу синтаксичного аналізатора. Імена ідентифікаторів записуються в таблицю ідентифікаторів з присвоєнням унікальної адреси кожному унікальному ідентифікатору в таблицях лексем і ідентифікаторів. Ця таблиця в подальшому буде використана на етапі генерації коду.
1.2.2. Приклад побудови лексичного аналізатора засобами скінченного автомату
Лексичний аналізатор, що розглядається в прикладі здійснює зчитування вхідного тексту з попередньо видаленими пробілами і символами табуляції. З вхідного тексту програми видаляють коментарі. При цьому, коментарі можуть бути вкладеними, і баланс фігурних дужок може бути порушеним. Для виявлення цих помилок будемо використовувати Стек1 в який будуть поміщатися і вилучатися дужки, і Стек2, який буде містити номер рядка в якому стоять відповідні дужки у Стек1. Вхід аналізатора – текст програми з видаленими пробілами і символами табуляції. Вихід аналізатора - масив, у який треба записати вхідну програму без коментарів і пробілів (Рис. 1.2). Далі здійснюють виявлення не термінальних символів у зчитаному тексті і виведення повідомлення про помилки (рис.1.3).
Рис. 1.2. Граф-схема аналізу вкладених коментарів.
Рис. 1.3. Граф-схема аналізу символів.
Після успішного проходження перших двох етапів генерують таблицю ідентифікаторів (рис.1.4) і таблицю лексем (1.5).
Рис. 1.4. Граф-схема аналізу сегменту даних з генерацією таблиці ідентифікаторів.
Рис. 1.5. Граф-схема аналізу сегменту коду з генерацією таблиці лексем.
Рис.1.6. Перевірка таблиці ідентифікаторів на помилки.
Після генерації таблиці ідентифікаторів її перевіряють на помилки (рис.1.6). При цьому перевіряється коректність синтаксичної будови оголошення ідентифікаторів шляхом аналізу імені та типу кожного ідентифікатора. Якщо ім’я ідентифікатора не може бути виведене з даного алфавіту за даними правилами граматики або таке ім'я вже використовується, то виводиться повідомлення про помилку. Аналіз не зупиняється при знаходженні одної помилки, а відбувається для кожного із ідентифікаторів. Якщо ідентифікатор є константою, перевіряється чи задане значення константі при оголошенні, якщо так - перевіряється правильність заданого значення.
