Розробка сканера

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Міністерство освіти РФ
Тульський державний університет
Кафедра АТМ
Курсова робота
за курсом
«Теорія обчислювальних процесів»
Тула - 2003

Зміст:
Введення ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 3
1.Постановка завдання .... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 4
1.1. Завдання ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... .. 4
2.1. Глобальні змінні і необхідні підпрограми ... .... .... ... 4
3.1. Діаграма станів ... ... ... ... ... ... ... ... ... ... ... ... .. ... ... ... ... ... ... .. 5
2.Текст програми ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 7
3. Інструкція користувачеві ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. 14
4. Тестовий приклад ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .14
Висновок ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ............ 14
Список використаних джерел ... ... ... ... ... ... ... ... ... ... ... ... ... ... 15

Введення:
На сьогоднішній момент існує величезна кількість різноманітні-них мов програмування. Всі вони мають свою історію, свою область застосування, та перераховувати навіть найбільш відомі з них не має сенсу. Але всі ці мови побудовані на основі одних і тих же принципів, основи яких визначає теорія формальних мов та граматик.

1. Постановка завдання:
1.1. Завдання:
У даній контрольно-курсовій роботі необхідно виконати лексичний аналіз тексту програми на деякій умовному мовою програмування. Таким чином потрібно розробити сканер, який зчитує літери первісної, вихідної програми і будує слова, або інакше символи, вихідної програми (ідентифікатори, службові слова, одно-або двулітерние роздільники).
Символами в мові, для якого необхідно розробити сканер є:
1.Служебние слова: Цикл ...;
Поки що ... Робити;
Продовжити;
Речовий;
Подвійний.
2.Оператори: +, -, *, /, (,), =, <>, <,>.
3.Ідентіфікатори: (рус.буква | _), (рус.буква | _ | цифра) *.
4.Логіческіе операції: І, АБО, НЕ.
5.Комментарій: {* ... *}, {{-до кінця рядка.
1.2. Глобальні змінні і необхідні підпрограми:
Для роботи сканера потрібні такі змінні і підпрограми:
1. char c, де c - глобальна змінна, значенням якої завжди буде сканируемой літера вихідної програми.
2. int Class, де Class містить ціле число, яке характеризує клас літери, що знаходиться в с. Будемо вважати, що якщо Class = 1 то це цифра, Class = 2 - буква, Class = 3 - літера '{', Class = 4 - оператор, Class = 5 - неприпустиме вираз.
3. char s [20] - масив який буде містити ланцюжок літер, що становлять символ.
4. void Getchar (char, int &) - функція, завдання якої полягає в тому, щоб вибрати наступну літеру вихідної програми і помістити її в с, а клас літера в Class.
5. int LookUp (char *) - функція яка здійснює пошук символу, набраного в s, за таблицею службових слів і логічних операцій. Якщо символ є службовим словом, то LookUp поверне 1, якщо символ це логічна операція то LookUp поверне 2, в іншому випадку функція поверне 3.
1.3. Діаграма станів:
Мітка D використовується замість кожної з міток 0, 1, 2, ..., 9, тобто D представляє клас цифр. Це робиться для спрощення діаграми. Аналогічно мітка L являє клас літери А, Б, ..., Я, а, б, ..., я, а DELIM представляє клас роздільників (операторів). Літера {обробляється особливим чином.
Деякі дуги не помічені. Ці дуги будуть обрані, якщо сканується літера не збігається ні з однією з літер, якими позначені інші дуги.
Додамо семантику в діаграму станів. Введемо команду Gc, скорочено позначивши таки чином функцію void Getchar (char, int &). Під першою дугою, що веде до станом S, записана команда init, яка вказує на необхідність виконання підготовчих дій і початкових установок, а саме перевірка вмісту с, і якщо там пробіл, то повторно викликається void Getchar (char, int &) до тих пір, поки в з не виявиться літера, відмінна від пропуску якщо команда init визначить кінець файлу то програма буде завершена. Команда ADD означає, що літера з додається до рядка s. У стані Print int друкується певне програмою ціле число, в Print sl - службове слово, в Print log - логічна операція, в Print id - ідентифікатор, в Print com - коментар, в Print еrror - неприпустиме вираз. З будь-якого стану Print дуги ведуть в стан S до тих пір, поки init не визначить кінець файлу.














Малюнок 1. Діаграма станів з семантичними процедурами.
2. Текст програми:
# Include <fstream.h>
# Include <stdlib.h>
# Include <process.h>
# Include <stdio.h>
# Include <conio.h>
# Include <ctype.h>
# Include <string.h>
int Prov_itn (); / / Перевірка на введення цілого додатного числа
int LookUp (char *); / / Пошук символу за таблицею службових слів
void Getchar (char, int &);// Визначає клас літери
void main ()
{
char s [20], f_in [10] = "in.txt", f_out [10], c, k, a;
int Class, Quit = 0, Q = 0, x, i, n, j = 0;
char _ [] = "─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─",
_cel []=". Ціле: ",
_op []=". Оператор: ",
_kom []=". Коментар: ",
_id []=". Ідентифікатор: ",
_sl []=". Службове слово: ",
_log []=". Логічна операція: ",
_err []=". Неприпустиме вираз: ",
__ [] = "─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─";
clrscr ();
fstream inFile, outFile;
cout <<"\ t ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ \ n";
cout <<"\ t │ 1.Ввод з клавіатури. │ \ n";
cout <<"\ t │ 2.Ввод з файлу. │ \ n";
cout <<"\ t └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ \ n";
do
{
cout <<"\ t Ваш вибір:";
n = Prov_itn ();
if (n <1 | | n> 2)
cout <<"\ t Неправильно вказано номер пункту меню. \ n";
else
break;
} While (1);
if (n == 1)
{
inFile.open (f_in, ios:: trunc | ios:: in | ios:: out);
cout <<"\ nВводіте текст (в кінці тексту введіть!): \ n";
for (; (a = getchar ())!='!';)
inFile <<a;
inFile.close ();
inFile.open (f_in, ios:: in | ios:: out);
cout <<"\ nВведіть ім'я файлу виводу:";
cin>> f_out;
outFile.open (f_out, ios:: trunc | ios:: in | ios:: out);
if (! outFile)
{
cout <<"Помилка відкриттю файлу:" <<f_out;
}
}
if (n == 2)
{
cout <<"Введіть ім'я файлу введення:";
cin>> f_in;
inFile.open (f_in, ios:: in | ios:: out);
if (! inFile)
{
cout <<"\ nОшібка відкриття файлу:" <<f_in;
}
if (inFile.peek ()! = EOF)
{
cout <<"Вміст файлу: \ n \ n";
while (inFile.peek ()! = EOF)
{
inFile.get (c);
cout <<c;
}
}
else
{
cout <<"Файл пустий!";
getch ();
exit (0);
}
inFile.close ();
inFile.open (f_in, ios:: in | ios:: out);
cout <<"\ n \ nВведіть ім'я файлу виводу:";
cin>> f_out;
outFile.open (f_out, ios:: trunc | ios:: in | ios:: out);
if (! outFile)
{
cout <<"\ nОшібка відкриттю файлу:" <<f_out;
}
}
/ / Перевірка вмісту файлу
if (inFile.peek ()! = EOF)
{
Quit = 1;
inFile.get (c);
Getchar (c, Class);
outFile <<_<<" \ n ";
}
else
Quit = 0;
while (Quit == 1)
{
j + +;
while (c == '' | | c == '\ n')
{
if (inFile.peek () == EOF)
{
Quit = 0;
break;
}
inFile.get (c);
Getchar (c, Class);
}
switch (Class)
{
case 1: / / зчитуємо символ цифра
{
i = 0;
do
{
s [i] = c;
i + +;
if (inFile.peek () == EOF)
{
Quit = 0;
break;
}
inFile.get (c);
Getchar (c, Class);
} While (Class == 1);
s [i] = '\ 0';
outFile <<j <<_cel <<s <<"\ n";
}
break;
case 2: / / зчитуємо символ літера
{
i = 0;
do
{
s [i] = c;
i + +;
if (inFile.peek () == EOF)
{
Quit = 0;
break;
}
inFile.get (c);
Getchar (c, Class);
} While (Class <= 2);
s [i] = '\ 0';
x = LookUp (s);
if (x == 1)
outFile <<j <<_sl <<s <<"\ n";
if (x == 2)
outFile <<j <<_log <<s <<"\ n";
if (x == 3)
outFile <<j <<_id <<s <<"\ n";
}
break;
case 3: / / зчитуємо символ початок коментаря {
{
i = 0;
s [i] = c;
i + +;
if (inFile.peek () == EOF)
{
Quit = 0;
outFile <<j <<_err <<s <<"\ n";
break;
}
inFile.get (c);
Q = 0;
if (c =='*')
{
s [i] = c;
i + +;
do
{
if (inFile.peek () == EOF)
{
Quit = 0;
break;
}
inFile.get (c);
if (c =='*')
{
if (inFile.peek () == EOF)
{
Quit = 0;
break;
}
inFile.get (k);
if (k! ='}') continue;
s [i] = c;
i + +;
s [i] = c = k;
i + +;
Q = 1;
if (inFile.peek () == EOF)
{
Quit = 0;
break;
}
inFile.get (c);
}
} While (Q! = 1);
s [i] = '\ 0';
Getchar (c, Class);
outFile <<j <<_kom <<s <<"\ n";
}
else
{
if (c =='{')
{
s [i] = c;
i + +;
do
{
if (inFile.peek () == EOF)
{
Quit = 0;
break;
}
inFile.get (c);
} While (c! = '\ n');
inFile.get (c);
s [i] = '\ 0';
Getchar (c, Class);
outFile <<j <<_kom <<s <<"\ n";
}
else
{Getchar (c, Class);
outFile <<j <<_err <<s <<"\ n";
}
}
} Break;
case 4: / / зчитуємо символ оператор
{
i = 0;
s [i] = c;
if (s [i ]=='<' & & inFile.peek ()! = EOF)
{
inFile.get (c);
Getchar (c, Class);
if (c =='>')
{
i + +;
s [i] = c;
if (inFile.peek ()! = EOF)
{InFile.get (c);
Getchar (c, Class);
}
else
Quit = 0;
}}
else
{
if (inFile.peek ()! = EOF)
{InFile.get (c);
Getchar (c, Class);
}
else
Quit = 0;
}
i + +;
s [i] = '\ 0';
outFile <<j <<_op <<s <<"\ n";
} Break;
case 5:
{
i = 0;
do
{
s [i] = c;
i + +;
if (inFile.peek ()! = EOF)
{InFile.get (c);
Getchar (c, Class);
}
else
{
Quit = 0; break;
}
} While (Class == 5);
s [i] = '\ 0';
outFile <<j <<_err <<s <<"\ n";
} Break;
}
if (Quit == 0)
outFile <<__<<" \ n ";
}
cout <<"Вміст файлу: \ n \ n";
outFile.close ();
outFile.open (f_out, ios:: in | ios:: out);
{
while (outFile.peek ()! = EOF)
{
outFile.get (c);
cout <<c;
}
}
inFile.close ();
outFile.close ();
getch ();
}
/ / Визначає клас літери
void Getchar (char cc, int & Class1)
{
int i;
char ca []={'+','-','*','/','(',')','=','<>','<','>'};
char cb []={' А ',' Б ',' В ',' Г ',' Д ',' Е ',' Ж ',' З ',' І ',' Ї ',' К ',
'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х',
'Ц', 'Ч', 'Ш', 'Щ', '' ',' И ',' Ь ',' Е ',' Ю ',' Я ',' а ',
'Б', 'в', 'г', 'д', 'е', 'ж', 'з', 'і', 'й', 'до', 'л',
'М', 'н', 'про', 'п', 'р', 'з', 'т', 'у', 'ф', 'х', 'ц',
'Ч', 'ш', 'щ', '' ',' и ',' ь ',' е ',' ю ',' я','_'};
char cd []={' 1 ', '2', '3 ', '4', '5 ', '6', '7 ', '8', '9 ', '0'};
for (i = 0; i <10; i + +)
if (cc == cd [i])
{
Class1 = 1;
return;
}
if (cc =='{')
{
Class1 = 3;
return;
}
for (i = 0; i <10; i + +)
if (cc == ca [i])
{
Class1 = 4;
return;
}
for (i = 0; i <65; i + +)
if (cc == cb [i])
{
Class1 = 2;
return;
}
if (cc == '' | | cc == '\ n')
Class1 = 10;
else Class1 = 5;
}
/ / Пошук символу за таблицею службових слів
int LookUp (char * s)
{
int i;
char * log []={" І "," АБО "," НЕ "};
char * sl []={" Цикл "," Поки "," Робити "," Продовжити "," Речовий "," Подвійний "};
for (i = 0; i <6; i + +)
{
if (strcmp (s, sl [i]) == 0)
return 1;
}
for (i = 0; i <3; i + +)
{
if (strcmp (s, log [i]) == 0)
return 2;
}
return 3;
}
/ / Перевірка на введення цілого додатного числа
int Prov_itn ()
{
char k1 [5], k2 [5];
int nn;
cin>> k1;
nn = atoi (k1);
itoa (nn, k2, 10);
if (strlen (k1)! = strlen (k2))
return 0;
return nn;
}

3. Інструкція користувачеві:
У даній програмі користувачеві надається вибір з двох альтернатив: ввести текст вручну або вважати з файлу. Після вибору введення програма в тексті визначить службові слова, ідентифікатори, оператори, логічні операції, коментарі, якщо такі є.

4. Тестовий приклад:
+---------------------+
| 1.Ввод з клавіатури. |
| 2.Ввод з файлу. |
+---------------------+
Ваш вибір: 2
Введіть ім'я файлу вводу: in.txt
Вміст файлу:
Поки {* (ldfjvkdfvfjkb *}
Речовий <> + =
Введіть ім'я файлу виводу: put.txt
Вміст файлу:
-----------------------
1.Служебное слово: Поки
2.Комментарій :{**}
3.Служебное слово: Речовий
4.Оператор: <>
5.Оператор: +
6.Оператор: =
-----------------------

Висновок:
У цій роботі була показана робота сканера, при якій виконується повний лексичний аналіз вихідної програми.

Список використаних джерел:
1. Гріс Д. Конструювання компіляторів для цифрових обчислювальних машин. М.: Світ, 1975;
2. Хантер Р. Проектування і конструювання компіляторів. М.: Фінанси і статистика, 1984.
3. Касьянов В.М., Поттосін І.В. Методи побудови трансляторів. Новосибірськ: Наука, 1986.
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
26.4кб. | скачати


Схожі роботи:
Принцип роботи сканера
Розробка ПЗ ІС Аптеки
Розробка реклами
Розробка загального ПЗ
Розробка балансів
Розробка СУБД
Розробка турпродукту
Розробка формальних граматик
Розробка служби Win32
© Усі права захищені
написати до нас