
- •Міністерство освіти і науки, молоді та спорту України Національний університет “Львівська політехніка”
- •Розробка системних програмних модулів та компонент систем програмування
- •Розробка системних програмних модулів та компонент систем програмування мета курсової роботи
- •Структура та обсяг курсової роботи
- •Вимоги до оформлення
- •Захист роботи
- •Теоретичні відомості
- •1. Лексичний аналіз
- •1.2. Побудова лексичного аналізатора засобами скінченного автомату
- •1.2.1. Особливості побудови лексичного аналізатора засобами скінченного автомату
- •1.2.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. Лексичний аналіз
Лексичний аналіз – це перша фаза роботи компілятора чи транслятора довільної мови програмування. Він полягає у перетворенні послідовності символів тексту вхідної програми в послідовність токенів (токен - об'єкт, що утворюється із лексеми в процесі лексичного аналізу). В процесі роботи він вирішує задачі: побудова таблиці ідентифікаторів; побудова таблиці лексем шляхом ідентифікації токенів в тексті вхідної програми; видалення пробілів і коментарів оскiльки вони не мають нiякого впливу на виконання програми, отже ж й на синтаксичний розбір та генерацію коду; передача таблиці ідентифікаторів і таблиці лексем на вхід синтаксичному аналізатору (рис.1).
Рис.1.1. Взаємодія лексичного і синтаксичного аналізаторів
Таблиця ідентифікаторів містить перелік ідентифікаторів, наприклад, назв змінних, функцій. Таблиця лексем містить ідентифіковані токени тексту вхідної програми у форматі внутрішнього представлення. Цей формат може включати таку інформацію:
позиція лексеми в тексті вхідної програми (рядок і стовпець);
тип токена;
лексему;
значення (для чисел, рядкових констант);
адресу ідентифікатора в таблиці ідентифікаторів.
Таблиці лексем і ідентифікаторів можуть бути суміщеними. Приклад таблиці лексем зображено в табл. 1.1.
Крім побудови таблиць лексем і ідентифікаторів лексичний аналізатор генерує вихідний файл з лексичними помилками з зазначенням адреси літералів, які викликали лексичну помилку. Лексичною помилкою є зустріч невідомої лексеми. При виникненні лексичної помилки можливі кілька варіантів реакції на неї:
«режим паніки» - записати повідомлення про помилку у файл і припинити лексичний розбір;
видалення зайвих символів;
вставка пропущених символів;
заміна невірного символу вірним;
перестановка двох сусідніх символів місцями.
Лексичний аналізатор не обов’язково обробляє всю програму до початку всіх інших фаз. Якщо лексичний аналіз не виділяється як окрема фаза компіляції, а є частиною синтаксичного аналізу, то лексична обробка тексту програми виконується по мірі необхідності по запиту синтаксичного аналізатора.
Таблиця 1.1. Таблиця лексем
Рядок |
Токен |
Лексема |
Значення |
Адреса в таблиці ідентифікаторів |
5 |
Vartype |
Int |
0 |
0 |
5 |
Variable |
Var |
0 |
1 |
6 |
Vartype |
Char* |
0 |
0 |
6 |
Variable |
Var |
0 |
2 |
7 |
Variable |
Var |
0 |
1 |
7 |
Assign |
<< |
0 |
0 |
7 |
Num |
Num |
25 |
0 |
8 |
Condition |
If |
0 |
0 |
8 |
Variable |
Var |
0 |
1 |
8 |
Relation |
eq |
0 |
0 |
8 |
Num |
Num |
25 |
0 |
9 |
Variable |
Var |
0 |
2 |
9 |
Assign |
<< |
0 |
0 |
9 |
Literal |
Literal |
“Hello, World” |
|
Зауваження: в колонках «токен» і «лексема» таблиці.1.1 під літеральним позначенням в дійсності стоїть унікальний цифровий ідентифікатор (який може бути заданий за допомогою типу enum мови С), який однозначно ідентифікує токени і лексеми. Наявність літерального позначення лексем і токенів допускається в цілях відлагодження, але є необов’язковою.