http://svm-070/spz/kp.htm КУРСОВИЙ ПРОЕКТ на тему “Розробка та реалізація компонент системного програмного забезпечення” з предмету “Системне програмне забезпечення” (III курс, 6-ий семестр) 1. Завдання на курсовий проект Розробити транслятор заданої вхідної мови програмування, до якої висуваються наступні базові вимоги (табл.1) : Кожна програма починається зі слова (1) і закінчується словом (2). Все що до (1) і після (2) не аналізується. Наприклад як у мові Паскаль begin end. Програма має надавати можливість працювати зі змінними (3). Змінні перед використанням мають бути попередньо оголошені за наступним форматом: “тип даних” “змінна1”, “змінна2”; Наприклад integer x,y; Присвоєння до змінних виконується оператором присвоєння :=. Наприклад x:=y+5; Програма має надавати можливість працювати з константами (4). Константи ініціюються наступним чином: “константа” = “число”. Наприклад а=3; Ввід даних зі стандартного вводу відбувається оператором (5), а вивід оператором (6). Наприклад input x; output (y). Програма має працювати з типом даних (7) Програма має виконувати операції (8). Вихідною мовою трансляції є мова С. 2. Варіанти завдання табл. 1 Варіант 1 2 3 4 5 6 7 8
1 begin end. k, l, m a, b, c scanf printf byte(1u) (*,/),(+,-)
2 start stop. x, y, z a, b, c input output byte(1u) (*,/),(+,-)
3 pochatok kinez. x1, x2, x3 a1, a2, a3 in out byte(1u) (*,/),(+,-)
4 main { } y1, y2, y3 k1, k2, k3 get put byte(1u) (*,/),(+,-)
5 begin end. k, l, m a1, a2, a3 scanf printf small(2s) (*,/),(+,-)
6 start stop. x, y, z k1, k2, k3 input output small(2s) (*,/),(+,-)
7 pochatok kinez. x1, x2, x3 a, b, c in out small(2s) (*,/),(+,-)
8 main { } y1, y2, y3 a, b, c get put small(2s) (*,/),(+,-)
9 begin end. k, l, m a1, a2, a3 scanf printf integer(4u) (*,/),(+,-)
10 start stop. x, y, z k1, k2, k3 input output integer(4u) (*,/),(+,-)
11 pochatok kinez. x1, x2, x3 a, b, c in out integer(4u) (*,/),(+,-)
12 main { } y1, y2, y3 a1, a2, a3 get put integer(4u) (*,/),(+,-)
13 begin end. k, l, m k1, k2, k3 scanf printf float (*,/),(+,-)
14 start stop. x, y, z a, b, c Input output float (*,/),(+,-)
15 pochatok kinez. x1, x2, x3 a, b, c In out float (*,/),(+,-)
PS. u- беззнакове, s – знакове табл. 2 Варіант 1 2 3 4 5 6 7 8 9
1 main { }
a1, a2, a3 get put Float,int (*,/),(+,-),> For, P
2 begin end.
k1, k2, k3 scanf printf Boolean, int (~),(&,^),< For,C
3 start stop.
a, b, c input output Boolean, int (~),(&,^),>= While,P
a1, a2, a3 input output Char, int (,&),(~),> Case,P
8 pochatok kinez.
k1, k2, k3 in out Boolean, int (,&),(~),>= Repeat, P
9 main { }
a, b, c get put Boolean, int (,&),(~),<= Do, C
10 begin end.
a, b, c scanf printf unsigned(2u),int (*,/),(+,-),== Switch,C
11 start stop.
k1, k2, k3 input output unsigned(2u),int (*,/),(+,-),>= If, C
12 pochatok kinez.
a1, a2, a3 in out unsigned(2u),int (*,/),(+,-),<= If, P
13 main { }
k1, k2, k3 get put unsigned(2u),int (*,/),(+,-),> For,C
14 begin end.
a, b, c scanf printf unsigned(2u),int (*,/),(+,-),<= For,P
P – оператор мови Паскаль, С- оператор мови С. 3. Етапи виконання курсового проекту На консультації по виконанню курсового проекту відведено вісім занять (по розкладу практичні заняття). На кожному занятті, крім першого, буде перевірятись стан виконання курсового проекту кожним студентом згідно наведеного плану робіт: 1. Отримання завдання.2. Створення формального опису вхідної мови програмування.3. Розробка лексичного аналізатора.4. Розробка синтаксичного аналізатора.5. Розробка генератора коду.6. Відладка та тестування розробленого компілятора. 4. Зміст пояснювальної записки Титульний лист Анотація Завдання на курсовий проектЗміст Вступ 1. Аналітичний розділ2. Розробка компілятора вхідної мови програмування 3.1. Формальний опис вхідної мови програмування 3.2. Розробка лексичного аналізатора 3.3. Розробка синтаксичного аналізатора 3.4. Розробка генератора коду3. Реалізація, відладка та тестування компілятора4. Висновки5. ЛітератураДодатки: А. Лістинг програми компілятора вхідної мови програмування Б. Лістинг тестових програм на вхідній мові програмування 5. Правила здачі курсового проекту Термін здачі КП. До 2 МК Кількість спроб здати КП. Кожному студенту відводиться три спроби здати КП. Невдала спроба: робота оцінена менше ніж на 51 бал або студент не погоджується на оцінку запропоновану викладачем. Після другої невдалої спроби максимально можлива оцінка зменшується до 80 балів (“добре”). Після третьої невдалої спроби максимально можлива оцінка зменшується до 51 балу (“задов”). Допуск до здачі КП. Для того, щоб бути допущенним до здачі КП, студент повинен мати: 3.1. Записку. Вихідні коди компілятора (текст програми компілятора з коментарями!!!!). Виконавчий файл компілятора. Вихідні коди тестових програм на власній мові програмування. Примітки. Записка має бути сформована згідно Змісту пояснювальної записки. Кожний пункт має починатися з нової сторінки. В пунктах 3.2, 3.3, 3.4 записки мають бути наведені: визначення відповідного етапу компіляції блок-схема реалізованого алгоритму відповідного етапу компіляції (з максимальним наближенням до коду програми компілятора) словесний опис реалізованого алгоритму та опис використаних стурктур даних. Тестових програм має бути чотири: робоча (правильна) тестова програма з використанням усіх мовних конструкцій, що є в завданні тестова програма, в якій зроблена лексична помилка тестова програма, в якій зроблена синтаксична помилка тестова програма, в якій зроблена семантична помилка 6. Методика оцінки курсового проекту Оцінка КП буде відбуватися за п’ятьма критеріями: 40 %: Знання коду програми компілятора (орієнтація в коді). 15 %: Знання загальних принципів роботи компілятора (алгоритм роботи компілятора). 15 %: Знання принципів лексичного аналізу (алгоритм роботи лексичного аналізатора). 15 %: Знання принципів синтаксичного аналізу (алгоритм роботи синтаксичного аналізатора). 15 %: Знання принципів семантичного аналізу (алгоритм роботи семантичного аналізатора). 7. Література до курсового проекту Асемблер 1. Григорьев В.Л. Программирование однокристальных микропроцессоров. – М.: Энергоатомиздат, 1987.2. Джордейн Р. Справочник программиста ПК IBM PC, XT/AT. - – М.: ФиС, 1992.3. Абель П. Ассемблер для IBM PC, 1991. ANSI C/ C++ 1. Громов Ю.Ю., Татаренко С.И. Прогаммирование на языке СИ, Учебное пособие, 1995.2. Маслов А.Н. Введение в язык программирования С, 1991.3. Страуструп Б. Введение в язык C++, 1985. Розробка компіляторів 1. Ахо А., Ульман Дж. Теория синтаксического анализа, перевода и компиляции, Т.1. Синтаксический анализ. - М.: Мир, 1978.2. Хантер Р. Проектирование и конструирование компиляторов. – М.: ФиС, 1984.3. Грис Д. Конструирование компиляторов для цифровых вычислительных машин. – М.: Мир, 1975.4. Ваймгартен Ф. Трансляция языков программирования. – М.: Мир, 1977.5. Касьянов В.Н. Оптимизирующие преобразования программ. – М.: Наука, 1988.6. Серебряков В.А. Лекции по конструированию компиляторов, Москва 1993.7. Варсанофьев Д.В., Дымченко А.Г. Основы компиляции, 1991.8. Черкашин М. Компилятор пишется так..., Журнал "Монитор", № 4, 1992.9. Легалов А.И. Основы проектирования компиляторов, Курс лекций, 2000. Додаток Формальний опис вхідної мови програмування Одною з перших задач, що виникають при побудові компілятора, є визначення вхідної мови програмування. Для цього використовують різні способи формального опису, серед яких ми розглянемо розширену нотацію Бекуса-Наура (Backus/Naur Form - BNF). Деталізований опис вхідної мови два типи даних: логічний та беззнакове ціле; змінні довільної довжини; арифметичні операції над цілими: +, -, *, /; символи групування арифметичних операцій: “(”, “)”; логічні операції над цілими: <, >, ==, <>; оператор присвоєння: “=” ; оператори блоку: “{”, “}”; оператор виконання дії за умовою: if-then-else оператор циклу (while-do). 1.2. Перелік термінальних символів та ключових слів Визначимо окремі термінальні символи та нерозривні набори термінальних символів (ключові слова): {};=+-*/()<>==<>progbooleanintifthenelsewhiledotruefalse До термінальних символів віднесемо також усі цифри (0-9), латинські букви (a-z, A-Z) та символ пробілу (“ ”). Всього: 24 + 10 + 52 + 1 = 87 термінальних виразів. Це “цеглинки”, з яких має будуватися текст будь-якої вхідної програми. Формальний опис вхідної мови в термінах BNF Правила написання правил у розширеній нотації Бекуса-Наура: нетермінальні вирази записуються у кутових дужках: “<”, “>” ; термінальні вирази записуються жирним шрифтом або у подвійних лапках; усі нетермінальні вирази мають бути “розкриті” за допомогою термінальних; сивол “::=” відділяє праву частину правила від лівої; символ “|” розділяє альтернативи; сиволи “[”, “]” означають необов’язковість (вираз в дужках може бути відсутнім); сиволи “{”, “}” означають повторення. Формальний опис заданої вхідної мови в термінах BNF: <program> ::= prog <block>.
<block> ::= { < statement > | [{<statement >}] }.
<statement> ::= <declaration> | <operator>.
<declaration> ::= <type> <ident>;.
<operator> ::= <bind> | <if-else> | <while-do>.
<bind> ::= <ident> = <expression>;.
<if-else> ::= if <bool_expression> then <block> [else <block>].
<while-do> ::= while <bool_expression> do <block>.