Автор: Пользователь скрыл имя, 25 Февраля 2012 в 16:19, курсовая работа
Незважаючи на більш ніж піввікову історію обчислювальної техніки, формально роком народження теорії трансляторів можна вважати 1957, коли з'явився перший транслятор мови Фортран, створений Бекасом. До цього часу створення трансляторів було досить "творчим" процесом. Лише поява теорії формальних мов і строгих математичних моделей дозволило перейти від "творчості" до "науки".
Вступ
1. Огляд методів та способів проектування трансляторів
1.1. Основні поняття і визначення
1.2. Узагальнена структура транслятора
1.4. Варіанти взаємодії блоків транслятора
2. Формальний опис вхідної мови програмування
2.1. Деталізований опис вхідної мови в термінах розширеної нотації Бекуса-Наура
2.2. Опис термінальних символів та ключових слів
3. Розробка транслятора вхідної мови програмування
3.1. Вибір технології програмування
3.2. Проектування таблиць транслятора та вибір структур даних
3.3. Розробка лексичного аналізатора
3.3.1. Розробка граф-схеми алгоритму
3.3.2. Опис програмної реалізації лексичного аналізатора
3.4. Розробка синтаксичного та семантичного аналізатора
3.4.1. Розробка граф-схеми алгоритму
3.4.2. Опис програмної реалізації синтаксичного та семантичного аналізатора
3.5. Розробка генератора коду
3.5.1. Розробка граф-схеми алгоритму
3.5.2. Опис програмної реалізації генератора коду
4. Опис інтерфейсу та інструкції користувача
4.1. Опис інтерфейсу
4.1.1. Головне меню та панель інструментів.
4.2. Інструкція програміста
4.2.1. Алфавіт мови
4.2.2. Коментарі
4.2.3. Тип даних
4.2.4. Розділи, використовувані при написанні програм
4.2.5. Типи операцій
4.2.6. Типи операторів
5. Відлагодження та тестування програми
5.1. Виявлення лексичних помилок
5.2. Виявлення синтаксичних помилок
5.3. Виявлення семантичних помилок
5.4. Загальна перевірка коректності роботи транслятора
Висновки
Список літератури
Додатки
А. Лістинг програми
4.2.5. Типи операцій
1. Арифметичні операції.
+ - Mul Div Mod | - додавання - віднімання - множення - ділення - Остача від ділення |
2. Логічні операції
&& || !! | - I - АБО - Заперечення |
3. Операції порівняння
== != Le Ge | - рівне - нерівне - менше - рівне - більше - рівне |
4.2.6. Типи операторів
1. Присвоювання.
Команда присвоєння має такий загальний вигляд:
<операнд1> := <операнд2>;
У якості операнд1 можна використовувати тільки змінні.
У якості операнд2 можна використовувати змінні, числові константи, арифметичні вирази.
2. Цикл
Цикл (повторення) – це процес виконання певного набору команд деяку кількість разів. У даній мові є тільки одина команда циклу – For-DownTo
Команда циклу For-DownTo-Do має вигляд:
For(<змінна> := <вираз1>)DownTo <вираз2>
Start
< команда 1 > ;
...
Finish
Дія команди: Змінній присвоюється вираз1, і поки змінна менша виразу2
виконується тіло циклу.
3. Команда вводу даних Input.
Здійснює ввід значень. Має вигляд:
Input (< змінна >);
4. Команда виведення даних Output.
Здійснює виведення на екран повідомлень і результатів обчислень.
Для виведення повідомлень команда Output має вигляд:
Output (" < повідомлення > ");
Для виведення результатів обчислень команда Output має вигляд:
Output (< значення >);
В якості значення можна використовувати тільки числові константи та змінні.
5. Відлагодження та тестування програми
Відлагодження та тестування транслятора проводиться з використанням кількох вхідних програм з навмисне введеними помилками та з коректною програмою для загальної перевірки роботи транслятора.
5.1. Виявлення лексичних помилок
Виявлення лексичних помилок відбувається на стадії лексичного аналізу. При розборі вхідної програми на окремі лексеми лексичний аналізатор перевіряє чи відповідає отримана лексема лексиці заданої мови програмування. У випадку неспівпадіння формується відповідна помилка.
Приклад виявлення лексичних помилок:
5.2. Виявлення синтаксичних помилок
Виявлення синтаксичних помилок відбувається на стадії синтаксичного аналізу. При цьому перевіряється окремо кожне твердження яке може бути або виразом, або оператором (умовного переходу, вводу / виводу), або оголошенням, та перевіряється структура програми в цілому.
Приклад виявлення синтаксичних помилок:
5.3. Виявлення семантичних помилок
Суттю виявлення семантичних помилок є перевірка програми на відповідність контекстним умовам. Головною складовою контекстної умови є “правильне використання” у програмі типів даних, передбачених вхідною мовою.
Приклад виявлення семантичних помилок:
5.4. Загальна перевірка коректності роботи транслятора
Загальна перевірка полягає в транслюванні коректної вхідної програми з використанням всіх можливостей мови в асемблерний код та перевірці на правильність виконання програми попередньо скомпільованої та злінкованої за допомогою masm32.
Приклад перевірки коректності роботи транслятора:
Програма виводить таблицю множення для 9 і 8.
Текст програми:
/*Correct program*/
Program Mul_Table;
Var I, J, Tmp;
Start
For(I := 9)DownTo 8
Start
For(J := 9)DownTo 0
Start
Tmp := I Mul J;
Output("%i",I);
Output(" * %i",J);
Output(" == %i\n",Tmp);
Finish
Finish
Finish
Результат роботи програми:
Висновки
1. Складено формальний опис мови програмування K9, в термінах розширеної нотації Бекуса-Наура.
2. Створено компілятор мови програмування K9, а саме:
розроблено прямий лексичний аналізатор, орієнтований на розпізнавання лексем, що є заявлені в формальному описі мови програмування.
розроблено синтаксичний аналізатор на основі автомата з магазинною пам’яттю.
складено таблицю переходів для даного автомата згідно правил записаних в термінах Бекуса-Наура.
розроблено засоби перевірки семантичних правил, що використовуються в генераторі коду.
Дані засоби дозволяють виявляти такі помилки як: використання неоголошених змінних, подвійне оголошення ідентифікаторів та ін. Розроблено генератор коду, який викликається після перевірки синтаксичним аналізатором коректності запису чергового оператора, мови програмуваня K9. Вихідним кодом генератора є програма на мові асемблера.
Проведене тестування компілятора на тестових програмах за наступними пунктами:
1. На виявлення лексичних помилок.
2. На виявлення синтаксичних помилок.
3. На виявлення семантичних помилок.
4. Загальна перевірка роботи компілятора.
Тестування не виявило помилок в роботі транслятора, і всі помилки в тестових програмах на мові K9 були успішно виявлені і відповідно оброблені.
В результаті виконання даної курсової роботи було успішно засвоєно методи розробки та реалізації компонент системного програмного забезпечення.
Список літератури
1. Ахо А., Сети Р., Ульман Дж. Компиляторы. Принципы, технологии, инструменты. М.: Изд-во «Вильямс», 2001.–768 с
2. Хантер Р. Проектирование и конструирование компиляторов. - М.: Финансы и статистика, 1984. - 232 с.
3. Грис Д. Конструирование компиляторов для цифровых вычислительных машин. - М.: Мир. 1975. - 554 с.
4. Льюис Ф., Розенкранц Д., Смирну Д. Теоретические основы проектирования компиляторов. - М.: Мир, 1979. - 656 с.
5. Ваймгартен Ф. Трансляция языков программирования. – М.: Мир, 1977.
6. Бек Л. Введение в системное программирование. – М.: Мир, 1988. – 448 с.
7. Серебряков В.А. Лекции по конструированию компиляторов, Москва 1993.
8. Варсанофьев Д.В., Дымченко А.Г. Основы компиляции, 1991.
9. Легалов А.И. Основы проектирования компиляторов, Курс лекций, 2000.
10. Компаниец Р.И., Маньков Е.В., Филатов Н.Е. Системное программирование. Основы построения трансляторов. – СПб.: КОРОНА принт, 2004. – 256 с.
Додатки
А. Лістинг програми
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;
namespace CompilerK9
{
public partial class main_form : Form
{
[System.Runtime.
public static extern int LockWindowUpdate(IntPtr hwndLock);
public main_form()
{
InitializeComponent();
}
private SyntaxAnalizer SyntaxAnaliz;
int[,] PriorTable;
private void runToolStripMenuItem_Click(obj
{
Tree_mvi.Enabled = false;
Tables_mvi.Enabled = false;
asm_mvi.Enabled = false;
LexicalAnalizer La = new LexicalAnalizer(InputBox.Text)
LexTable = La.CreateLexTable();
if (La.LexErrors.Count > 0)
{
ErrorsView.Nodes.Clear();
for (int i = 0; i < La.LexErrors.Count; i++)
{
ErrorsView.Nodes.Add(Convert.
}
}
else
{
SyntaxAnaliz = new SyntaxAnalizer(LexTable, PriorTable);
ViewTree = SyntaxAnaliz.BuildTree();
ErrorsView.Nodes.Clear();
for (int i = 0; i < SyntaxAnaliz.SyntaxErrors.
{
ErrorsView.Nodes.Add(Convert.
}
if (SyntaxAnaliz.SyntaxErrors.
{
Tree_mvi.Enabled = true;
Tables_mvi.Enabled = true;
asm_mvi.Enabled = true;
}
string code = ";-=-=-=-=-=-=-=-=-=-=-=-=-=-=
code += "; CODE BLOCK\n";
code += ";-=-=-=-=-=-=-=-=-=-=-=-=-=-=
code += "start:\n";
code += "call main\n";
code += "inkey\nexit\n";
code += "main proc\n";
try
{
code += ViewTree.Nodes[2].Nodes[0].
asm_mvi.Enabled = true;
}
catch (ArgumentOutOfRangeException)
{
ErrorsView.Nodes.Add("777777", "Code not builded!\n");
}
code += "ret\n";
code += "main endp\n";
code += "end start\n";
string macros = ";-=-=-=-=-=-=-=-=-=-=-=-=-=-=
macros += "; MACROS\n";
macros += ";-=-=-=-=-=-=-=-=-=-=-=-=-=-=
macros += "fmod MACRO\n";
macros += "fistp temp\n";
macros += "mov ebx,temp\n";
macros += "fistp temp\n";
macros += "mov eax,temp\n";
macros += "cdq\n";
macros += "idiv ebx\n";
macros += "mov temp,edx\n";
macros += "fild temp\n";
macros += "ENDM\n";
macros += "f_or MACRO\n";
macros += "fistp temp\n";
macros += "mov eax,temp\n";
macros += "fistp temp\n";
macros += "mov ebx,temp\n";
macros += "or eax,ebx\n";
macros += "mov temp,eax\n";
macros += "fild temp\n";
macros += "ENDM\n";
macros += "f_and MACRO\n";
macros += "fistp temp\n";
macros += "mov eax,temp\n";
macros += "fistp temp\n";
macros += "mov ebx,temp\n";
macros += "and eax,ebx\n";
macros += "mov temp,eax\n";
macros += "fild temp\n";
macros += "ENDM\n";
macros += "f_not MACRO\n";
macros += "fistp temp\n";
macros += "mov eax,temp\n";
macros += "not eax\n";
macros += "mov temp,eax\n";
macros += "fild temp\n";
macros += "ENDM\n";
string head = ";-=-=-=-=-=-=-=-=-=-=-=-=-=-=
head += "; PROCESSOR,MODEL,OPTIONS,
head += ";-=-=-=-=-=-=-=-=-=-=-=-=-=-=
head += "include \\masm32\\include\\masm32rt.
head += "include \\masm32\\include\\msvcrt.inc\
head += "includelib msvcrt.lib\n";
head += "includelib kernel32.lib\n";
Информация о работе Розробка системних програмних модулів та компонент систем програмування