Построение формального языка L WHILE( ) [
,
, .... ])>]; WHILE - входной терминальный символ - условное выражение - некоторая функция, которая может отсутствовать
- параметры функции, которые тоже могут отсутствовать Пример правильного синтаксиса: WHILE(A>44 A>44 clrscr() - функция, без параметров Подбор грамматики G[Z] по языку L
Любая грамматика, к примеру G[Z], содержит следующие базисные элементы Vt, Vn, Z, P, где: Vt - словарь терминальных символов Vn - словарь нетерминальных символов Z - начальный нетерминальный символ P - множество правил вывода G[]: а while( ) [];
а T| > T| >= T | ! = T а O | T*O | T**O | T+O | T-O | T/O а () | | а Б{Б|Ц} а Ц{Ц} а ([
{,
}])
а | | O Классификация G[Z] G[]: а while( ) [];
а T| > T| >= T | ! = T а O | T*O | T**O | T+O | T-O | T/O а () | | а Б{Б|Ц} а Ц{Ц} а ([
{,
}])
а | | O Сделаем замену нетерминальных символов: а Z а A а B а C а D а E а F
а G Сделаем замену терминальных символов: WHILE а a ( а b ) а c ; а d Ц а f Б а g , а h G[Z]: Z а abAc[D]d Aа B|A B|A = B |A ! = B B а C | B*C | B**C | B+C | B-C | B/C C а bAc | E | F E а g{g|f} F а f{f} D а Eb[G{hG}]c G а E | F | O Вывод : G[Z] - контекстно-свободная грамматика. Выбор метода анализа
Хотя однозначность в общем случае для контекстно-зависимых грамматик не доказана, ее использование возможно для грамматик в которых однозначность очевидна. Наиболее хорошо разработанным методом анализа, для данного типа грамматик является, метод рекурсивного спуска. Диагностика и нейтрализация ошибок
Разработанный алгоритм относится к общеизвестному методу синтаксического разбора, предложенный Айронсом.
Основная идея метода состоит в том, что по контексту без возврата отбрасываются те символы, которые привели в тупиковую ситуацию и разбор продолжается. Приведем пример синтаксического разбора: While (A > ) cls(); Z а abAc[D]d Aа B|A B|A = B |A ! = B B а C | B*C | B**C | B+C | B-C | B/C C а bAc | E | F E а g{g|f} F а f{f} D а Eb[G{hG}]c G а E | F | O Z a b A c D B A E C B g{g} b G c E C O g E g While ( A > ) cls ( ) ; тупиковая ситуация Тестирование на цепочках
Протокол работы синтаксического распознавателя оператора цикла while языка С.
_____________________________________________________________________ Обрабатываем строчку - While(a>)cls(); Найден While проверка началась с символа - ( Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - a Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - ) Проверка на ЦБЗ, текущий символ - ) Проверка на FUNC, текущий символ - c Проверка на IDENT, текущий символ - c Найденные ошибки в строке While(a>)cls(); Предупреждение: Отсутствует условие () Не найден идентификатор или ЦБЗ
_____________________________________________________________________ Обрабатываем строчку - while(1 Найден While проверка началась с символа - ( Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 1 Проверка на ЦБЗ, текущий символ - 1 Проверка на AB Проверка на TERM Проверка на O Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 3 Проверка на ЦБЗ, текущий символ - 3 Проверка на TERM Проверка на O Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 4 Проверка на ЦБЗ, текущий символ - 4 Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 5 Проверка на ЦБЗ, текущий символ - 5 Проверка на TERM Проверка на O Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 3 Проверка на ЦБЗ, текущий символ - 3 Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 4 Проверка на ЦБЗ, текущий символ - 4 Проверка на TERM Проверка на O Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 4 Проверка на ЦБЗ, текущий символ - 4 Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 4 Проверка на ЦБЗ, текущий символ - 4 Проверка на FUNC, текущий символ - ; Проверка на IDENT, текущий символ - ;
Найденные ошибки в строке while(1 Отсутствует ) Предупреждение: отсутствует имя функции
_____________________________________________________________________ Обрабатываем строчку - 435 4 whilei>>3t*(ewqw++()*we) rscr(456, 345, rtgrt, 345444rtr, ,, ) Найден While проверка началась с символа - i Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - i Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 3 Проверка на ЦБЗ, текущий символ - 3 Проверка на TERM Проверка на O Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - e Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - + Проверка на ЦБЗ, текущий символ - + Проверка на TERM Проверка на O Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - w Проверка на FUNC, текущий символ - r Проверка на IDENT, текущий символ - r Проверка на PAR, текущий символ - 4 Проверка на IDENT, текущий символ - 4 Проверка на ЦБЗ, текущий символ - 4 Проверка на PAR, текущий символ - 3 Проверка на IDENT, текущий символ - 3 Проверка на ЦБЗ, текущий символ - 3 Проверка на PAR, текущий символ - r Проверка на IDENT, текущий символ - r Проверка на PAR, текущий символ - 3 Проверка на IDENT, текущий символ - 3 Проверка на ЦБЗ, текущий символ - 3 Проверка на PAR, текущий символ - , Проверка на IDENT, текущий символ - , Проверка на ЦБЗ, текущий символ - ,
Найденные ошибки в строке 435 4 whilei>>3t*(ewqw++()*we) rscr(456, 345, rtgrt, 345444rtr, ,, ) Отсутствует ( Отсутствует ) Предупреждение: Отсутствует условие () Отсутствует ; после функции Параметр функции не может начинатся с цифры Неизвестный идентификатор(ы) 435, 4, Не найден идентификатор или ЦБЗ Идентификатор не может начинаться с цифры Не найден или не верный параметр Неизвестная знаковая конструкция
_____________________________________________________________________ Обрабатываем строчку - whiLE(43-(sss Найден While проверка началась с символа - ( Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 4 Проверка на ЦБЗ, текущий символ - 4 Проверка на TERM Проверка на O Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - s Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 2 Проверка на ЦБЗ, текущий символ - 2 Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - f Проверка на FUNC, текущий символ Проверка на IDENT, текущий символ - s Проверка на PAR, текущий символ - w Проверка на IDENT, текущий символ - w Найденные ошибки в строке whiLE(43-(sss Отсутствует ; после функции Пропущено / или * или ** или + или
_____________________________________________________________________ Обрабатываем строчку - while(i>344>(544523*232) clrscr(, ) Найден While проверка началась с символа - ( Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - i Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 3 Проверка на ЦБЗ, текущий символ - 3 Проверка на AB Проверка на TERM Проверка на O Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 5 Проверка на ЦБЗ, текущий символ - 5 Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 2 Проверка на ЦБЗ, текущий символ - 2 Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 3 Проверка на ЦБЗ, текущий символ - 3 Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 2 Проверка на ЦБЗ, текущий символ - 2 Проверка на TERM Проверка на O Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - w Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 2 Проверка на ЦБЗ, текущий символ - 2 Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 2 Проверка на ЦБЗ, текущий символ - 2 Проверка на FUNC, текущий символ Проверка на IDENT, текущий символ - c Проверка на PAR, текущий символ - , Проверка на IDENT, текущий символ - , Проверка на ЦБЗ, текущий символ - ,
Найденные ошибки в строке while(i>344>(544523*232) clrscr(, ) Отсутствует ; после функции Не найден или не верный параметр Неизвестная знаковая конструкция
_____________________________________________________________________ Обрабатываем строчку - while(u>r+erhgeerg(e>=rwe+++r+788erwe++)) scr(eee, qee Найден While проверка началась с символа - ( Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - u Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - r Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - e Проверка на AB Проверка на TERM Проверка на O Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - e Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - r Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - r Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 7 Проверка на ЦБЗ, текущий символ - 7 Проверка на FUNC, текущий символ Проверка на IDENT, текущий символ - s Проверка на PAR, текущий символ - e Проверка на IDENT, текущий символ - e Проверка на PAR, текущий символ - q Проверка на IDENT, текущий символ - q Проверка на PAR, текущий символ - Проверка на IDENT, текущий символ - Проверка на ЦБЗ, текущий символ -
Найденные ошибки в строке while(u>r+erhgeerg(e>=rwe+++r+788erwe++)) scr(eee, qee Отсутствует ; после функции Пропущено / или * или ** или + или Идентификатор не может начинаться с цифры Не найден или не верный параметр
_____________________________________________________________________ Обрабатываем строчку - while(i>77777u777) clrscr(, ...., ) Найден While проверка началась с символа - ( Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - i Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 7 Проверка на ЦБЗ, текущий символ - 7 Проверка на FUNC, текущий символ Проверка на IDENT, текущий символ - c Проверка на 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, текущий символ - i Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 0 Проверка на ЦБЗ, текущий символ - 0 Проверка на FUNC, текущий символ - ; Проверка на IDENT, текущий символ - ; Найденные ошибки в строке while(i>=0); Предупреждение: отсутствует имя функции
_____________________________________________________________________ Обрабатываем строчку - while(i>=0) 544(); Найден While проверка началась с символа - ( Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - i Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 0 Проверка на ЦБЗ, текущий символ - 0 Проверка на FUNC, текущий символ Проверка на IDENT, текущий символ - 5 Найденные ошибки в строке while(i>=0) 544(); Отсутствует ; после функции Предупреждение: отсутствует имя функции
_____________________________________________________________________ Обрабатываем строчку - whilei>=0) clrscr(); 13 Найден While проверка началась с символа - i Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - i Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 0 Проверка на ЦБЗ, текущий символ - 0 Проверка на FUNC, текущий символ Проверка на IDENT, текущий символ - c Найденные ошибки в строке whilei>=0) clrscr(); 13 Отсутствует ( Предупреждение: Отсутствует условие ()
_____________________________________________________________________ Обрабатываем строчку - whilertt Найден While проверка началась с символа - r Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - r Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 2 Проверка на ЦБЗ, текущий символ - 2 Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 3 Проверка на ЦБЗ, текущий символ - 3 Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 2 Проверка на ЦБЗ, текущий символ - 2 Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - = Проверка на ЦБЗ, текущий символ - = Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 3 Проверка на ЦБЗ, текущий символ - 3 Проверка на FUNC, текущий символ - w Проверка на IDENT, текущий символ - w
Найденные ошибки в строке whilertt Отсутствует ( Отсутствует ) Не найден идентификатор или ЦБЗ Не найден или не верный параметр
_____________________________________________________________________ Обрабатываем строчку - while(dd>>3432*23432) Найден While проверка началась с символа - ( Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - d Проверка на AB Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 3 Проверка на ЦБЗ, текущий символ - 3 Проверка на TERM Проверка на O Проверка на IDENT, текущий символ - 2 Проверка на ЦБЗ, текущий символ - 2 Проверка на FUNC, текущий символ Проверка на IDENT, текущий символ Найденные ошибки в строке while(dd>>3432*23432) Отсутствует ; после функции Предупреждение: отсутствует имя функции Неизвестная знаковая конструкция Листинг программы ВАРИА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], где 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 i; 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 { window(40-i, 12-i/5, 40+i, 12+i/5); textbackground(GREEN); textcolor(BLACK); clrscr(); delay(7); } textcolor(WHITE); gotoxy(12, 2); cprintf("Чтение строк для разбора"); gotoxy(12, 3); cprintf(" произведеное из"); gotoxy(12, 4); cprintf(" файла "); gotoxy(12, 5); cprintf(" test. 513 ");
gotoxy(7, 8); cprintf(" Для продолжения нажмите любую клавишу"); getch(); for (i=0; i {
if (fgets(TEXT[i], 78, fl)==NULL) break; // читать строку файла } TEXT[i][0]=NULL; position=0; //обнуление позиции сдвига стpаниц fclose(fl); }
//--------------------------------------------------------------------------- // Рабочая область
//--------------------------------------------------------------------------- void work_space(void) { char c; while(1) { gotoxy(1, cur_y); c=getch(); switch(c) { case UP: if(cur_y! =3) { cur_y--; print_page(); } else { if(position! =0) { position--; print_page(); cur_y=3; } } break; case DOWN: if(cur_y! =7) { cur_y++; if(TEXT[cur_y+position-3][0]==NULL) cur_y--; print_page(); } else { cur_y=7; if(TEXT[cur_y+position-2][0]! =NULL) { position++; print_page(); } } break; case F1: help(1); break; case F2: help(2); break; case F3: help(3); break; case ALTX: window(1, 1, 80, 25); textbackground(BLACK); textcolor(WHITE); fclose(fl_t); clrscr(); exit(1); case ESC: window(1, 1, 80, 25); textbackground(BLACK); textcolor(WHITE); clrscr(); fclose(fl_t); exit(1); } } }
//--------------------------------------------------------------------------- // Распечатывает текст, выводит на экран ошибки, найденные в обрабатываемой // (текущей) строке
//--------------------------------------------------------------------------- void print_page() { int i, xx=10; puttext(1, 1, 80, 25, screen); for(i=0; i mistake_number[i] = 0; strange[0]=NULL; s=0; x=cur_y+position-3; y=0; f=0;
fprintf(fl_t, "______________________________________________________________________________\n"); fprintf(fl_t, "Обрабатываем строчку - %s\n", TEXT[x]);
scan(); //вызывает сканер для разбора строки fprintf(fl_t, "\n Найденные ошибки в строке %s\n", TEXT[x]); for(i=0; i if(mistake_number[i] == 1) { gotoxy(4, xx++); printf("%s ", mistake[i]); fprintf(fl_t, " %s\n", mistake[i]); if(i==10 && mistake_number[i] == 1) { printf(" %s", strange); fprintf(fl_t, " %s\n", strange); } }
if(xx == 10) //ошибок нет, т. к. координаты строки { //неизменились (xx) gotoxy(4, xx++); printf("%s ", mistake[0]); } textbackground(BLACK); textcolor(WHITE); if(TEXT[0][0]! =NULL) { for (i=1; i { if(TEXT[i-1+position][0]==NULL) break; gotoxy(1, i+2); puts(TEXT[i-1+position]); } } gotoxy(1, cur_y); textbackground(RED); clreol(); puts(TEXT[cur_y+position-3]); }
//--------------------------------------------------------------------------- // Выводит на экран текст с помощью
//--------------------------------------------------------------------------- void help_line(void) { window(1, 1, 80, 25); textbackground(BLACK); clrscr(); textbackground(GREEN); textcolor(BLACK); gotoxy(1, 1); clreol();
printf(" Borland C++ Веpсия только для опеpатоpа WHILE"); gotoxy(1, 25); textbackground(LIGHTCYAN); clreol();
cprintf(" F1 - Помощь F2 - Грамматика F3 - Язык оператора ALT+X-Выход"); gotoxy(1, 2); textbackground(LIGHTCYAN); clreol();
printf("------------------------------- CОДЕРЖИМОЕ ФАЙЛА -------------------------------"); gotoxy(1, 8); textbackground(LIGHTCYAN); clreol();
printf("------------------------------ СООБЩЕНИЯ ОБ ОШИБКАХ ----------------------------"); gotoxy(1, 9); gettext(1, 1, 80, 25, screen); gettext(1, 9, 80, 24, screen1); }
//--------------------------------------------------------------------------- // Выводит на экран текст, в зависимости от значения n
//--------------------------------------------------------------------------- void help(int n) { char string[4096]; gettext(1, 8, 80, 22, string); window(1, 8, 80, 22); textbackground(CYAN); textcolor(BLACK); clrscr(); gotoxy(1, 1); if(n ==1) {
cprintf("\n HОВОСИБИРСКИЙ ГОСУДАРСТВЕHHЫЙ ТЕХHИЧЕСКИЙ УHИВЕРСИТЕТ\n\r\r"); cprintf(" Куpсовая pабота по дисциплине СИСТЕМHОЕ ПРОГРАММИРОВАHИЕ\n\r\r"); cprintf(" Синтаксический pаспознаватель\n\n\r\r\r"); cprintf(" Используемые клавиши: \r\n"); cprintf(" F1 - данный HELP. \r\n"); cprintf(" F2 - гpамматика языка. \r\n"); cprintf(" F3 - язык оператора. \r\n"); cprintf(" Esc - выход из программы. \r\n"); cprintf(" Alt-X - выход из программы. \r\n\n\n"); cprintf(" (c) 1997 Стариков Дмитрий Александрович"); } if(n == 2) { cprintf("\n ГРАММАТИКА ЯЗЫКА\n\n\r\r");
cprintf(" 1. -> WHILE ()[]; \n\r\r"); cprintf(" 2. -> T| >T | >=T | ! =T\n\r\r\r");
cprintf(" 3. T -> O | T+O | T-O | T*O | T/O | T**O\n\r\r\r"); cprintf(" 4. O ->() | | \n\r\r\r"); cprintf(" 5. -> Б{Б|Ц}\r\r\r\r\n"); cprintf(" 6. -> Ц{Ц}\r\n"); cprintf(" 7. -> ([
{,
}])\r\n"); cprintf(" 8.
-> | \r\n"); } if(n == 3) { cprintf("\n ЯЗЫК ОПЕРАТОРА\n\n\n\r\r"); cprintf(" WHILE(AB) [FUNCTION([PAR, PAR, ....])]; \r\n\n"); cprintf(" AB - Выражение \r\n"); cprintf(" FUNCTION - функция\r\n");
cprintf(" PAR - параметры функции, могут быть цифры или текст \r\n"); cprintf(" количество их не ограничено\r\n\n"); cprintf(" Пробелы между символами недопустимы\r\n\n\n"); } 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 { if(TEXT[x][y] == NULL) break; str[w]=toupper(TEXT[x][y++]); //Toupper - переводит } //все буквы в заглавные str[w]=NULL;
if(strcmp(str, "WHILE") == 0) //Если While найден то производим { // дальнейший разбор
fprintf(fl_t, "Найден While проверка началась с символа - %c\n", TEXT[x][y]); if(TEXT[x][y] ! = '(') mistake_number[2]=1; else y++; AB(); if(TEXT[x][y] ! = ')') mistake_number[3]=1; y++; mistake_number[1]=0; FUNC(); return(1); } else return(0); }
//--------------------------------------------------------------------------- // Обработка выражения
//--------------------------------------------------------------------------- int AB() { char signal[4]="> int z; fprintf(fl_t, "Проверка на AB\n"); TERM(); if(TEXT[x][y] == ' { y++; if(TEXT[x][y] == '=') y++; for(z=0; z if(TEXT[x][y] == signal[z]) //Если слишком { //сложная знаковая mistake_number[14]=1; //конструкция y++; //то ошибка z=0; } AB(); return(1); } if(TEXT[x][y] == '>') { y++; if(TEXT[x][y] == '=') y++; for(z=0; z if(TEXT[x][y] == signal[z]) { mistake_number[14]=1; y++; z=0; } AB(); return(1); } if(TEXT[x][y] == '=') { y++; if(TEXT[x][y] == '=') { y++; } for(z=0; z if(TEXT[x][y] == signal[z]) { mistake_number[14]=1; y++; z=0; } AB(); return(1); } if(TEXT[x][y] == '! ') { y++; for(z=0; z if(TEXT[x][y] == signal[z]) { mistake_number[14]=1; y++; z=0; } if(TEXT[x][y+1] == '=') { y++; } AB(); return(1); } if(TEXT[x][y] == NULL) return(1); return(1); }
//--------------------------------------------------------------------------- // Обработка терма
//--------------------------------------------------------------------------- int TERM() { fprintf(fl_t, "Проверка на TERM\n"); O(); if(TEXT[x][y] == '/') { y++; TERM(); } else if(TEXT[x][y] == '*') { y++; if(TEXT[x][y] == '*') y++; TERM(); } else if(TEXT[x][y] =='+') { y++; if(TEXT[x][y] == '+' && TEXT[x][y+1] == ')' ) { //возможна обработка выражения y++; //типа y++ return(0); //или y+++e } if(TEXT[x][y] == '+'&& TEXT[x][y+1] == '+') y+=2; TERM(); } else if(TEXT[x][y] =='-') { y++; if(TEXT[x][y] == '-' && TEXT[x][y+1] == ')' ) { //для y- y++; return(0); } if(TEXT[x][y] == '-'&& TEXT[x][y+1] == '-') y+=2; TERM(); } else if(TEXT[x][y] ==NULL ) return(1);
else if(TEXT[x][y] ! = '+' && TEXT[x][y]! ='*' && TEXT[x][y]! =')' && TEXT[x][y] ! = '/' && TEXT[x][y]! ='-' && TEXT[x][y] ! = '' &&="" text[x][y]!='! ' &&="" text[x][y]!=' ' &&="" text[x][y]!='='> { mistake_number[7]=1; AB(); } return(1); }
//--------------------------------------------------------------------------- // Обработка операнда
//--------------------------------------------------------------------------- int O() { fprintf(fl_t, "Проверка на O\n"); if(TEXT[x][y] == '(') { y++; if(TEXT[x][y] == ')') { mistake_number[4]=1; y++; } else { AB(); if(TEXT[x][y] == '(') { AB(); } if(TEXT[x][y] ! = ')') { mistake_number[3]=1; y++; } else y++; } } else { if(IDENT() == 0) if(ZBZ() == 0) if(f==0) mistake_number[11]=1; return(0); } return(0); }
//--------------------------------------------------------------------------- // Обработка идентификатора
//--------------------------------------------------------------------------- int IDENT() {
fprintf(fl_t, "Проверка на IDENT, текущий символ - %c\n", TEXT[x][y]); if((isalpha(TEXT[x][y])) ! = NULL) { while(isalpha(TEXT[x][y]) || isdigit(TEXT[x][y])) y++; return(1); } else return(0); }
//--------------------------------------------------------------------------- // Целое без знака
//--------------------------------------------------------------------------- int ZBZ() {
fprintf(fl_t, "Проверка на ЦБЗ, текущий символ - %c\n", TEXT[x][y]); if((isdigit(TEXT[x][y])) ! = NULL) { y++; while(1) { if((isalpha(TEXT[x][y])) ! = NULL) {
/*Если найден идентификатор, */ if(f==0) mistake_number[12]=1; /*начинающийся с цифры, */ else mistake_number[9]=1;
/*то ошибка: */ while(isalpha(TEXT[x][y]) || isdigit(TEXT[x][y])) /*если f=0 то в идентификаторе*/ y++; /*если f=1 то в параметре */ return(1); /* функции */ } if((isdigit(TEXT[x][y])) == NULL) break; y++; } return(1); } else return(0); }
//--------------------------------------------------------------------------- // Обработка функции
//--------------------------------------------------------------------------- int FUNC() { f=1;
fprintf(fl_t, "Проверка на FUNC, текущий символ - %c\n", TEXT[x][y]); for(; ;y++) if(TEXT[x][y] ! = ' ') break; if(IDENT()==0) { mistake_number[6]=1; while(isalpha(TEXT[x][y]) || isdigit(TEXT[x][y])) y++; } if(mistake_number[6] ==0) if(TEXT[x][y] =='(') { y++; if(TEXT[x][y] == ')') { mistake_number[4]=1; y++; } else while(6) { if(PAR() ! = 0) { if(TEXT[x][y] == ')') { y++; break; } if(TEXT[x][y] == '; ') break; if(TEXT[x][y] == ', ') y++; } else { mistake_number[13]=1; break; } } } else { mistake_number[2]=1; mistake_number[13]=1; } if(mistake_number[13]==1) { for(; ;y++) { if(TEXT[x][y] == NULL) { mistake_number[5]=1; mistake_number[3]=1; break; } if(TEXT[x][y] == '; ') { mistake_number[3]=1; break; } if(TEXT[x][y] == ')') { y++; break; } } } if(TEXT[x][y] ! = '; ') mistake_number[5]=1; return(1); }
//--------------------------------------------------------------------------- // Обработка параметров функции
//--------------------------------------------------------------------------- int PAR() {
fprintf(fl_t, "Проверка на PAR, текущий символ - %c\n", TEXT[x][y]); if(IDENT() == 0) if(ZBZ() == 0) { mistake_number[13]=1; return(0); } return(1); } Список литературы:
Д. Грис Конструирование компиляторов для цифровых вычислительных машин. М. , Мир, 1975.
Лебедев В. Н. Введение в системы программирования. М. , “Статистика”, 1975. Шорников Ю. В. , Шегал Б. Р. Методическое пособие для выполнения курсовой работы по системному программированию. Новосибирск, 1992.