240-1673 (664631), страница 2
Текст из файла (страница 2)
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 cprintf("%-30s\r\n",mes[j][i]); } //¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾ // Гpамматика языка. //¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾ void Grammar(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(10,5,70,20); textcolor(WHITE); textbackground(MAGENTA); clrscr(); DrawBox(2,1,60,16,"Гpамматика языка"); window(12,6,78,19); textcolor(YELLOW); cputs("\r\n"); cputs(" 1. -> GOTO \r\n"); cputs(" 2. -> T | +T | -T\r\n"); cputs(" 3. T -> O | T*O | T/O | T**O\r\n"); cputs(" 4. O -> () | | <ДБЗ>\r\n"); cputs(" 5. -> Б{Б|Ц}[L]\r\n"); cputs(" 6. <ДБЗ> -> Ц{Ц}[.Ц{Ц}][L]\r\n\n"); cputs(" T - Теpм;\r\n"); cputs(" O - Опеpанд;\r\n"); cputs(" Б - Буква;\r\n"); cputs(" Ц - Цифpа;\r\n"); cputs(" ДБЗ - Дробное Без Знака;\r\n"); 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("\r\n"); cputs(" GOTO CONST | VAR | АВ\r\n\n"); cputs(" CONST - Дробное без знака,\r\n"); cputs(" VAR - идентификатоp,\r\n"); 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("\r\n"); if(compile>0) { cputs(" Текст УЖЕ откомпилирован!!!"); Beep(900,1000); return; } errors=fopen("PROTOCOL.TXT","wt"); cputs(" Идет компиляция.\r\n\n Пожалуйста, подождите..."); #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,"%s\n",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.\r\n",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.\r\nСтрока разбору не подлежит.\r\n"); #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) i++; for(;string[i] != NULL;i++) { if(islower(string[i])) string[i]=toupper(string[i]); str[j++]=string[i]; } str[j]=NULL; sprintf(string,"%s",str); string[j-1]=NULL; #ifdef TEST textattr(30); clreol(); cputs(string); textattr(78); cputs("\r\n"); #endif } //¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾ // Реализация нетерминала . //¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾ int AB(void) { #ifdef TEST cprintf("AB - Проверка на Арифметическое Выражение.\r\n"); #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 - Проверка на Терм.\r\n"); #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 - Проверка на Операнд.\r\n"); #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.\r\n",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.\r\n",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 - Сканирование. Текущий символ '%c' с кодом %d.\r\n",STR[pos],STR[pos]); getch(); #endif fprintf(errors,"SCAN - Сканирование. Текущий символ '%c' с кодом %d.\n",STR[pos],STR[pos]); nx=STR[pos]; pos++; } //¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾ // Обработка ошибок. //¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾ void Error(int num,char* s) { char *E[40]= { "Ожидается '+' или '-'", "Ожидается '*', '/' или '**'", "Ожидается ')'", "Ожидается идентификатор или Дробное без знака", "Не определен идентификатор ", "Не найден оператор GOTO\r\nСтрока разбору не подлежит", 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.\r\n",ERR1,ERR2); cprintf("%s\r\n",mes[ERR1][ERR2]); Beep(1000,200); getch(); #endif fprintf(errors,"%s\n",mes[ERR1][ERR2]); fprintf(errors,"––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n"); ERR2++; mes[ERR1][ERR2][0]=NULL; } //¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾ // Подключаемый файл. //¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾ #include"intface.h" // Файл с функциями интерфейса. //¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾ // Ó 1997 Борзов Андрей Hиколаевич. E-mail: ANDREY@RedHouse.nstu.nsk.su. //¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾ Курс лекций по системному программированию. Герберт Шилдт «C для профессиональных программистов». Группа А-513. Борзов Андрей Николаевич. 18 Литература.
Характеристики
Список файлов реферата