КУРСОВА РОБОТА з предмету “Системне програмування” (III курс, 5-й семестр) на тему “Розробка системних програмних модулів та компонент систем програмування.” Індивідуальне завдання “Розробка транслятора з вхідної мови програмування” МЕТА КУРСОВОЇ РОБОТИ Метою виконання курсової роботи є закріплення теоретичних знань та практичних навичок системного програмування, набутих при вивченні дисципліни “Системне програмування”. В ході виконання курсової роботи студенти повинні навчитися самостійно працювати з літературою, розробляти типові елементи системних програм, програмуючи роботу з таблицями, словниками, інформаційними базами, виконуючи лексичний та синтаксичний аналіз, а також семантичну обробку, здійснювати їх програмну реалізацію та відлагодження на сучасних обчислювальних системах. СТРУКТУРА ТА ОБСЯГ КУРСОВОЇ РОБОТИ Обсяг курсової роботи повинен становити не менше 20 сторінок друкованого тексту (без врахування додатків). Рекомендується такий склад пояснювальної записки до курсової роботи: Титульна сторінка Анотація Зміст Завдання на курсову роботу Вступ Огляд методів та способів проектування трансляторів Формальний опис вхідної мови програмування Деталізований опис вхідної мови в термінах розширеної нотації Бекуса-Наура Опис термінальних символів та ключових слів Розробка транслятора вхідної мови програмування Вибір технології програмування Проектування таблиць транслятора та вибір структур даних Розробка лексичного аналізатора Розробка граф-схеми алгоритму Опис програми реалізації лексичного аналізатора Розробка синтаксичного та семантичного аналізатора Розробка дерев граматичного розбору Розробка граф-схеми алгоритму Опис програми реалізації синтаксичного та семантичного аналізатора Розробка генератора коду Розробка граф-схеми алгоритму Опис програми реалізації генератора коду Опис інтерфейсу та інструкції користувача Відлагодження та тестування програми Виявлення лексичних помилок Виявлення синтаксичних помилок Виявлення семантичних помилок Загальна перевірка коректності роботи транслятора Висновки Список літератури Додатки А. Лістинг програм Б. Граф-схеми алгоритмів В. Результати тестування Обов’язковими додатками має бути документований текст програми та графічна частина, оформлені у відповідності до стандартів та ЄСКД. Анотація (1 стор.) В анотації викладаються короткі відомості про курсову роботу. Зміст (1 стор.). У змісті вказуються номери та назви розділів курсової роботи та номери сторінок, де вони починаються. Вступ, висновки по роботі, список літератури та додатки не нумеруються. Завдання на курсову роботу (1 стор.). У завданні вказується тема роботи та перелік конкретних вхідних даних. Завдання на курсову роботу видається студентові керівником курсової роботи індивідуально. Вступ (1 стор.). У вступі здійснюють опис проблеми у загальному вигляді, визначають її актуальність, формулюють мету курсової роботи. Теоретична частина. Огляд методів та способів проектування трансляторів. Цей розділ виконується із використанням літературних джерел і повинен містити опис методів та способів вирішення задачі. Необхідно здійснити порівняння описаних методів та способів. Формальний опис вхідної мови програмування. В цьому розділі описується тип граматики вхідної мови програмування згідно завдання. При цьому визначається алфавіт мови та набір зарезервованих слів. Рекомендується опис вхідної мови подавати в термінах розширеної нотації Бекуса-Наура або за допомогою синтаксичних діаграм. Розробка транслятора вхідної мови програмування. В цьому розділі: - здійснюється вибір технології програмування; - розробляється структура постійних таблиць для зберігання алфавіту мови, зарезервованих слів, знаків операцій, роздільників тощо, а також здійснюється вибір структур даних і алгоритму пошуку елементів у впорядкованих таблицях; - розробляється структура перемінних таблиць для зберігання ідентифікаторів і констант та алгоритми пошуку/вставки лексем і їх атрибутів; - проектується лексичний аналізатор на основі детермінованих кінцевих автоматів з представленням граф-схеми алгоритму та описом програми його реалізації; - проектується синтаксичний аналізатор на основі дерева граматичного розбору з представленням граф-схеми алгоритму та описом програми його реалізації; - проектується генератор асемблерного коду з представленням граф-схеми алгоритму та описом програми його реалізації. Програма повинна бути написана та реалізована на мові програмування C/C++. Текст програми повинен бути документований і написаний згідно вимог структурного програмування. Кожний програмний модуль на початку повинний містити інформацію про тему курсової роботи, прізвище автора та дату створення. Кожна підпрограма також мусить буди документованою. Опис програми проводиться в такій послідовності: спершу описується граф-схема алгоритму, а пізніше програмна реалізація. Опис інтерфейсу та інструкції користувача. В інструкції користувачеві приводять детальну послідовність дій по запуску програми на виконання та описують всі можливі режими керування роботою програми. Для ілюстрації режимів роботи програми бажано навести зображення екранних форм, вікон, меню, блоків діалогу, форм документів і т.п. Відлагодження та тестування програми. В цьому розділі описуються вибрані технології відлагодження та тестування програми на комп’ютері. Технологія відлагодження програми - це послідовність дій та засоби виявлення, аналізу та виправлення помилок програми. Описуються використані засоби автоматизованого відлагодження та оптимізації програми (автономні та вбудовані відлагоджувачі, профайлери). Проводиться аналіз помилок, допущених в ході програмування задачі, спосіб їх виявлення та усунення. Для підтвердження працездатності програмного продукту розробляється система тестів та приводяться результати тестування з їх аналізом. Висновки (1 стор.) У висновках перераховуються основні результати курсової роботи, вказуються її позитивні сторони та недоліки, даються рекомендації по практичному застосуванню розроблених алгоритмів та програм. ВИМОГИ ДО ОФОРМЛЕННЯ Курсова робота є індивідуальною роботою кожного студента і оформляється окремо кожним студентом згідно із виданим завданням. Курсова робота оформляється на аркушах формату A4, які заповнюються з однієї сторони. Текст повинен бути надрукований на принтері. Використання різних чорнил не дозволяється. Заголовки розділів можуть бути виділені великими літерами або підкресленням. Текст повинен бути набраний без помилок українською мовою. Текст на сторінці повинен бути розміщений рівномірно з дотриманням відступів: зліва, згори та знизу - 20 мм, зправа - 10 мм. При комп’ютерному наборі необхідно вибрати шрифт Times New Roman Cyr, розмір шрифта - 14, міжрядковий інтервал - 1.5 . Сторінки курсової роботи повинні бути пронумеровані. Титульна сторінка вважається першою і не нумерується. Номери сторінок вказуються у правому верхньому або нижньому куті. Кожен розділ повинен мати свій номер, який записується перед його назвою. Після номера розділу ставиться крапка, наприклад: 1.Формулювання задачі. Вступ, висновки, список літератури та додаток не нумеруються. Кожен розділ необхідно розпочинати з нової сторінки. Розділ може складатися з підрозділів. Номер підрозділу записується через крапку після номера розділу, наприклад: 4.2. Призначення програми. Формули, на які здійснюється посилання, а також всі таблиці та рисунки повинні мати номер. Нумерація може бути наскрізною або прив'язаною до номера розділу. Номер формули записується після неї у круглих дужках. Номер та назва таблиці вказуються над нею після слова "Таблиця". Номер та назва рисунка вказуються під ним після скорочення "Рис.". Дозволяється комп'ютерне виконання графічної частини курсової роботи. Графічні схеми алгоритмів виконуються згідно вимог міжнародного стандарту ISO 5807-85 "Обробка інформації. Символи і умовні позначення блок-схем даних, програм та систем, схем програмних мереж і системних ресурсів". Роздруки текстів програм приводяться у додатку. Кожен окремий документ додатку позначається буквою згідно алфавіту після якої слідує його назва, наприклад: Додаток А. Текст програми модуля лексичного аналізу. Список літератури виконується згідно вимог стандартів. Література може бути розміщена за алфавітом або в порядку посилання на неї. У списку можна наводити тільки ту літературу, яка була використана при виконанні курсової роботи і на яку є посилання у тесті пояснювальної записки. Посилання здійснюється вказанням номера джерела у квадратних дужках. Пояснювальна записка повинна бути сформована згідно змісту і зшита з лівої довшої сторони листів формату A4. Для зручності зберігання палітурка курсової роботи повинна бути жорсткою (виконана із листа ватману чи картону). ЗАХИСТ РОБОТИ Готова курсова робота представляється керівнику для перевірки. При необхідності вона може бути повернута студенту на доопрацювання. До захисту приймається робота, оформлена згідно приведених вище вимог, разом з CD - lдиском. На диску розміщуються текстові файли програм, тестових даних та текст пояснювальної записки до курсової роботи. Диск повинен бути підписаний з вказанням номера групи та прізвища студента. Назви файлів повинні бути виконані латинськими літерами та цифрами. В процесі захисту роботи студент демонструє роботу транслятора на комп'ютері і дає пояснення та відповіді на поставлені питання членами комісії. Захист роботи здійснюється студентом тільки один раз. При незадовільній оцінці студенту видається нове завдання на курсову роботу за дозволом завідувача кафедри та декана. Література до курсової роботи Ахо А., Сети Р., Ульман Дж. Компиляторы. Принципы, технологии, инструменты. М.: Изд-во «Вильямс», 2001.–768 с Хантер Р. Проектирование и конструирование компиляторов. - М.: Финансы и статистика, 1984. - 232 с. Грис Д. Конструирование компиляторов для цифровых вычислительных машин. - М.: Мир. 1975. - 554 с. Льюис Ф., Розенкранц Д., Смирну Д. Теоретические основы проектирования компиляторов. - М.: Мир, 1979. - 656 с. Рейруорд-Смит В. Дж. Теория формальных языков. - М.: Радио и связь, 1988. - 128 с. Ваймгартен Ф. Трансляция языков программирования. – М.: Мир, 1977. Бек Л. Введение в системное программирование. – М.: Мир, 1988. – 448 с. Касьянов В.Н. Оптимизирующие преобразования программ. – М.: Наука, 1988. Серебряков В.А. Лекции по конструированию компиляторов, Москва 1993. Варсанофьев Д.В., Дымченко А.Г. Основы компиляции, 1991. Легалов А.И. Основы проектирования компиляторов, Курс лекций, 2000. Компаниец Р.И., Маньков Е.В., Филатов Н.Е. Системное программирование. Основы построения трансляторов. – СПб.: КОРОНА принт, 2004. – 256 с. Соколов А.П. Системы программирования. Теория, методы, алгоритмы. – М.: Финансы и статистика, 2004. – 320 с. Костельцев А.В. Построение интерпретаторов и компиляторов. – М.: Наука и техника, 2001. – 224 с. Завдання на курсову роботу 1. Цільова мова транслятора асемблер (iх86). 2. Для отримання виконавчого файлу на виході розробленого транслятора скористатися програмами tasm.exe і tlink.exe або tasm32.exe і tlink32.exe. 3. Мова розробки транслятора: ANSI C або C++. 4. Реалізувати оболонку або інтерфейс з командного рядка. 5. На вхід розробленого транслятора має подаватися текстовий файл, написаний на заданій мові програмування. 6. На виході розробленого транслятора мають створюватись чотири файли: файл з повідомленнями про помилки (або про їх відсутність); файл на мові асемблера; об’єктний файл; виконавчий файл. 7. Назва вхідної мови програмування утворюється від першої букви у прізвищі студента та останніх двох цифр номера його варіанту. Саме таке розширення повинні мати текстові файли, написані на цій мові програмування. Зауваження. 1) В кожному завданні передбачається блок оголошення змінних; 2) В кожному завданні обов’язковим є оператор присвоєння та оператор типу – блок; 3) Оператори можуть бути довільної вкладеності і в любій послідовності. 4) Для непарних варіантів завдань необхідно реалізувати висхідний метод граматичного розбору, а для парних варіантів завдань - нисхідний метод. № з/п Блок тіла програми Оператори уводу-виводу Оператор присвоєння Оператор Регістр ключових слів Регістр іден-тифікаторів Операції Типи даних Коментар
арифметичні порівняння логічні
1 program <name>; var…; begin - end input output >> if - then [- else] (Паскаль) Low Up-Low2 перший символ Up +; -; *; /; % eg; ne; lt; gt !!; &&; || int { ... }
2 PROGRAM <name>; VAR…; BEGIN - END SCAN PRINT := IF [–ELSE] (СІ) Up Low-Up2 перший символ Low ADD; SUB; MUL; DIV; MOD EQ; NE; >; < NOT; AND; OR LONG INT !! ...!!
3 Program <name>; Var…; Begin - End Get Put ::= If - Goto; Goto (Бейсік) Up-Low перший символ Up Up2 +; -; Mul; Div; Mod Eg; Ne; >>; << !; And; Or Int16 /*…
4 program <name>; begin var…; end read write << if - then goto; goto (Бейсік) Low Low2 add; sub; *; /; % ==; !=; lt; gt !; &; | int32 #* ... *#
5 PROGRAM <name>; BEGIN VAR…; END INPUT OUTPUT :: WHILE (СІ) Up Up-Low4 перший символ Up +; -; *; DIV; MOD =; <>; LT; GT !!; &&; || INT_2 {* ... *}
6 Program <name>; Start Var …; Finish Scan Print -> For (СІ) Up-Low перший символ Up Low-Up4 перший символ Low ++; --; **; Div; Mod Eg; Ne; Le; Ge Not; And; Or Int_4 ??...
7 program <name>; var …;start - finish get put <- do- while (СІ) Low Up4 +; -; *; /; % eg; ne; >=; <= !; and; or int16_t %% ... %%
8 PROGRAM <name>; VAR …;START - FINISH READ WRITE >> WHILE - DO (Паскаль) Up Low4 ADD; SUB; MUL; DIV; MOD =; <>; LE; GE !; &; | INT32_t $$ ...
9 Program <name>; Var …;Start - Finish Input Output := For – DownTo (Паскаль) Up-Low перший символ Up Up-Low6 перший символ Up +; -; Mul; Div; Mod ==; !=; Le; Ge !!; &&; || Integer /* ... */
10 program <name>; start var …; finish scan print ::= for –to - do(Паскаль) Low Low-Up6 перший символ Low add; sub; *; /; % =; <>; >; <; not; and; or integer16 !! ...
11 # PROGRAM <name>; START VARIABLE …; STOP GET PUT << REPEAT – UNTIL (Паскаль) Up Up6 +; -; *; DIV; MOD =; <>; >=; <= !; AND; OR INTEGER32 // ...
12 #Program <name>; Variable…; Start – Stop Read Write :: For – To – Next (Бейсік) Up-Low перший символ Up Low6 ++; --; **; Div; Mod ==; !=; >; < !; &; | Integer_2 // ... //
13 #program <name>; start variable…; stop input output -> if - then [- else] (Паскаль) Low Up-Low8 перший символ Up +; -; *; /; % ==; !=; >=; <= !!; &&; || integer_4 ## ... ##
14 # PROGRAM <name>; VARIABLE…; START - STOP SCAN PRINT <- IF [–ELSE] (СІ) Up Low-Up8 перший символ Low ADD; SUB; MUL; DIV; MOD ==; !=; !>; !< NOT; AND; OR INTEGER16_t \\ ...
15 #Program <name>; Start Variable…; Stop Get Put >> If - Then Goto; Goto (Бейсік) Up-Low перший символ Up Up8 +; -; Mul; Div; Mod =; <>; !>; !< !; And; Or Integer32_t @@ ...
17 STARTPROGRAM STARTBLOK VARIABLE…; ENDBLOK INPUT OUTPUT ::= WHILE (СІ) Up Up-Low2 перший символ _ +; -; *; DIV; MOD =, != , <<, >> !!; &&; || INT16 { ... }
18 StartProgram StartBlok Variable…; EndBlok Scan Print << Do- While (СІ) Up-Low перший символ Up Low-Up2 перший символ _ ++; --; **; Div; Mod Eq; Neq; Ls; Gr Not; And; Or Int32 !! ...!!
19 startprogram variable…;startblok - endblok get put :: for (СІ) Low Up4 перший символ _ +; -; *; /; % eq; noteq; less; gr !; and; or int_2 /*…
20 STARTPROGRAM VARIABLE…;STARTBLOK - ENDBLOK READ WRITE -> WHILE - DO (Паскаль) Up Low4 перший символ _ ADD; SUB; MUL; DIV; MOD EQ; NE; LT; GT !; &; | INT_4 #* ... *#
21 MainProgram Data…; Start - End Input Output <- Repeat – Until (Паскаль) Up-Low перший символ Up Up-Low4 перший символ _ +; -; Mul; Div; Mod Eg; Ne; >; < !!; &&; || Int16_t {* ... *}
22 mainprogram data…; start - end scan print >> for –to - do(Паскаль) Low Low-Up4 перший символ _ add; sub; *; /; % eg; ne; >>; << not; and; or int32_t ??...
23 MAIMPROGRAM DATA…; START - END GET PUT := FOR – DOWNTO (Паскаль) Up Up6 перший символ _ +; -; *; DIV; MOD ==; !=; LT; GT !!; AND; OR INTEGER %% ... %%
24 MainProgram Start Data…; End Read Write ::= For – To – Next (Бейсік) Up-Low перший символ Up Low6 перший символ _ ++; --; **; Div; Mod =; <>; Lt; Et !; &; | Integer16 $$ ...
25 mainprogram start data…; end input output << if [–else] (СІ) Low Up-Low6 перший символ _ +; -; *; /; % eg; ne; le; ge !!; &&; || integer32 /* ... */
26 NAME <name>; BODY DATA…; END SCAN PRINT :: IF - THEN [- ELSE] (Паскаль) Up Low-Up6 перший символ _ ADD; SUB; MUL; DIV; MOD EQ; NE; >=; <= NOT; AND; OR INTEGER_2 !! ...
27 Name <name>; Body Data…; End Get Put -> For (СІ) Up-Low перший символ Up Up8 перший символ _ +; -; Mul; Div; Mod =; <>; Le; Ge !; And; Or Integer_4 // ...
28 name <name>; body data…; end read write <- repeat – until (Паскаль) Low Low8 перший символ _ add; sub; *; /; % ==; !=; le; ge !; &; | integer16_t // ... //
29 NAME <name>; DATA…;BODY- END INPUT OUTPUT :: FOR –TO – DO (Паскаль) Up Up-Low8 перший символ _ +; -; *; DIV; MOD =; <>; >; <; NOT; AND; OR INTEGER32_t ## ... ##
30 Name <name>; Data…;Body - End Read Write -> Do- While (СІ) Up-Low перший символ Up Low-Up8 перший символ _ ++; --; **; Div; Mod =; <>; >=; <= !!; &&; || Longint \\ ...