Національний університет “Львівська Політехніка”
Кафедра “Електронні обчислювальні машини”
КУРСОВИЙ ПРОЕКТ
на тему: „Розробка та реалізація компонент системного
програмного забезпечення”
Львів 2005
Анотація
В курсовому проекті розроблено компілятор з простої мови програмування .
Компілятор розроблений в середовищі програмування Borland C/C++ на мові С, та поданий у пояснювальній записці, а також в електронному варіанті. В пояснювальній записці подано огляд існуючих методів розробки компіляторів, детальний опис мови, а також описано процес розробки програми компілятора на рівні блок-схем ексту програми. В додатку міститься текст компілятора, а також результати тестування програми.
Завдання на курсовий проект
Розробити транслятор заданої вхідної мови програмування, до якої висуваються наступні базові вимоги :
Кожна програма починається зі слова start і закінчується словом stop. Все що до start і після stop не аналізується. Наприклад як у мові Паскаль begin end.
Програма має надавати можливість працювати зі змінними. Змінні перед використанням мають бути попередньо оголошені за наступним форматом: “тип даних” “змінна1”, “змінна2”; Наприклад int x,y;
Присвоєння до змінних виконується оператором присвоєння :=. Наприклад x:=y+5;
Програма має надавати можливість працювати з константами. Константи ініціюються наступним чином: “константа” = “число;”. Наприклад а=3;
Ввід даних зі стандартного вводу відбувається оператором input(), а вивід оператором output(). Наприклад input(x); output (y).
Програма має працювати з типом даних char, int.
Програма має виконувати операції EMBED Equation.3 ,&,~,>
Програма має надавати можливість використовувати оператор case (Pascal)
Програма має надавати можливість працювати з масивами.
Вихідною мовою трансляції є мова С.
Математичний вираз має бути розібраний в залежності від пріоритету виконання та розписаний викликом власних С функцій.
Цільова мова компілятора: ANSI C. Для отримання виконавчого файлу на виході розробленого компілятора скористатися програмою bcc.exe. Мова розробки компілятора: ANSI C. Реалізувати інтерфейс командного рядка. На вхід розробленого компілятора має подаватися текстовий файл, написаний на заданій мові програмування. На виході розробленого компілятора мають з’являтися чотири файли: файл з повідомленнями про помилки (або про їх відсутність), файл на мові СІ, об’єктний та виконавчий файли.
Назва вхідної мови програмування утворюється від першої букви у прізвищі студента та номеру його варіанту. Саме таке розширення повинні мати текстові файли, написані на цій мові програмування.
Зміст
Анотація……………………………………………………………………….……………..2
Завдання на курсовий проект....................................................................................3
Формальний опис вхідної мови програмування.......................................................5
Розробка компілятора вхідної мови програмування...............................................7
Формальний опис вхідної мови програмування.................................................7
2.1.1Повне дерево граматичного розбору………………………….………………….9
Розробка лексичного аналізатора....................................................................11
Розробка синтаксичного аналізатора...............................................................13
Розробка генератора коду.................................................................................15
Відладка та тестування компілятора......................................................................16
Висновки...................................................................................................................17
Література.................................................................................................................18
Додаток А. Текст програми………………………………………………..……..................19
Додаток Б. Тестові програми ........................................................................................31
Аналітичний розділ
Компілятор – програма, яка зчитує текст програми, що написана на одній мові –вхідній, і транслює (переводить) його в еквівалентний текст на іншій мові –
цільовій. Процес компіляціі складається з двох частин: аналізу та синтезу.
Аналіз – це розбиття вхідної програми на складові частини та створення її проміжного представлення. Синтез – це процес конструювання потрібної цільової програми із проміжного представлення. Стосовно компіляції аналіз поділяють на три фази – лінійного, ієрархічного та семантичного аналізу.
Під час лінійного аналізу потік символів вхідної програми зчитується зліва направо і групується у токени (token) – послідовності символів із певним спільним значенням. Тобто токеном є сукупність символів із певним логічним значенням. Сукупність символів, що формує токен – це лексема.
Фаза ієрархічного аналізу передбачає процес, коли символи чи токени ієрархічно групуються у вкладені конструкції із спільним значенням.
Семантичний аналіз – перевіряє коректність спільного розташування компонентів програми. Лінійний аналіз – це, власне, і є лексичний аналіз або сканування. Лексичний аналізатор – це, відповідно, програма, котра втілює принципи такого лінійного аналізу. Для прикладу розглянемо таку конструкцію:
point = init + var * 23
Отримавши таку інструкцію лексичний аналізатор згрупує наступні послідовності символів, токени:
1. ідентифікатор point.
2. символ присвоєння =.
3. ідентифікатор init.
4. знак додавання.
5. ідентифікатор var.
6. знак множення.
7. число 23.
Пробіли, що розділяють токени, зазвичай ігноруються.
Коротко роботу лексичного аналізатора можна описати так: аналізатор зчитує символи із вхідного потоку, групує їх в лексеми та передає токени, які створені цими лексемами, разом з їх атрибутами синтаксичному аналізатору.
Стосовно методів лексичний анлізатор можна поділити на прямий а непрямий лексичний аналізатор. Непрямий лексичний аналіз полягає у послідовній перевірці лексем на відповідність токенам. Якщо аналізатор не „впізнає” в поточній лексемі один з токенів, то відбувається повернення у потоці вхідних символів і здійснюється перевірка на відповідність наступному токену. А прямий лексичний аналіз дозволяє визначити відповідний токен без повернення в потоці вхідних символів.
Непрямий лексичний аналізатор як програма на мові високого рівня складається із окремих функцій, кожна з яких розпізнає лише одну лексему.
Такі функції мають схожу структуру та відрізняються, в основному, тільки лексемою, що потрібна для порівняння із вхідною. Функції викликаються в певному порядку, що визначається перевагою в аналізі одних лексем перед іншими. Наявність приорітету пояснються тим, що деякі лексеми мають подібні початкові символи і деякі лексеми можуть складатися із простіших лексем.
Прямий лексичний аналізатор як програма складається із функцій, що розпізнають окремі лексеми. Така програма зчитує один вхідний символ на кожному кроці і передає його функції, яка може розпізнати лексему чи сформувати помилку. Для лексем, що мають подібні послідовності символів, існують функції, які розпізнають саме ці послідовності. В цих функціях реалізовані інші функції, що розпізнають решту символів у лексемах. Повідомлення про помилку може бути згенеровано тоді, коли не знайдено відповідної послідовності символів.
2. Розробка компілятора вхідної мови програмування
2.1. Формальний опис вхідної мови програмування
Одною з перших задач, що виникають при побудові компілятора, є визначення вхідної мови програмування. Для цього я використовую розширену нотацію Бекуса-Наура (Backus/Naur Form - BNF).
Перелік термінальних символів та ключових слів