Термінова допомога студентам
Дипломи, курсові, реферати, контрольні...

Розробка синтаксичного розпізнавача оператора, що обчислюється, переходу мови FORTRAN

РефератДопомога в написанніДізнатися вартістьмоєї роботи

DrawBox (2,1,40,11, «Мова оператора «); window (22,9,58,17); textcolor (BLACK); cputs («rn «); cputs («GOTO CONST — VAR — АВrnn «); cputs («CONST — Дробове без знака, rn «); cputs («VAR — идентификатоp, rn «); cputs («АВ — аpифметическое выpажение. «); Подключаемый файл. //(((((((((((((((((((((((((((((((((((((((#include «intface.h «// Файл з функціями інтерфейсу… Читати ще >

Розробка синтаксичного розпізнавача оператора, що обчислюється, переходу мови FORTRAN (реферат, курсова, диплом, контрольна)

Міністерство науки, вищій школі та програмах технічної політики Российской.

Федерации.

Новосибірський Государственный.

Технічний Университет.

[pic].

Курсова робота з системному программированию.

Розробка синтаксичного распознавателя вычисляемого оператора переходу мови FORTRAN. Факультет: АВТ. Кафедра: АСУ. Група: А-513. Студент: Борзов Андрію Миколайовичу. Викладач: Лимарів Юрію Володимировичу. Асистент: Панова Віра Борисівна. Дата: 19 травня 1997 року. Позначка про захист: _______________________________.

Новосибірськ — 1997.

Мова оператора.

Мова вычисляемого оператора переходу мови FORTRAN.

