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

4
pochatok
kinez.

a, b, c
in
out
Сhar, int
(~),(&,^),<=
While,C

5
main {
}

a1, a2, a3
get
put
Boolean,bint
(~),(&,^),==
If,P

6
begin
end.

k1, k2, k3
scanf
printf
Boolean,bint
(,&),(~),<
If,C

7
start
stop.

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>.

                
                          

<type>
::= boolean | itn.

<ident>
::= <letter> [{<letter>}].

<int_const>
::= < number > [{<number >}].

<bool_const>
::= true | false.

<letter>
::=a|b|c|d|e|f|g|h|i|j|k|l|n|m|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|N|M|O|P|Q|R|S|T|U|V|W|X|Y|Z.

<number>
::= 0|1|2|3|4|5|6|7|8|9.

                
                           

<expression>
::= <num_expression> | <bool_expression>.

<num_expression>
::= <num_operand> [{<num_operation> <num_operand>}].

<bool_expression>
::= ( <num_operand> <bool_operation> <num_operand> ) | <ident> | <bool_const>.

<num_operand>
::= ( <num_expression> ) | <ident> | <int_const>.

<num_operation>
::= *| / | + | - .

<bool_operation>
::= < | >| == | <>.

Формальний опис складено за допомогою 20-ти нетермінальних виразів.
1.4. Повне дерево граматичного розбору