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