Побудова формальної мови L
Найден While перевірка почалося з символу — і Перевірка на AB Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ — і Перевірка на AB Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ — 0 Перевірка на ЦБЗ, поточний символ — 0 Перевірка на FUNC, поточний символ — Перевірка на IDENT, поточний символ — c. Найден While перевірка почалося з символу — (Перевірка… Читати ще >
Побудова формальної мови L (реферат, курсова, диплом, контрольна)
Побудова формального мови L.
WHILE () [];
WHILE — вхідний термінальний символ.
— умовне выражение.
— деяка функція, яка може отсутствовать.
— параметри функції, які можуть отсутствовать Пример правильного синтаксиса:
WHILE (A>4444 T| = T | ≠ T 3. (O | T*O | T**O | T+O | T-O | T/O 4. (() | | 5. (Б{Б|Ц} 6. (Ц{Ц} 7. (([{,}]) 8. (| | (.
Класифікація G[Z].
G[]: 1. (while () []; 2. (T| < T| > T| = T | ≠ T 3. (O | T*O | T**O | T+O | T-O | T/O 4. (() | | 5. (Б{Б|Ц} 6. (Ц{Ц} 7. (([{,}]) 8. (| | (.
Сделаем заміну нетермінальних символів: (Z.
(A.
(B.
(З (D.
(E.
(F.
(G Зробимо заміну термінальних символів: WHILE (a ((b) (з; (d Ц (f Б (g, (h.
G[Z]: 1. Z (abAc[D]d 2. A (B|A B|A = B |A ≠ B 3. B (З | B*C | B**C | B+C | B-C | B/C 4. З (bAc | E | F 5. E (g{g|f} 6. F (f{f} 7. D (Eb[G{hG}]c 8. G (E | F | (Висновок: G[Z] - контекстно-свободная грамматика.
Вибір методу анализа.
Хоча однозначність у випадку для контекстно-зависимых граматик не доведено, її використання можливо для граматик у яких однозначність очевидна. Найбільш розробленим методом аналізу, для такого типу граматик є, метод рекурсивного спуска.
Діагностика й нейтралізація ошибок.
Розроблений алгоритм належить до загальновідомого методу синтаксичного розбору, запропонований Айронсом.
Основна ідея методу у тому, що у контексту без повернення відкидаються символів, що призвели в глухому куті і розбір продолжается.
Наведемо приклад синтаксичного разбора:
While (A >) cls (); 1. Z (abAc[D]d 2. A (B|A B|A = B |A ≠ B 3. B (З | B*C | B**C | B+C | B-C | B/C 4. З (bAc | E | F 5. E (g{g|f} 6. F (f{f} 7. D (Eb[G{hG}]c 8. G (E | F | (.
Z.
a b A з D.
B A E.
З B g{g} b G c.
E З (.
g E.
g.
While (A >) cls ().
;
тупикова ситуация.
Тестування на цепочках.
Протокол роботи синтаксичного распознавателя оператора циклу while мови С.
_____________________________________________________________________ Обробляємо рядок — While (a>)cls (); Найден While перевірка почалося з символу — (Перевірка на AB Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ — a Перевірка на AB Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ —) Перевірка на ЦБЗ, поточний символ —) Перевірка на FUNC, поточний символ — з Перевірка на IDENT, поточний символ — c.
Знайдені помилки у рядку While (a>)cls ();
Попередження: Відсутня умова () Не знайдено ідентифікатор чи ЦБЗ _____________________________________________________________________ Обробляємо рядок — while (13t*(ewqw++()*we) rscr (456,345,rtgrt, 34 5444rtr,).
Відсутня (Відсутня) Попередження: Відсутня умова () Відсутня; після функції Параметр функції неспроможна начинатся з цифри Невідомий идентификатор (ы) ;
435, 4, Не знайдено ідентифікатор чи ЦБЗ Ідентифікатор неспроможна починатися з цифри Не знайдено або вірний параметр Невідома знакова конструкція _____________________________________________________________________ Обробляємо рядок — whiLE (43-(sss (5 445 344>(5445r+erhgeerg (e>=rwe+++r+788erwe++)) scr (eee, qeer+erhgeerg (e>=rwe+++r+788erwe++)) scr (eee, qee77777u777) clrscr (,…,).
Найден While перевірка почалося з символу — (Перевірка на AB Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ — і Перевірка на AB Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ — 7 Перевірка на ЦБЗ, поточний символ — 7 Перевірка на FUNC, поточний символ — Перевірка на IDENT, поточний символ — з Перевірка на PAR, поточний символ —, Перевірка на IDENT, поточний символ —, Перевірка на ЦБЗ, поточний символ — ,.
Знайдені помилки у рядку while (i>77777u777) clrscr (,…,).
Відсутня; після функції Ідентифікатор неспроможна починатися з цифри Не знайдено або вірний параметр _____________________________________________________________________Обрабат ываем рядок — while (4545>>445—- ;
Найден While перевірка почалося з символу — (Перевірка на AB Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ — 4 Перевірка на ЦБЗ, поточний символ — 4 Перевірка на AB Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ — 4 Перевірка на ЦБЗ, поточний символ — 4 Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ — Перевірка на ЦБЗ, поточний символ — Перевірка на FUNC, поточний символ —; Перевірка на IDENT, поточний символ — ;
Знайдені помилки у рядку while (4545>>445—- ;
Відсутня) Попередження: відсутня ім'я функції Не знайдено ідентифікатор чи ЦБЗ Невідома знакова конструкція _____________________________________________________________________ Обробляємо рядок — while (i>=0);
Найден While перевірка почалося з символу — (Перевірка на AB Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ — і Перевірка на AB Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ — 0 Перевірка на ЦБЗ, поточний символ — 0 Перевірка на FUNC, поточний символ —; Перевірка на IDENT, поточний символ — ;
Знайдені помилки у рядку while (i>=0);
Попередження: відсутня ім'я функції _____________________________________________________________________ Обробляємо рядок — while (i>=0) 544();
Найден While перевірка почалося з символу — (Перевірка на AB Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ — і Перевірка на AB Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ — 0 Перевірка на ЦБЗ, поточний символ — 0 Перевірка на FUNC, поточний символ — Перевірка на IDENT, поточний символ — 5.
Знайдені помилки у рядку while (i>=0) 544();
Відсутня; після функції Попередження: відсутня ім'я функції _____________________________________________________________________ Обробляємо рядок — whilei>=0) clrscr ();13.
Найден While перевірка почалося з символу — і Перевірка на AB Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ — і Перевірка на AB Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ — 0 Перевірка на ЦБЗ, поточний символ — 0 Перевірка на FUNC, поточний символ — Перевірка на IDENT, поточний символ — c.
Знайдені помилки у рядку whilei>=0) clrscr ();13.
Відсутня (Попередження: Відсутня умова () _____________________________________________________________________ Обробляємо рядок — whilertt3432*23 432).
Найден While перевірка почалося з символу — (Перевірка на AB Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ — d Перевірка на AB Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ — 3 Перевірка на ЦБЗ, поточний символ — 3 Перевірка на TERM Перевірка на O Перевірка на IDENT, поточний символ — 2 Перевірка на ЦБЗ, поточний символ — 2 Перевірка на FUNC, поточний символ ;
Проверка на IDENT, поточний символ ;
Знайдені помилки у рядку while (dd>>3432*23 432).
Відсутня; після функції Попередження: відсутня ім'я функції Невідома знакова конструкция.
Лістинг программы.
ВАРИАHТ # 10.
Синтаксический распознователь оператора циклу While.
Файл програми — А513. cpp з текстом для распознования — test.513 з протоколом роботи — error.513.
Кафедpа: АСУ Гpуппа: А-513 Студент: Стариків Дмитро Олександрович Пpеподаватели: кандидата технічних наук, доцент.
Шоpников Юpий Владимиpович, асистент Панова Веpа Боpисовна Дата: 30 травня 1997 г.
//————————————————————————————————————— — // Заголовкові файли. //————————————————————————————————————— — #include #include #include #include #include #include.
#define UP 72 // стрілка вгору #define DOWN 80 // стрілка вниз #define ALTX 45 // вихід #define F1 59 #define F2 60 #define F3 61 #define ESC 27.
#define FL_NAME «test.513 «#define FL_TEST «error.513 «.
void open_fl (void); // откpыть файл void work_space (void); // упpавляет pабочей областю void print_page (void); // друкує текст на экpан void help_line (void); // текст з допомогою нижня стpочка void help (int); int scan (); // Робить розбір рядки int my_while (); // опеpатоp int AB (); // арифметичне вираз int TERM (); // Терм int O (); // Операнд int IDENT (); // Ідентифікатор int ZBZ (); // Ціле без знака int FUNC (); // Функція int PAR (); // Параметр
char TEXT[22][80]; int position; // Номер поточної сторінки int cur_y=3; // становище куpсоpа на экpане int x, y; // Поточна позиція при компіляції в рядку int f=0; // При f=1 помилки для функції char screen[4096]; // Сохpаняет повну копію экpана char screen1[4096]; // Сохpаняет частина экpана char *mistake[]={ «Помилок немає!!! », //0.
" Опеpатоp while не знайдено ", //1.
" Відсутня («, //2.
" Відсутня) ", //3.
" Попередження: Відсутня умова () ", //4.
" Відсутня; після функції «, //5.
" Попередження: відсутня ім'я функції «, //6.
" Пропущено / чи * чи ** чи + чи — «, //7.
" «, //8.
" Параметр функції неспроможна начинатся з цифри ", //9.
" Невідомий идентификатор (ы) — «, //10.
" Не знайдено ідентифікатор чи ЦБЗ ", //11.
" Ідентифікатор неспроможна починатися з цифри ", //12.
" Не знайдено або вірний параметр ", //13.
" Невідома знакова конструкція ", //14.
" «}; //15 FILE *fl_t;
int mistake_number[15]; //масив який зберігає коди помилок (0 чи 1).
//де 1-ошибка присутсвует, 0 у протилежному случае.
//mistake_number[i], де і номер помилки з mistake char strange[100]; //перелік невідомих идентификаторов.
//найденых в рядку під час розбору int s=0; //поточна позиція в strange.
void main ().
{ open_fl (); help_line (); print_page (); work_space ();
} //————————————————————————————————————— — // Відкриття файла //————————————————————————————————————— — void open_fl (void).
{.
FILE *fl; int і; window (1,1,80,25); textbackground (BLACK); textcolor (WHITE); clrscr ();
_setcursortype (_NOCURSOR); if ((fl_t= fopen (FL_TEST, «w »))== NULL) exit (1); if ((fl = fopen (FL_NAME, «r »))==NULL).
{ window (18,10,60,16); textbackground (GREEN); textcolor (BLACK); clrscr (); gotoxy (5,2);cprintf («Неможу знайти файл test.513 »); gotoxy (5,3);cprintf («Проверте його наявність на диску »); gotoxy (5,4);cprintf («чи створіть новий »); gotoxy (3,6);cprintf («Для продовження натисніть будь-яку клавішу »); getch (); exit (0);
} for (i=0;i Б{Б|Ц}rrrrn "); cprintf («6. -> Ц{Ц}rn »); cprintf («7. -> ([{,}])rn »); cprintf («8. -> | rn »);
} if (n == 3).
{ cprintf («n МОВА ОПЕРАТОРАnnnrr »); cprintf («WHILE (AB) [FUNCTION ([PAR, PAR,…])]; rnn »); cprintf («AB — Вислів rn »); cprintf («FUNCTION — функцияrn »); cprintf («PAR — параметри функції, може бути цифри чи текст rn »); cprintf («кількість їх ограниченоrnn »); cprintf («Прогалини між символами недопустимыrnnn »);
} getch (); puttext (1,8,80,22,string); window (1,1,80,25);
}.
//————————————————————————————————————— — // Сканує до появи While //————————————————————————————————————— — int scan ().
{ int k, j, w; //лічильники mistake_number[1]=1; for (j=0;;j++).
{ if (TEXT[x][j] == NULL) break; if (TEXT[x][j] == «W »).
{ y=j; //якщо знайшли W чи w if (my_while () == 1) break; //то вызываем.
} //my_while if (TEXT[x][j] == «w »).
{ y=j; if (my_while () == 1) break;
} if (TEXT[x][j] ≠ «»).
{ strange[s++]=TEXT[x][j]; mistake_number[10]=1;
} if (TEXT[x][j] == «»).
{ strange[s++]= «, «; strange[s++]= «» ;
}.
} strange[s]=NULL; return (1);
}.
//————————————————————————————————————— — // Обробляє While і обробку функцій //————————————————————————————————————— — int my_while ().
{ char str[10]; int k, j, w; //лічильники for (w=0;w ").
{ y++; if (TEXT[x][y] == «= «) y++; for (z=0;z.