Міністерство науки, вищої школи і технічної політики Російської p>
Федерації. p>
Новосибірський Державний p>
Технічний Університет. p>
p >
Курсова робота з системного програмування. p>
Оператор присвоювання мови FORTRAN.
Факультет: АВТ.
Кафедра: АСУ.
Група: А-513.
Студент: Єфименко Денис Володимирович.
Викладач: Шорников Юрій Володимирович.
Асистент: Панова Віра Борисівна.
Дата: 10 червня 1997 року.
Відмітка про захист: _______________________________ p>
Новосибірськ - 1997. P>
Мова оператора. P>
Мова оператора присвоєння FORTRAN. P>
Ідентифікатор = арифметичне вираз
Арифметичне вираз - вираз, що містить у собі операції *, /, -,
+, **, А також (). P>
** - піднесення до степеня. P>
Граматика мови. P>
G []:
1. (=
2. (Т (+ Т ((Т
3. Т (О (Т (О (Т/О (Т ((Про
4. Про (() ((
5. (Б (Б (Ц }[(]< br>6. (Ц (Ц) [. Ц (Ц }][(] p>
| Т | - | ТЕРМ |
| Про | - | Операнд |
| Б | - | БУКВА |
| Ц | - | ЦИФРА |
| ДБЗ | - | Дробная БЕЗ ЗНАКА |
| (| - | КІНЕЦЬ СТРОКИ (пусто) |
| ** | - | Піднесення до степеня | p>
Класифікація граматики. P>
Дана граматика G [], згідно з класифікацією Хомського,є контекстно-вільною, так як права частина кожної редукціїпочинається або з термінального символу, або з нетермінального,що належить об'єднаному словника. p>
A (a, A (Vn, a (V (. p>
Граматика G [] не є автоматною, тому що не всі їїредукції починаються з термінального символу. З цієї ж причини данаграматика не є S - граматикою. p>
Метод аналізу. p>
Для даної граматики реалізований розбір методом рекурсивного спуску,оскільки вона належить до класу контекстно-вільних. p>
Ідея методу полягає в тому, що кожному нетермінальному символуставиться у відповідність певна програмна одиниця (функція), якарозпізнає ланцюжок, що породжуються цим нетерміналом. p>
Ці процедури і функції викликаються відповідно до правилграматики і іноді викликають самі себе. p>
Даний метод реалізований на мові C + +, оскільки він володієрекурсивними можливостями. p>
Діагностика та нейтралізація помилок. p>
Для даної граматики проводиться тільки діагностика та нейтралізаціяпомилок. Виправлення помилок не проводиться. P>
Нейтралізація помилок здійснюється за методом Айронса, тобто,спускаючись по синтаксичному дереву без повернення на контекст, привиявленні тупикової ситуації відкидаються ті літери (символи), якіпривели в контексте і розбір триває. p>
Тестування. p>
12 = 1
Назва ідентифікатора має починатися з літери.
-------------------------------------------------- -------s223 = (s )+((( d)))
ПОМИЛОК НІ !!!!!< br>-------------------------------------------------- -------sdsds = skshj ** mxnx dc
Некоректна операція або неправильне ім'я ідентифікатора.
-------------------------------------------------- -------< br>;; = 0
Назва ідентифікатора має починатися з літери.
Ідентифікатор складається тільки з літер або цифр.
-------------------------------------------------- -------as = 115/3
ПОМИЛОК НІ !!!!!< br>-------------------------------------------------- -------< br>32 =-*=< br>Назва ідентифікатора має починатися з літери.
Відсутній ідентифікатор або число.
Відсутній ідентифікатор або число.
Невідома операція або неправильне ім'я ідентифікатора.
Відсутній ідентифікатор або число.
-------------------------------------------------- -------sdvsf + gsdf = 0
Слевa від '=' операцій бути не може.
-------------------------------------------------- -------jhg = 321 +321/54 * 4 (s 25)
Некоректна операція або неправильне ім'я ідентифікатора.
-------------------------------------------------- -------d56gfsdfg = (ld 5
Довжина імені ідентифікатора не повинна бути більше 6.
Відсутній')'.< br>-------------------------------------------------- ------- p>
Лістинг програми. p>
// SP_KURS.CPP: Курсова робота з системного програмування.
//
//Оператора присвоєння МОВИ "ФОРТРАН"
//
//Ім'я файлу test p>
# include
# include
# include
# include
# include
# include
# include
# define UP 72/* стрілка вгору */
# define DOWN 80/* стрілка вниз */
# define EXIT '33 '/ * Esc */
# define END 100 p>
enum LEX (ERROR, CBZ, ID, PLUS, MIN, DIV, MUL, STEP, SKL, SKR, RAV, _EOLN_, _EOF_);int next, number = 0, num = 0, temp, line = 1, err [80], sum;int mistake [15] [80], ofset = 0;char cordinat [80] [80], filename [80];char * type_mis []={" ПОМИЛОК НІ !!!!!",< br>"Ім'я ідентифікатора має починатися з літери.",
"Ідентифікатор складається тільки з літер або цифр.",
"Слевa від '=' операцій бути не може.",
"Невідома конструкція (немає'=').",< br>"Довжина імені ідентифікатора не повинна бути більше 6.",
"Відсутній')'.",< br>"Невідома операція або неправильне ім'я ідентифікатора.",
"Відсутній ідентифікатор або число.",
"Відсутній'('.",< br>"Некоректна операція або неправильне ім'я ідентифікатора.",
"Відсутній вираз (А =?).",
"Відсутній ідентифікатор (? = B ).",< br>"",}; P>
const int X1 = 2, Y1 = 20, X2 = 80, Y2 = 25;const int YWINDOW = Y2-Y1 1;void viewwin (int, int);void putmistake (int);int MENU (char *);void identif ();void ravno ();void expr (void);void term (void);void operand (void);int scaner (void);void error (int);void makefile (void);
FILE * in, * out; p>
void main (void)
(strcpy (cordinat [0], "n");mistake [0] [0] = 13; mistake [0] [1] = END;clrscr ();printf ( "Введіть ім'я оброблюваного файлу:");gets (filename);if ((in = fopen (filename, "r "))== NULL)
(printf (" n ПОМИЛКА!!! Файл вже НЕ ІСНУЄ !!!"); exit (-1);
)while (! feof (in))
(ravno (); mistake [line] [ofset] = END; line + +; ofset = 0;
)fcloseall ();makefile ();num = 0;window (1,1,80,25);clrscr ();gotoxy (1,1);
MENU ( "оператора присвоєння МОВИ /" "ФОРТРАН /" "n");clrscr ();window (1,1,80,25);clrscr ();printf ( "nnnnnnnnnn ВСІ ПОМИЛКИ що зберігається у файлі
/ "" ERRORS.TXT /""!!!!!");printf ( "nnnnnnnnnn НАТИСНІТЬ БУДЬ-ЯКУ
КЛАВІШУ !!!!!! ");fcloseall ();exit (1);
) p>
void ravno ()
(temp = 0;num = 0;sum = 0;next = scaner ();if ((next! = _EOLN_) & & (next! = _EOF_))
(if (next == RAV)
(error (12); err [0] = END;
) else identif ( ); if (next! = RAV) error (4); else p>
(temp = 1; if (err [0]! = END) p>
(if (err [0 ]! = ID) error (1); for (int i = 1; i6) error (5);
) p>
// НЕТЕРМІНАЛ "O" void operand ()
(if (next == SKL)
(next = scaner (); expr (); if (next! = SKR) error (6); else next = scaner ();
) else
( if (next == ID) (identif (); next = scaner ();) else p>
(if (next! = CBZ) p>
(if ((next! = _EOLN_ ) & & (next! = _EOF_)) p>
(if (next == ERROR) p>
(error (7); next = scaner (); operand (); p >
) else p>
(if (next == RAV) error (7); else error (8); p>
) p>
) else error (8); p>
) else next = scaner (); p>
)// else
)// else
) p>
// НЕТEРМІНАЛ "Е" void expr (void)
(term ();while ((next == PLUS) | | (next == MIN))
(next = scaner (); expr ();
)
) p>
// НЕТЕРМІНАЛ "T" void term (void)
(operand (); while ((next == DIV) | | (next == MUL) | | (next == STEP))
(next = scaner (); term ();
)
) p>
void error (int choice)
(switch (choice)
(case 1: mistake [line] [ofset + +] = 1; break; case 2: mistake [line] [ofset + +] = 2; break; case 3: mistake [line] [ofset + +] = 3; break; case 4: mistake [line] [ofset + +] = 4; break; case 5: mistake [line] [ofset + +] = 5; break; case 6: mistake [line] [ofset + +] = 6; break; case 7: mistake [line] [ofset + +] = 7; break; case 8: mistake [line] [ofset + +] = 8; break; case 9: mistake [line] [ofset + +] = 9; break; case 10: mistake [line ] [ofset + +] = 10; break; case 12: mistake [line] [ofset + +] = 12; break; case 11: mistake [line] [ofset + +] = 11; break; default: break;
)
) p>
void makefile (void)
(char * s;int num_str = 0, oftemp, rep;if ((out = fopen ( "errors.txt", "w "))== NULL)
(printf (" n ПОМИЛКА!!! Файл вже НЕ ІСНУЄ !!!"); exit (-1 );
)if ((in = fopen (filename, "r "))== NULL)
(printf (" n ПОМИЛКА!!! ФАЙЛ НЕ МОЖНА ВІДКРИТИ ДЛЯ ЗАПИСИ !!!"); exit (-1);
)while (num_str + +, fgets (s, 80, in)! = NULL)
(fputs ("--------------------------- ------------------------------< br>", out); fputc ( 'n', out); fputs (s, out); fputc ( 'n', out); rep = strlen (s); s [rep-1] = '