GOTO МЕТКА (КОНСТАНТА (АРИФМЕТИЧЕСКОЕ ВЫРАЖЕНИЕ МЕТКА — Идентификатор КОНСТАНТА — ЦІЛУ БЕЗ ЗНАКА АРИФМЕТИЧЕСКОЕ ВИРАЗ — ВИРАЗ, ЩО МІСТИТЬ У СОБІ ОПЕРАЦІЇ *, /, -, +, **, А ТАКОЖ ().

** - СПОРУДЖЕННЯ У СТЕПЕНЬ.

Граматика языка.

G[]: 1. (GOTO 2. (Т (+Т ((Т 3. Т (Про (Т (О (Т/О (Т ((О 4. Про (() ((5. (Б{Б (Ц}[(] 6. (Ц{Ц}[.Ц{Ц}][(].

|Т |- |ТЕРМ | |Про |- |ОПЕРАНД | |Б |- |БУКВА | |Ц |- |ЦИФРА | |ДБЗ |- |ДРОБОВЕ БЕЗ ЗНАКА | |(|- |КІНЕЦЬ СТРОКИ (порожньо) | |** |- |СПОРУДЖЕННЯ У РІВЕНЬ |.

Класифікація грамматики.

Ця граматика G[], відповідно до класифікації Хомского, є контекстно-свободной, оскільки права частина кожної редукції починається або з термінального символу, або з нетермінального, належить объединённому словарю.

A (a, A (Vn, a (V (.

Граматика G[] перестав бути автоматною, бо всі їх редукції розпочинаються з термінального символу. З цієї причини дана граматика перестав бути P. S — грамматикой.

Метод анализа.

Для даної граматики реалізований розбір методом рекурсивного спуску, оскільки він належить до класу контекстно-свободных.

Ідея методу у тому, кожному нетерминальному символу ставлять у відповідність певна програмна одиниця (функція), яка распознаёт ланцюжок, породжувану цим нетерминалом.

Ці процедури і функції викликаються відповідно до правилами граматики і часом викликають самі себя.

Він реалізований мовою З++, оскільки вона має рекурсивними возможностями.

Діагностика й нейтралізація ошибок.

Для даної граматики роблять лише діагностика, і нейтралізація помилок. Виправлення помилок не производится.

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

Тестирование.

((((((((((((((((((((((((((((((((((((((((.

Протокол роботи синтаксичного распознавателя вычисляемого оператора переходу мови FORTRAN. ((((((((((((((((((((((((((((((((((((((((GOTO A+B-DD**(CC/(23+34**R))+Y*((C)) ((((((((((((((((((((((((((((((((((((((((AB — Перевірка на Арифметичне Вислів. SCAN — Сканування. Поточний символ «A «з кодом 65. T — Перевірка на Терм. O — Перевірка на Операнд. IDENT — Перевірка на Ідентифікатор з символу A. SCAN — Сканування. Поточний символ «+ «з кодом 43. AB — Перевірка на Арифметичне Вислів. SCAN — Сканування. Поточний символ «B «з кодом 66. T — Перевірка на Терм. O — Перевірка на Операнд. IDENT — Перевірка на Ідентифікатор з символу B. SCAN — Сканування. Поточний символ «- «з кодом 45. AB — Перевірка на Арифметичне Вислів. SCAN — Сканування. Поточний символ «D «з кодом 68. T — Перевірка на Терм. O — Перевірка на Операнд. IDENT — Перевірка на Ідентифікатор з символу D. SCAN — Сканування. Поточний символ «D «з кодом 68. SCAN — Сканування. Поточний символ «* «з кодом 42. SCAN — Сканування. Поточний символ «* «з кодом 42. SCAN — Сканування. Поточний символ «(«з кодом 40. T — Перевірка на Терм. O — Перевірка на Операнд. AB — Перевірка на Арифметичне Вислів. SCAN — Сканування. Поточний символ «З «з кодом 67. T — Перевірка на Терм. O — Перевірка на Операнд. IDENT — Перевірка на Ідентифікатор з символу З. SCAN — Сканування. Поточний символ «З «з кодом 67. SCAN — Сканування. Поточний символ «/ «з кодом 47. SCAN — Сканування. Поточний символ «(«з кодом 40. T — Перевірка на Терм. O — Перевірка на Операнд. AB — Перевірка на Арифметичне Вислів. SCAN — Сканування. Поточний символ «2 «з кодом 50. T — Перевірка на Терм. O — Перевірка на Операнд. IDENT — Перевірка на Ідентифікатор з символу 2. FLOAT — Перевірка на Дробове Без Знака з цифри 2. SCAN — Сканування. Поточний символ «3 «з кодом 51. SCAN — Сканування. Поточний символ «+ «з кодом 43. AB — Перевірка на Арифметичне Вислів. SCAN — Сканування. Поточний символ «3 «з кодом 51. T — Перевірка на Терм. O — Перевірка на Операнд. IDENT — Перевірка на Ідентифікатор з символу 3. FLOAT — Перевірка на Дробове Без Знака з цифри 3. SCAN — Сканування. Поточний символ «4 «з кодом 52. SCAN — Сканування. Поточний символ «* «з кодом 42. SCAN — Сканування. Поточний символ «* «з кодом 42. SCAN — Сканування. Поточний символ «R «з кодом 82. T — Перевірка на Терм. O — Перевірка на Операнд. IDENT — Перевірка на Ідентифікатор з символу R. SCAN — Сканування. Поточний символ ») «з кодом 41. SCAN — Сканування. Поточний символ ») «з кодом 41. SCAN — Сканування. Поточний символ «+ «з кодом 43. AB — Перевірка на Арифметичне Вислів. SCAN — Сканування. Поточний символ «Y «з кодом 89. T — Перевірка на Терм. O — Перевірка на Операнд. IDENT — Перевірка на Ідентифікатор з символу Y. SCAN — Сканування. Поточний символ «* «з кодом 42. SCAN — Сканування. Поточний символ «(«з кодом 40. T — Перевірка на Терм. O — Перевірка на Операнд. AB — Перевірка на Арифметичне Вислів. SCAN — Сканування. Поточний символ «(«з кодом 40. T — Перевірка на Терм. O — Перевірка на Операнд. AB — Перевірка на Арифметичне Вислів. SCAN — Сканування. Поточний символ «З «з кодом 67. T — Перевірка на Терм. O — Перевірка на Операнд. IDENT — Перевірка на Ідентифікатор з символу З. SCAN — Сканування. Поточний символ ») «з кодом 41. SCAN — Сканування. Поточний символ ») «з кодом 41. SCAN — Сканування. Поточний символ NULL з кодом 0. ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((GOTO A ((((((((((((((((((((((((((((((((((((((((AB — Перевірка на Арифметичне Вислів. SCAN — Сканування. Поточний символ «A «з кодом 65. T — Перевірка на Терм. O — Перевірка на Операнд. IDENT — Перевірка на Ідентифікатор з символу A. SCAN — Сканування. Поточний символ NULL з кодом 0. ((((((((((((((((((((((((((((((((((((((((.

Лістинг программы.

//(((((((((((((((((((((((((((((((((((((((// FILE «KURSOVIK.CPP ». //(((((((((((((((((((((((((((((((((((((((// ВАРИАHТ № 3. //(((((((((((((((((((((((((((((((((((((((// Оператор переходу який вираховується мови FORTRAN. //(((((((((((((((((((((((((((((((((((((((// Кафедра: АСУ. // Група: А-513. // Студент: Борзов Андрій Hиколаевич. // Викладачі: кандидата технічних наук, доцент Лимарів Юрій Володимирович, // асистент Панова Віра Борисівна. // Дата: 29 квітня 1997 р. //(((((((((((((((((((((((((((((((((((((((// Які Підключаються файли. //(((((((((((((((((((((((((((((((((((((((#include #include #include #include #include #include #include #include «keyboard.h «//(((((((((((((((((((((((((((((((((((((((// Макровизначення. //(((((((((((((((((((((((((((((((((((((((#define ERROR 0 // Код помилки. #define COL_STR 20 // Максимальне кількість рядків. #define STR_LEN 35 // Довжина рядки. #define MAX_STR_LEN 255 // Максимальна довжина рядки. #define FILENAME «TEST.TXT «// Ім'я файла, открываемого по вмовчанням. #define YES 1 #define NO 2 #define OK 3 //#define TEST // Визначено, якщо включений отладочный режим. //(((((((((((((((((((((((((((((((((((((((// Прототипи функцій. //(((((((((((((((((((((((((((((((((((((((int I_ReadKey (void); // Опитування клавіатури. void Welcome (void); // Екран при старті програми. void Menu (void); // Меню. void Help (void); // Допомога. void MyExit (int=0); // Коректний вихід із програми. void Beep (int=500,int=100); // Звукове сигнал. void Usage (void); // Використання програми. int OpenFile (void); // Відкриття файла. void DrawBox (int, int, int, int, char*); // Малює рамку з заголовком. void PrintText (void); // Друкує основний текст. void Screen (void); // Перерисовка екрана. void Compile (void); // Компіляція. void Message (int); // Висновок повідомлень помилки. void MyPuts (char*, int); // Аналог puts (char*);. void Language (void); // Мова оператора. void Grammar (void); // Граматика мови. void GetFilename (void); // Запит імені файла відкриття. int ScanStr (char*); // Пошук GOTO. int Scaner (char*); // Обробка рядки. void Scan (void); // Сканування наступного символу. void Delspace (char*); // Видалення непотрібних прогалин в рядку. int AB (void); // Реалізація нетермінала. int T (void); // Реалізація нетермінала. int O (void); // Реалізація нетермінала. int IDENT (void); // Реалізація нетермінала. int FLOAT (void); // Реалізація нетермінала. void Error (int=0,char* = «»); // Обробка помилки. //(((((((((((((((((((((((((((((((((((((((// Глобальні перемінні. //(((((((((((((((((((((((((((((((((((((((char filename[MAX_STR_LEN]; // Ім'я файла. char *text[COL_STR+1]; // Масив покажчиків на рядки тексту. char screen[4096]; // Буфер під копію екрана. char mes[21][20][80]; // Масив під повідомлення помилки. char nx; // Поточний символ. int pos; // Поточна позиція в рядку. char STR[80]; // Сканируемая рядок. int ERR1; // Лічильник сторінок на масиві помилок. int ERR2; // Лічильник рядків масиві помилок. FILE *errors; // Дескриптор файла. //(((((((((((((((((((((((((((((((((((((((// Функція MAIN. //(((((((((((((((((((((((((((((((((((((((void main (int argc, char* argv[]).

{ textcolor (LIGHTGRAY); textbackground (BLACK);

_setcursortype (_NOCURSOR); clrscr (); if (argc>2).

{.

Usage ();

MyExit ();

} if (argc==2) strcpy (filename, argv[1]); else.

{.

Welcome (); gettext (20,7,60,17,screen);

GetFilename ();

} while (OpenFile ()).

{ puttext (20,7,60,17,screen);

GetFilename ();

}.

Menu ();

} //(((((((((((((((((((((((((((((((((((((((// Висновок повідомлень помилки. //(((((((((((((((((((((((((((((((((((((((void Message (int j).

{ window (42,3,79,23); textcolor (BLUE); textbackground (CYAN); clrscr (); for (int i=0;i GOTO rn "); cputs («2. -> T | +T | -Trn »); cputs («3. T -> O | T*O | T/O | T**Orn »); cputs («4. O -> () | | rn »); cputs («5. -> Б{Б|Ц}[(]rn »); cputs («6. -> Ц{Ц}[.Ц{Ц}][(]rnn »); cputs («T — Теpм;rn »); cputs («O — Опеpанд;rn »); cputs («Б — Буква;rn »); cputs («Ц — Цифpа;rn »); cputs («ДБЗ — Дробове Без Знака;rn »); cputs («** - спорудження до рівня. »);

I_ReadKey ();

} //(((((((((((((((((((((((((((((((((((((((// Мова оператора. //(((((((((((((((((((((((((((((((((((((((void Language (void).

{ window (1,25,80,25); textattr (112);

MyPuts («~F1~ Help ~F2~ Grammar ~F3~ Language ~F9~ Compile ~F10~ Quit ~Alt-X~.

Quit ~Esc~ Quit ", DARKGRAY); window (20,8,60,18); textcolor (WHITE); textbackground (GREEN); clrscr ();

DrawBox (2,1,40,11, «Мова оператора »); window (22,9,58,17); textcolor (BLACK); cputs («rn »); cputs («GOTO CONST | VAR | АВrnn »); cputs («CONST — Дробове без знака, rn »); cputs («VAR — идентификатоp, rn »); cputs («АВ — аpифметическое выpажение. »);

I_ReadKey ();

} //(((((((((((((((((((((((((((((((((((((((// Компіляція. //(((((((((((((((((((((((((((((((((((((((void Compile (void).

{ static int compile=0; window (1,25,80,25); textattr (112);

MyPuts («~F1~ Help ~F2~ Grammar ~F3~ Language ~F9~ Compile ~F10~ Quit ~Alt-X~.

Quit ~Esc~ Quit ", DARKGRAY); window (20,8,60,18); textcolor (WHITE); textbackground (RED); clrscr ();

DrawBox (2,1,40,11, «Компіляція »); window (22,9,58,17); textcolor (YELLOW); cputs («rn »); if (compile>0).

{ cputs («Текст ВЖЕ откомпилирован!!! »);

Beep (900,1000); return;

} errors=fopen («PROTOCOL.TXT », «wt »); cputs («Йде компиляция. rnn Будь ласка, почекайте… »); #ifdef TEST window (1,1,80,25); textattr (78); clrscr (); #endif.

fprintf (errors, «/*******************************************************n ») ;

fprintf (errors, «--------------------------------------------------------n »); fprintf (errors, «(Протокол роботи синтаксичного распознавателя вычисляемого (n »); fprintf (errors, «(оператора переходу мови FORTRAN. (n »);

fprintf (errors, «--------------------------------------------------------n »); for (int i=0;text[i] ≠ NULL;i++).

Scaner (text[i]);

fprintf (errors, «--------------------------------------------------------n »); fprintf (errors, «(КОНЕЦ.

(n ");

fprintf (errors, «--------------------------------------------------------n ») ;

fprintf (errors, «*******************************************************/n ») ;

Beep (900,100); compile++;

} //(((((((((((((((((((((((((((((((((((((((// Обробка рядки. //(((((((((((((((((((((((((((((((((((((((int Scaner (char* string).

{ char tmpstr[STR_LEN]; strcpy (tmpstr, string);

Delspace (tmpstr);

ScanStr (tmpstr); return 0;

} //(((((((((((((((((((((((((((((((((((((((// Пошук в рядку оператора GOTO. //(((((((((((((((((((((((((((((((((((((((int ScanStr (char* string).

{ int j; int i=0; int k=0; static int a=0; char tmp[80]; char label=NO; strcpy (STR, string);

fprintf (errors, «--------------------------------------------------------n »); fprintf (errors, «%sn », string);

fprintf (errors, «--------------------------------------------------------n »); do.

{ tmp[0]=NULL; j=0; while (!isspace (string[k++]) && string[k-1]≠NULL).

{ tmp[j++]=string[k-1];

} tmp[j]=NULL; if ((strcmp (tmp, «GOTO ») ≠ 0) && !isdigit (tmp[0])).

{ #ifdef TEST cprintf («Не визначено ідентифікатор %s.rn », tmp); #endif.

ERR1=a;

ERR2=i; i++;

Error (5,tmp);

} else if (!isdigit (tmp[0])).

{ label=YES;

ERR1=a;

ERR2=i; pos=k; while (AB ()≠OK); break;

}.

} while (string[k] ≠ NULL); if (label==NO).

{ #ifdef TEST cprintf («Не знайдено оператор GOTO. rnСтрока розбору не подлежит. rn »); #endif.

Error (6);

} a++; return (OK);

} //(((((((((((((((((((((((((((((((((((((((// Видалення в рядку прогалин. //(((((((((((((((((((((((((((((((((((((((void Delspace (char* string).

{ char str[STR_LEN]; int j=0; int i=0; while (isspace (string[i]) && string[i] ≠ NULL) і++; for (;string[i] ≠ NULL;i++).

{ if (islower (string[i])) string[i]=toupper (string[i]); str[j++]=string[i];

} str[j]=NULL; sprintf (string, «%p.s », str); string[j-1]=NULL; #ifdef TEST textattr (30); clreol (); cputs (string); textattr (78); cputs («rn »); #endif.

} //(((((((((((((((((((((((((((((((((((((((// Реалізація нетермінала. //(((((((((((((((((((((((((((((((((((((((int AB (void).

{ #ifdef TEST cprintf («AB — Перевірка на Арифметичне Выражение. rn »); #endif fprintf (errors, «AB — Перевірка на Арифметичне Выражение. n »);

Scan ();

T (); if (nx== «+ »).

{.

AB ();

} else if (nx== «- «).

{.

AB ();

} if (nx==NULL) return (OK); else if (nx≠ «* «&& nx≠ «/ «&& nx≠ «) »).

Error (1); return (YES);

} //(((((((((((((((((((((((((((((((((((((((// Реалізація нетермінала. //(((((((((((((((((((((((((((((((((((((((int T (void).

{ #ifdef TEST cprintf («T — Перевірка на Терм. rn »); #endif fprintf (errors, «T — Перевірка на Терм. n »);

O (); if (nx== «/ «).

{.

Scan ();

T ();

} else if (nx== «* »).

{.

Scan (); if (nx== «* »).

{.

Scan ();

T ();

} else T ();

} if (nx==NULL) return (OK); else if (nx≠ «+ «&& nx≠ «- «&& nx≠ «) »).

Error (2); return (OK);

} //(((((((((((((((((((((((((((((((((((((((// Реалізація нетермінала. //(((((((((((((((((((((((((((((((((((((((int O (void).

{ #ifdef TEST cprintf («O — Перевірка на Операнд. rn »); #endif fprintf (errors, «O — Перевірка на Операнд. n »); if (nx== «(«).

{.

AB (); if (nx≠ «) »).

Error (3); else.

{.

Scan (); return (OK);

}.

} else if (IDENT () == NO).

{ if (FLOAT () == NO).

Error (4);

} return (OK);

} //(((((((((((((((((((((((((((((((((((((((// Реалізація нетермінала. //(((((((((((((((((((((((((((((((((((((((int IDENT (void).

{ #ifdef TEST cprintf («IDENT — Перевірка на Ідентифікатор з символу %c.rn », nx); getch (); #endif fprintf (errors, «IDENT — Перевірка на Ідентифікатор з символу %c.n », nx); if (isalpha (nx)).

{ while (isalpha (nx) || isdigit (nx)).

Scan (); return (YES);

} return (NO);

} //(((((((((((((((((((((((((((((((((((((((// Реалізація нетермінала. //(((((((((((((((((((((((((((((((((((((((int FLOAT (void).

{ #ifdef TEST cprintf («FLOAT — Перевірка на Дробове Без Знака з цифри %c.rn », nx); getch (); #endif fprintf (errors, «FLOAT — Перевірка на Дробове Без Знака з цифри %c.n », nx); if (isdigit (nx)).

{ while (isdigit (nx)).

Scan (); if (nx== «. »).

{.

Scan (); while (isdigit (nx)).

Scan ();

} return (YES);

} return (NO);

} //(((((((((((((((((((((((((((((((((((((((// Сканування наступного символу з рядки. //(((((((((((((((((((((((((((((((((((((((void Scan (void).

{ #ifdef TEST cprintf («SCAN — Сканування. Поточний символ «%з «з кодом %d.rn », STR[pos], STR[pos]); getch (); #endif fprintf (errors, «SCAN — Сканування. Поточний символ «%з «з кодом.

%d.n ", STR[pos], STR[pos]); nx=STR[pos]; pos++;

} //(((((((((((((((((((((((((((((((((((((((// Обробка помилок. //(((((((((((((((((((((((((((((((((((((((void Error (int num, char* s).

{ char *E[40]=.

{.

" Очікується «+ «чи «- «» ,.

" Очікується «* », «/ «чи «** «» ,.

" Очікується ") «» ,.

" Очікується ідентифікатор чи Дробове без знака " ,.

" Не визначено ідентифікатор " ,.

" Не знайдено оператор GOTOrnСтрока розбору заборонена " ,.

NULL.

}; sprintf (mes[ERR1][ERR2], «%s%s », E[num-1], s);

fprintf (errors, «--------------------------------------------------------n »); fprintf (errors, «Error — Помилка рядок %d, помилка # %d.n », ERR1, ERR2); #ifdef TEST cprintf («Error — Помилка: рядок # %d, помилка # %d.rn », ERR1, ERR2); cprintf («%srn », mes[ERR1][ERR2]); Beep (1000,200); getch (); #endif fprintf (errors, «%sn », mes[ERR1][ERR2]);

fprintf (errors, «--------------------------------------------------------n ») ;

ERR2++; mes[ERR1][ERR2][0]=NULL;

} //(((((((((((((((((((((((((((((((((((((((// Подключаемый файл. //(((((((((((((((((((((((((((((((((((((((#include «intface.h «// Файл з функціями інтерфейсу. //(((((((((((((((((((((((((((((((((((((((// (1997 Борзов Андрій Hиколаевич. Е-mail: [email protected]. //(((((((((((((((((((((((((((((((((((((((.

1. Курс лекцій з системному програмування. 2. Герберт Шилдт «З для професійних программистов».

Показати весь текст
Заповнити форму поточною роботою