- •Курсова робота
- •Виконав ст. Гр. Кі-35:
- •Завдання на курсову роботу:
- •Анотація
- •1. Огляд методів та способів проектування трансляторів 7
- •Огляд методів та способів проектування трансляторів
- •Формальний опис вхідної мови програмування
- •Деталізований опис вхідної мови в термінах розширеної нотації Бекуса-Наура(Backus/NaurForm - bnf).
- •2.2.Термінальні символи та ключові слова
- •Розробка транслятора вхідної мови програмування
- •Вибір технології програмування
- •Проектування таблиць транслятора
- •Розробка лексичного аналізатора
- •Опис лексичного аналізатора
- •3.3.2. Розробка граф-схеми алгоритму
- •Розробка синтаксичного та семантичного аналізатора
- •Опис синтаксичного аналізатора
- •Повне дерево граматичного розбору
- •Розробка генератора коду
- •Опис генератора коду
- •Опис програми(в тому числі граф-схем)
- •Опис інтерфейсу та інструкція користувачеві
- •Відлагодження та тестування програми
- •Виявлення лексичних помилок.
- •Список літератури
- •Додаток а. Лістингпрограми.
- •Додаток б. Приклад програми із лексичними та синтаксичними помилками та текст файлу з повідомленням про помилки.
- •Додаток в. Приклад коректної програми та результат її виконання.
- •Додаток г. Граф-схема алгоритму виконання програми через використання функцій.
1. Огляд методів та способів проектування трансляторів 7
2. Формальний опис вхідної мови програмування 12
2.1. Деталізований опис вхідної мови в термінах розширеної нотації Бекуса-Наура(Backus/NaurForm - BNF). 12
2.2.Термінальні символи та ключові слова 13
3. Розробка транслятора вхідної мови програмування 14
3.1. Вибір технології програмування 14
3.2. Проектування таблиць транслятора 14
3.3. Розробка лексичного аналізатора 15
3.3.1. Опис лексичного аналізатора 15
3.3.2. Розробка граф-схеми алгоритму 17
3.4. Розробка синтаксичного та семантичного аналізатора 18
3.4.1. Опис синтаксичного аналізатора 18
3.4.2. Повне дерево граматичного розбору 20
3.5. Розробка генератора коду 21
3.5.1. Опис генератора коду 21
4. Опис програми(в тому числі граф-схем) 22
4.1. Опис інтерфейсу та інструкція користувачеві 26
5. Відлагодження та тестування програми 27
5.1. Виявлення лексичних помилок. 27
5.2. Виявлення синтаксичних помилок. 27
5.3. Виявлення семантичних помилок. 27
5.4. Загальна перевірка коректності роботи транслятора. 27
Висновки 28
Список літератури 29
ДОДАТОК А. Лістингпрограми. 30
ДОДАТОК Б. Приклад програми із лексичними та синтаксичними помилками та текст файлу з повідомленням про помилки. 61
ДОДАТОК В. Приклад коректної програми та результат її виконання. 62
ДОДАТОК Г. Граф-схема алгоритму виконання програми через використання функцій. 70
Вступ
Транслятором називається програма перекладу (трансляції) початкової програми, записаною вхідною мовою, в еквівалентну їй об`єктну програму.
Компілятори дозволяють створювати об`єктні модулі, які пізніше, після етапу зв`язування відлагоджувачем, перетворюються у виконавчі файли.
Потреба різноманіття компіляторів дуже важлива, це прямо залежить від вхідної мови, яку він перекладає. Кожна з них реалізує клас задач, необхідних для користувача.
Кажучи простіше, існує виконавець – автомат або персональна ЕОМ, що вміє реалізувати скінчений набір дій. Наказ на виконання дії з вказаного набору, що виражається певним, раніше обумовленим способом, називається розпорядженням, а вся сукупність допустимих наказів – системою розпорядження виконавця.
Саме програма на певній мові програмування є вхідним даним для компілятора, що разом з відлагоджувачем перекладає послідовність команд у спеціальні машинні коди і здійснює виконання вхідної послідовності команд запуском відповідного виконавчого файлу.
Метою виконання курсової роботи є закріплення теоретичних знань та практичних навичок системного програмування, набутих при вивченні дисципліни “Системне програмування”.
Огляд методів та способів проектування трансляторів
Транслятор - обслуговуюча програма, що перетворює вихідну програму, надану на вхідній мові програмування, у робочу програму, представлену на об'єктному мовою.
Наведене визначення відноситься до всіх різновидів транслюють програм. Однак у кожної з таких програм можуть бути свої особливості щодо організації процесу трансляції. В даний час транслятори поділяються на три основні групи: асемблери, компілятори та інтерпретатори.
Асемблер - системна обслуговуюча програма, яка перетворить символічні конструкції в команди машинної мови. Специфічною рисою асемблером є те, що вони здійснюють дослівну трансляцію однієї символічної команди в одну машинну. Таким чином, мова асемблера (ще називається автокодом) призначена для полегшення сприйняття системи команд комп'ютера і прискорення програмування в цій системі команд.
Компілятор - це обслуговуюча програма, що виконує трансляцію на машинну мову програми, записаної мовою оригіналу програмування. Також як і асемблер, компілятор забезпечує перетворення програми з однієї мови на іншу (найчастіше, в мову конкретного комп'ютера). Разом з тим, команди вихідної мови значно відрізняються з організації та потужності від команд машинної мови. Існують мови, в яких одна команда вихідного мови транслюється в 7-10 машинних команд. Однак є й такі мови, в яких кожній команді може відповідати 100 і більше машинних команд (наприклад, Пролог). Крім того, у вихідних мовах до часто використовується строга типізація даних, що здійснюється через їх попередній опис.
Інтерпретатор - програма або пристрій, що здійснює пооператорну трансляцію і виконання вихідної програми. На відміну від компілятора, інтерпретатор не породжує на виході програму на машинній мові. Розпізнавши команду вихідного мови, він тут же виконує її. Як у компіляторах, так і в інтерпретатора використовуються однакові методи аналізу вихідного тексту програми. Але інтерпретатор дозволяє почати обробку даних після написання навіть однієї команди. Це робить процес розробки і налагодження програм більш гнучким. Крім того, відсутність вихідного машинного коду дозволяє не "захаращувати" зовнішні пристрої додатковими файлами, а сам інтерпретатор можна досить легко адаптувати до будь-яких машинних архітектур, розробивши його тільки один раз на широко поширеному мовою програмування.
Емулятор - програма або програмно-технічний засіб, що забезпечує можливість без перепрограмування виконувати на даній ЕОМ програму, що використовує коди чи способи виконання операція, відмінні від даної ЕОМ. Емулятор схожий на інтерпретатор тим, що безпосередньо виконує програму, написану на деякій мові. Однак, частіше за все це машинна мова або проміжний код. І той і інший представляють команди в двійковому коді, які можуть виконуватися відразу після розпізнавання коду операцій. На відміну від текстових програм, не потрібно розпізнавати структуру програми, виділяти операнди.
Кодувач - програма або програмне пристрій, що переводять програми, написані на машинному мовою однієї ЕОМ до програм на машинну мову іншої ЕОМ. Якщо емулятор є менш інтелектуальним аналогом інтерпретатора, то кодувач виступає в тій же якості по відношенню до компілятору. Точно так вихідний (і зазвичай двійковий) машинний код або проміжне уявлення перетворюються в інший аналогічний код по одній команді і без будь-якого загального аналізу структури вихідної програми. Кодувачі бувають корисні при переносі програм з одних комп’ютерних архітектур на інші. Вони можуть також використовуватися для відновлення тексту програми на мові високого рівня з наявного бінарного коду.
Макропроцесори - програма, що забезпечує заміну однієї послідовності символів іншої. Це різновид компілятора. Він здійснює генерацію вихідного тексту шляхом обробки спеціальних вставок, які розташовуються у вихідному тексті. Ці вставки оформлюються спеціальним чином і належать конструкціям мови, званого макромовою.
Макропроцесори підвищують ефективність програмування без зміни синтаксису і семантики мови.
Синтаксис - сукупність правил деякої мови, що визначають формування його елементів. Інакше кажучи, це сукупність правил освіти семантично значущих послідовностей символів в даній мові. Синтаксис задається за допомогою правил, які описують поняття деякоїмови. Прикладами понять є: змінна, вираз, оператор, процедура.
Семантика - правила та умови, що визначають співвідношення між елементами мови та їх смисловими значеннями, а також інтерпретацію змістовного значення синтаксичних конструкцій мови. Об'єкти мови програмування не тільки розміщуються в тексті у відповідності з певною ієрархією, а й додатково пов'язані між собою.
Всі мови програмування мають ряд загальних характеристик і параметрів.. Ця спільність визначає і схожі для всіх мов принципи організації трансляторів.
Мови програмування призначені для полегшення програмування. Тому їхні оператори та структури даних більш потужні, ніж в машинних мовах.
Для підвищення наочності програм замість числових кодів використовуються символічні або графічні представлення конструкцій мови, більш зручні для їх сприйняття людиною.
Для будь-якої мови визначається:
набір символів, які можна використовувати для запису правильних програм (алфавіт), основні елементи.
Набірправильних програм (синтаксис).
"Сенс" кожної правильної програми (семантика).
Незалежно від специфіки мови будь-який транслятор можна вважати функціональним перетворювачем F, що забезпечує однозначне відображення X в Y, де X - програма мовою оригіналу, Y - програма на вихідному мовою.
З огляду на схожість компілятора й інтерпретатора, розглянемо фази, що існують в компіляторі. У них виділяються:
Фаза лексичного аналізу.
Фаза синтаксичного аналізу, що складається з:
розпізнавання синтаксичної структури;
семантичного аналізу, в процесі якого здійснюється робота з таблицями, породження проміжного семантичного подання або об'єктної моделі мови.
Фаза генерації коду, що здійснює:
семантичний аналіз компонент проміжного подання або об'єктної моделі мови;
переклад проміжного подання або об'єктної моделі в об'єктний код.
Поряд з основними фазами процесу трансляції можливі також додаткові фази:
Фаза дослідження та оптимізації проміжного представлення, що складається з:
аналізу коректності проміжного представлення;
оптимізації проміжного представлення.
3а. Фаза оптимізації об’єктного коду.
Узагальнена структура компілятора, що враховує існуючі в ньому фази, представлена на рис. 1.1:
Рис. 1.1 - Узагальнена структура аналізатора
Він складається з лексичного аналізатора, синтаксичного аналізатора, генератора коду, аналізатора помилок. У інтерпретаторі замість генератора коду використовується емулятор, до якого, крім елементів проміжного представлення, передаються вихідні дані.
