Міністерство науки, вищої школи і технічної політики Російської p>
Федерації. p>
Новосибірський Державний Технічний Університет. p>
p>
Курсова робота з системного програмування.
Синтаксичний Розпізнавач арифметичного оператора умовного переходу мови FORTRAN. p>
Факультет: АВТ.
Кафедра: АСУ.
Група: А-513.
Студент: Бойко Константин Анатольевич.
Викладач: Шорников Юрій Володимирович.
Асистент: Панова Віра Борисівна.
Дата: 30 квітня 1997
Відмітка про захист: p>
Новосибірськ. P>
Мова оператора. P>
Мова арифметичного оператора умовного переходу мови FORTRAN. P>
IF () LABEL1, LABEL2, LABEL3 p>
АВ - Арифметичне Вираз.
LABEL1, LABEL2, LABEL3 - перший, другий і третій мітки відповідно. P>
Граматика мови. P>
G []:
1. (IF (),,< br>2. (
3. (T | (T |-T
4. T (O | T * O | T/O | T ((O
5. O (() | |
6. (Б (Б | Ц)
7. (Ц (Ц }[(]< br>8. (Ц (Ц) [. Ц (Ц)] p>
Умовні позначення: p>
| Т | - | ТЕРМ. |
| Про | - | операнд. |
| Б | - | БУКВА. |
| Ц | - | ЦИФРА. |
| ЦБЗ | - | ціле без знаку. |
| ((| - | Піднесення до степеня. |
| LABEL | - | МЕТКА. |
| ЧПЗ | - | числа з плаваючою комою. |
| (| - | КІНЕЦЬ СТРОКИ (пусто). |
| АВ | - | арифметичних виразів. | p>
Класифікація граматики. p>
Дана граматика G [], згідно з класифікацією Хомського,є контекстно-вільною, так як права частина кожної редукціїпочинається або з термінального символу, або з нетермінального,що належить об'єднаному словника. p>
A (a, A (Vn, a (V (. p>
Граматика G [] не є автоматною, тому що не всі їїредукції починаються з термінального символу. З цієї ж причини данаграматика не є S - граматикою. p>
Метод аналізу. p>
Для даної граматики реалізований розбір методом рекурсивного спуску,оскільки вона належить до класу контекстно-вільних. p>
Ідея методу полягає в тому, що кожному нетермінальному символуставиться у відповідність певна програмна одиниця (функція), якарозпізнає ланцюжок, що породжуються цим нетерміналом. p>
Ці процедури і функції викликаються відповідно до правилграматики і іноді викликають самі себе. p>
Даний метод реалізований на мові C + +, оскільки він володієрекурсивними можливостями. p>
Діагностика та нейтралізація помилок. p>
Для даної граматики проводиться тільки діагностика та нейтралізаціяпомилок. Виправлення помилок не проводиться. P>
Нейтралізація помилок здійснюється за методом Айронса, тобто,спускаючись по синтаксичному дереву без повернення на контекст, привиявленні тупикової ситуації відкидаються ті літери (символи), якіпривели в контексте і розбір триває. p>
Тестування. p>
(((((((((((((((((((((((((( ((((((((((((((< br>IF (((6/t + g * 456)/(9.347 * y-555)) ** 6) 64,44,548
((((((((((((((((((((((((((((((((((((((((< br>Поточний символ (- 40.
AB - Перевірка на Арифметичне Вираз.
Поточний символ (- 40.
Term - Перевірка на Терм.
Operand - Перевірка на Операнд.
AB - Перевірка на Арифметичне Вираз.
Поточний символ (- 40.
Term - Перевірка на Терм.
Operand - Перевірка на Операнд.
AB - Перевірка на Арифметичне Вираз.
Поточний символ 6 - 54.
Term - Перевірка на Терм.
Operand - Перевірка на Операнд.
IDENT - Перевірка на Ідентифікатор з символу 6.
FLOAT - перевірка на число з плаваючою комою з цифри 6.
Поточний символ/- 47.
Поточний символ t - 116.
Term - Перевірка на Терм.
Operand - Перевірка на Операнд.
IDENT - Перевірка на Ідентифікатор з символу t.
Поточний знак "+" - 43.
AB - Перевірка на Арифметичне Вираз.
Поточний символ g - 103.
Term - Перевірка на Терм.
Operand - Перевірка на Операнд.
IDENT - Перевірка на Ідентифікатор з символу g.
Поточний символ * - 42.
Поточний символ 4 - 52.
Term - Перевірка на Терм.
Operand - Перевірка на Операнд.
IDENT - Перевірка на Ідентифікатор з символу 4.
FLOAT - перевірка на число з плаваючою комою з цифри 4.
Поточний символ 5 - 53.
Поточний символ 6 - 54.
Поточний символ) - 41.
Поточний символ/- 47.
Поточний символ (- 40.
Term - Перевірка на Терм.
Operand - Перевірка на Операнд.
AB - Перевірка на Арифметичне Вираз.
Поточний символ 9 - 57.
Term - Перевірка на Терм.
Operand - Перевірка на Операнд.
IDENT - Перевірка на Ідентифікатор з символу 9.
FLOAT - перевірка на число з плаваючою комою з цифри 9.
Поточний символ. - 46.
Поточний символ 3 - 51.
Поточний символ 4 - 52.
Поточний символ 7 - 55.
Поточний символ * - 42.
Поточний символ y - 121.
Term - Перевірка на Терм.
Operand - Перевірка на Операнд.
IDENT - Перевірка на Ідентифікатор з символу y.
Поточний символ - - 45.
AB - Перевірка на Арифметичне Вираз.
Поточний символ 5 - 53.
Term - Перевірка на Терм.
Operand - Перевірка на Операнд.
IDENT - Перевірка на Ідентифікатор з символу 5.
FLOAT - перевірка на число з плаваючою комою з цифри 5.
Поточний символ 5 - 53.
Поточний символ 5 - 53.
Поточний символ) - 41.
Поточний символ) - 41.
Поточний символ * - 42.
Поточний символ * - 42.
Поточний символ 6 - 54.
Term - Перевірка на Терм.
Operand - Перевірка на Операнд.
IDENT - Перевірка на Ідентифікатор з символу 6.
FLOAT - перевірка на число з плаваючою комою з цифри 6.
Поточний символ) - 41.
Поточний символ - 32.
Поточний символ 6 - 54.
ABS - перевірка на Ціле Без Знака з цифри 6.
Поточний символ 4 - 52.
Поточний символ, - 44.
Поточний символ 4 - 52.
ABS - перевірка на Ціле Без Знака з цифри 4.
Поточний символ 4 - 52.
Поточний символ, - 44.
Поточний символ 5 - 53.
ABS - перевірка на Ціле Без Знака з цифри 5.
Поточний символ 4 - 52.
Поточний символ 8 - 56.
Поточний символ NULL - 0.
(((((((((((((((((((((((((((((((((((((((( p>
((( (((((((((((((((((((((((((((((((((((((< br>IF (r ** 34/50.22) 3,56,1
((((((((((((((((((((((((((((((((((((((((< br>Поточний символ (- 40.
AB - Перевірка на Арифметичне Вираз.
Поточний символ r - 114.
Term - Перевірка на Терм.
Operand - Перевірка на Операнд.
IDENT - Перевірка на Ідентифікатор з символу r.
Поточний символ * - 42.
Поточний символ * - 42.
Поточний символ 3 - 51.
Term - Перевірка на Терм.
Operand - Перевірка на Операнд.
IDENT - Перевірка на Ідентифікатор з символу 3.
FLOAT - перевірка на число з плаваючою комою з цифри 3.
Поточний символ 4 - 52.
Поточний символ/- 47.
Поточний символ 5 - 53.
Term - Перевірка на Терм.
Operand - Перевірка на Операнд.
IDENT - Перевірка на Ідентифікатор з символу 5.
FLOAT - перевірка на число з плаваючою комою з цифри 5.
Поточний символ 0 - 48.
Поточний символ. - 46.
Поточний символ 2 - 50.
Поточний символ 2 - 50.
Поточний символ) - 41.
Поточний символ - 32.
Поточний символ 3 - 51.
ABS - перевірка на Ціле Без Знака з цифри 3.
Поточний символ, - 44.
Поточний символ 5 - 53.
ABS - перевірка на Ціле Без Знака з цифри 5.
Поточний символ 6 - 54.
Поточний символ, - 44.
Поточний символ 1 - 49.
ABS - перевірка на Ціле Без Знака з цифри 1.
Поточний символ NULL - 0.
(((((((((((((((((((((((((((((((((((((((( p>
Лістинг програми.
//(((((((((((((((((((((((((((((((((((((((< br>//FILE "KURSOVIC.CPP".
//(((((((((((((((((((((((((((((((((((((((< br>//ВАРІАHТ # 2.
//(((((((((((((((((((((((((((((((((((((((< br>//Арифметичний оператор умовного переходу мови FORTRAN.
//(((((((((((((((((((((((((((((((((((((((< br>//Ставки оплати праці адвокатів: АСУ.
//Гpуппа: А-513.
//Студент: Бойко Константин Анатольевич.
//Пpеподавателі: кандидат технічних наук, доцент Шоpніков Юpій
Владіміpовіч,
//Асистент Панова Веpа Боpісовна.
//Дата: 30 квітня 1997р.
//(((((((((((((((((((((((((((((((((((((((< br>//Заголовки.
//(((((((((((((((((((((((((((((((((((((((< br># Include
# Include
# Include
# Include
# Include "keyboard.h"
# Include
# Include
//(((((((((((((((((((((((((((((((((((((((< br>//Константи.
//(((((((((((((((((((((((((((((((((((((((< br># Define FILE_NAME "TEXT.TXT"
# Define YES 1
# Define NO 2
# Define OK 3
//# Define TEST
//(((((((((((((((((((((((((((((((((((((((< br>//Глобальні змінні.
//(((((((((((((((((((((((((((((((((((((((char file1 [22] [60];// Масив рядків.char mes [22] [30] [50];// Масив повідомлень про помилки.char bufer [4096];// Знімок з екрану.int com = 0;// Показник: відкомпілювати файл чи ні.int pos = 2;// Поточне положення в рядку.char string [80];// Поточна рядок файлу.char nx;// Поточний символ в рядку.int e1 = 0;// Счетчик сторінок масиву, повідомлення про помилки.int e2 = 0;// Счетчик рядків на сторінці.int l = 0;// Счетчик міток.
FILE * fl = fopen ( "MESSAGE.TXT", "wt");// Файл з повідомленнями про помилки.
//(((((((((((((((((((((((((((((((((((((((< br>//Прототипи функцій.
//(((((((((((((((((((((((((((((((((((((((void Windows (int, int, int, int, char *);// Побудова вікон.void Beep (int, int);// Звуковий сигнал.void Open_File (void);// Відкриття файлу.void Second_Window (void);// Побудова нижній панелі.void MyPuts (char *, int);// Аналог puts (char *).void Print_File (void);// Друк файлу.void Menu (void);// Меню.int i_readkey (void);// Опитування клавіатури.void Help (void);// Допомога.void Grammar (void);// Граматика мови.void Language (void);// Мова оператора.void Compile (void);// Компіляція.void Operator (char *);// Сканування оператора.void Scan (void);// Сканування наступного символу.void Label (void);// Реалізація Label.int ABS (void);// Реалізація ABS.int IDENT (void);// Реалізація IDENT.int AB (void);// Реалізація AB.void Error (int);// Обробка помилки.int Term (void);// Реалізація Term.int Operand (void);// Реалізація Operand.int Float (void);// Реалізація Float.void Message (int);// Вивід повідомлень про помилки.
//(((((((((((((((((((((((((((((((((((((((< br>//Функція MAIN.
//(((((((((((((((((((((((((((((((((((((((void main () p>
( p>
_setcursortype (_SOLIDCURSOR); window (1,1,80,25); textattr (113); clrscr (); for (int i = 0 ; i IF (),, nr "); cprintf (" 2. -> nr "); cprintf (" 3. -> T | + T |-Tnr "); cprintf (" 4. T -> O | T * O | T/O | T ** Onr "); cprintf (" 5. O -> () | | nr "); cprintf (" 6. -> Б (Б | Ц) nr "); cprintf (" 7. -> Ц (Ц) nr "); cprintf (" 8. -> Ц (Ц) [. Ц (Ц)] nnr "); cprintf (" Умовні позначення: nr "); cprintf (" T - терм . nr "); cprintf (" O - операнд.nr "); cprintf (" Б - буква.nr "); cprintf (" Ц - ціфра.nr "); cprintf (" ЦБЗ - ціле без знака.nr ") ; cprintf ( "ЧПЗ - число з плаваючою запятой.nr"); cprintf ( "** - зведення в степень.nr"); cprintf ( "- метка.nr"); cprintf ( "- арифметичне вираження."); getch (); p>
)
//(((((((((((((((((((((((((((((((((((((((< br>//Мова.
//(((((((((((((((((((((((((((((((((((((((void Language (void) p>
(window (20,7,60,17); textattr (62); clrscr (); p>
Windows (20,7,60,17, "Language"); window (22,9,58,16); cprintf ( "IF () LABEL1, LABEL2, LABEL3nnr"); cprintf ( "АВ - Арифметичне Вираженіе.nr"); cprintf ( "LABEL1, LABEL2, LABEL3 - першу, другу і третю міткисоответственно.nr "); getch (); p>
)
//(((((((((((((((((((((((((((((((((((((((< br>//Компіляція програми.
//(((((((((((((((((((((((((((((((((((((((void Compile (void) p>
(window (20,7,55,13); textattr (94); clrscr (); p>
Windows (20,7,55,13, "Compile"); window (22,8,58,16); gotoxy (1,1); if (com! = 0) p>
(cprintf ( "nn Файл відкомпілювати !"); p>
Beep (900,1000); return; p>
) cputs ( "n Йде компіляція файла.rnn Будь ласка,зачекайте ...");< br># ifdef TESTwindow (1,1,80,25);clrscr ();
# endif for (int i = 0; file1 [i] [0]! = NULL; i ++) p>
( p>
Operator (file1 [i]); if (l! = 3 & & l! = 0) p>
Error (11); e1 + +; e2 = 0; p>
) com + +; delay (300); p>
Beep (1000 , 200); p>
)
//(((((((((((((((((((((((((((((((((((((((< br>//Оператор.
//(((((((((((((((((((((((((((((((((((((((void Operator (char * str) p>
(pos = 2; l = 0; string [0] = NULL; strcpy (string, str); string [strlen (string) -1] = NULL; char temp [3]; temp [0] = str [0]; temp [1] = str [1]; temp [2] = NULL;
# ifdef TESTputs (string);puts (temp);getch ();
# endif fprintf (fl, "(((((((((((((((((((((((((((((( n"); fprintf (fl, "% sn", string); if (strcmp (temp, "IF")! = 0) p>
(
# ifdef TESTprintf ( "Не знайдено оператор IF.n");
# endif p>
Error (10); return; p>
) p>
Scan (); if (nx == '') p>
Scan (); if (nx !='(') p>
Error (7); if (nx == NULL) p>
( p>
Error (12 ); p>
Error (9); return; p>
) p>
AB (); while (nx !=')' & & nx! = NULL & & nx ! = '') p>
Scan (); if (nx !=')') p>
Error (3); if (nx == NULL) p>
( p>
Error (9); return; p>
) p>
Scan (); if (nx == NULL) p>
( p>
Error (9); return; p>
) if (nx == '') p>
Scan (); p>
Label ( ); if (nx !=',') p>
( p>
Error (5); p>
Scan (); p>
) else p>
Scan (); if (nx == NULL) return; p>
Label (); if (nx !=',') p>
(
Error (5); p>
Scan (); p>
) else p>
Scan (); if (nx == NULL) return ; p>
Label (); if (nx! = NULL) p>
( p>
Error (6); p>
Scan (); p>
) return; p>
)
//(((((((((((((((((((((((((((((((((((((((< br>//Scan.
//(((((((((((((((((((((((((((((((((((((((void Scan (void) p>
(nx = string [pos ++];< br># ifdef TESTprintf ( "За цей символ% c -% dn", nx, nx);
# endif fprintf (fl, "За цей символ% c -% dn", nx, nx); p>
)
//(((((((((((((((((((((((((((((((((((((((< br>//Мітка.
//(((((((((((((((((((((((((((((((((((((((void Label (void) p>
(if (ABS () == NO) p>
( p>
Error (8); p>
Scan (); p>
) else l ++; p>
)
//(((((((((((((((((((((((((((((((((((((((< br>//Ціле Без Знака.
//(((((((((((((((((((((((((((((((((((((((int ABS (void) p>
(
# ifdef TESTcprintf ( "ABS - перевірка на Ціле Без Знака з цифри% c.rn", nx);
# endif fprintf (fl, "ABS - перевірка на Ціле Без Знака з цифри% cn", nx); if (isdigit (nx)) p>
(while (isdigit (nx)) p> < p> Scan (); return (YES); p>
) return (NO); p>
)
//(((((((((((((((((((((((((((((((((((((((< br>//Арифметичне Вираз.
//(((((((((((((((((((((((((((((((((((((((int AB (void) p>
(
# ifdef TESTcprintf ( "AB - Перевірка на Арифметичне Вираженіе.rn");
# endif fprintf (fl, "AB - Перевірка на Арифметичне Вираженіе.n "); p>
Scan ();if (nx ==')') p>
( p>
Error (12); return (NO); p>
) p>
Term (); if (nx =='+') p>
( p>
AB (); p>
) else if (nx =='-')
( p>
AB (); p>
) if (nx == NULL) return (OK); else if (nx !='*' & & nx! = '/' & & nx !=')') p>
Error (1); return (YES); p>
)
//(((((((((((((((((((((((((((((((((((((((< br>//Терм.
//(((((((((((((((((((((((((((((((((((((((int Term (void) p>
(
# ifdef TESTcprintf ( "Term - Перевірка на Терм.rn");
# endif fprintf (fl, "Term - Перевірка на Терм.n "); p>
Operand (); if (nx =='/') p>
( p> < p> Scan (); p>
Term (); p>
) else if (nx =='*') p>
( p>
Scan (); if (nx =='*') p>
( p>
Scan (); p>
Term (); p>
) else Term (); p>
) if (nx == NULL) return (OK); else if (nx !='+' & & nx !='-' & & nx !=')') p>
Error (2); return (OK); p>
)
//(((((((((((((((((((((((((((((((((((((((< br>//Операнд.
//(((((((((((((((((((((((((((((((((((((((int Operand (void) p>
(
# ifdef TESTcprintf ( "Operand - Перевірка на Операнд.rn");
# endif fprintf (fl, "Operand - Перевірка на Операнд.n"); if (nx =='(') p>
( p>
AB (); if (nx! = ')') p>
Error (3); else p>
( p>
Scan (); return (OK); p>
)
) else if (IDENT () == NO) p>
(if (Float () == NO) p>
Error (4); p>
) return (OK); p>
)
//(((((((((((((((((((((((((((((((((((((((< br>//Ідентифікатор.
//(((((((((((((((((((((((((((((((((((((((int IDENT (void) p>
(
# ifdef TESTcprintf ( "IDENT - Перевірка на Ідентифікатор з символу% c.rn", nx);
# endif fprintf (fl, "IDENT - Перевірка на Ідентифікатор з символу% cn", nx); if (isalpha (nx)) p>
(while (isalpha (nx) | | isdigit (nx))
Scan (); return (YES); p>
) return (NO); p>
)
//(((((((((((((((((((((((((((((((((((((((< br>//Помилки.
//(((((((((((((((((((((((((((((((((((((((void Error (int num) p>
(char * E []={ p>
"Очікується '+' або'-'.", p>
" Очікується ' *','/' або'**'.", p>
"Очікується ).", p>
" Очікується ідентифікатор або ціле без знаку .", p>
"Відсутня','.", p>
" Не кінець рядка .", p>
"Очікується (.", p>
" Позначка - не ціле без знаку .", p>
"Відсутня мітки .", p>
" Не знайдено оператор IF .", p>
"Відсутній мітка .", p>
"Відсутня AB .", p>
NULL p>
); sprintf (mes [e1] [e2],"% s ", E [num-1]); e2 + +; < br># ifdef TEST
Beep (1000,100);cprintf ( "Помилка:% srn", E [num-1]);getch ();
# endif fprintf (fl, "(((((((((((((((((((((((((((( n"); fprintf (fl, "Помилка:% srn", E [num-1 ]); p>
)
//(((((((((((((((((((((((((((((((((((((((< br>//Float.
//(((((((((((((((((((((((((((((((((((((((int Float (void) p>
(
# ifdef TESTcprintf ( "FLOAT - перевірка на число з плаваючою комою з цифри
% c.rn ", nx);
# endif fprintf (fl, "FLOAT - перевірка на число з плаваючою комою з цифри
% cn ", nx); if (isdigit (nx)) p>
(while (isdigit (nx)) p>
Scan (); if (nx =='.')
( p>
Scan (); while (isdigit (nx)) p>
Scan (); p>
) return (YES);
) return (NO); p>
)
//(((((((((((((((((((((((((((((((((((((((< br>//Message.
//(((((((((((((((((((((((((((((((((((((((void Message (int x) p>
(window (50,3,76,22); textattr (95); clrscr (); gotoxy (1,1); for (int i = 0; mes [ x] [i] [0]! = NULL; i + +) cprintf ( "% srn", mes [x] [i ]); p>
)
//((((((((((((((((((((((((((((((((((((((( p>
Література. p>
1. Курс лекцій з системного програмування.
2. Герберт Шилдт «C для професійних програмістів». P>
p>