Суть задания в том чтобы разработь класс для синтаксического анализатора арифметических выражений.
//--------------------------------------------------------------------------- #pragma hdrstop #include <stdio.h> #include <string.h> //--------------------------------------------------------------------------- class Analiz { private: int Stat; int Vloj; public: char *Input; char *Output; Analiz(); int Error; int Result(int err, char const *tmp = '\0'); }; int Analiz::Result(int err, char const *tmp) { char *temp; switch (err) { case 0: temp = "Верно 0"; break; case 1: temp = "Пропущен операнд 1"; break; case 2: temp = "Неверно расставлены скобки 2"; break; case 3: temp = "Неверный символ 3 ", strcat(temp, tmp);break; case 4: temp = "Пропущен оператор 4 ";break; case 5: temp = "Не заданы параметры функции 5";strcat(temp,tmp); break; case 6: temp = "Неизвестная функция 6 ",strcat(temp,tmp);break; case 7: temp = "Неверное имя 7 ", strcat(temp,tmp);break; case 8: temp = "Неверная константа 8 ", strcat(temp, tmp);break; } Output = temp; return Error = err; } Analiz::Analiz() { int i; int j = 0; Stat=1; Error = 0; const char number[] = " 0123456789"; const char liter[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; const char znak[] = " -*/+"; const char func[] = "cos sin tg ctg ln log sign exp"; char tmp[100]; // *tmp=NULL; for (i = 0; Input[i] != '\0'; i++) { switch (Stat) { case 0: break; case 1: if (strchr(number, Input[i]) != 0) { Stat=4; break; } else if (strchr(liter, Input[i]) != 0) { tmp[j++] = Input[i]; Stat=3; break; } else if (strchr(" ", Input[i]) != 0) { break; } else if (strchr(znak, Input[i]) != 0) { Result(1); return; } else if (strchr("(", Input[i]) != 0) { Vloj++; break; } else if (strchr(")", Input[i]) != 0) { Result(2); return; } else if (strchr(".", Input[i]) != 0) { Stat = 5; break; } else { Result(3, &Input[i]); return; } case 2: if (strchr(number, Input[i]) != 0) { Result(4); return; } else if (strchr(liter, Input[i]) != 0) { Result(4); return; } else if (strchr(" ", Input[i]) != 0) { break; } else if (strchr(znak, Input[i]) != 0) { Stat = 1; break; } else if (strchr("(", Input[i]) != 0) { Result(4); return; } else if (strchr(")", Input[i]) != 0) { Vloj--; break; } else if (strchr(".", Input[i]) != 0) { Result(3); break; } else { Result(3, &Input[i]); return; } case 3: if (strchr(number, Input[i]) != 0) { tmp[j++] = Input[i]; break; } else if (strchr(liter, Input[i]) != 0) { tmp[j++] = Input[i]; break; } else if (strchr(" ", Input[i]) != 0) { //tmp[j++]='\0'; if (strstr(func,tmp) != 0) { Stat = 6; } else { Stat = 2; } *tmp=NULL; j=0; break; } else if (strchr(znak, Input[i]) != 0) { tmp[j++]='\0'; if (strstr(func,tmp) != 0) { Result(5, tmp); return; } else { Stat = 1; *tmp=NULL; j=0; } break; } else if (strchr("(", Input[i]) != 0) { tmp[j++]='\0'; if (strstr(func,tmp) != 0) { Stat = 1; *tmp=NULL; j=0; } else { Result(6, tmp); return; } Vloj++; break; } else if (strchr(")", Input[i]) != 0) { tmp[j++]='\0'; if (strstr(func,tmp) != 0) { Result(2); return; } else { Stat = 2; *tmp=NULL; j=0; Vloj--; } break; } else if (strchr(".", Input[i]) != 0) { Result(7, tmp); return; } else { Result(3, &Input[i]); return; } case 4: if (strchr(number, Input[i]) != 0) { break; } else if (strchr(liter, Input[i]) != 0) { Result(8, tmp); return; } else if (strchr(" ", Input[i]) != 0) { Stat=2; break; } else if (strchr(znak, Input[i]) != 0) { Stat = 1; break; } else if (strchr("(", Input[i]) != 0) { Result(4); return; } else if (strchr(")", Input[i]) != 0) { Stat = 2; Vloj--; break; } else if (strchr(".", Input[i]) != 0) { Result(3); break; } else { Result(3, &Input[i]); return; } case 6: if (strchr(number, Input[i]) != 0) { Result(5, tmp); return; } else if (strchr(liter, Input[i]) != 0) { Result(5, tmp); return; } else if (strchr(" ", Input[i]) != 0) { break; } else if (strchr(znak, Input[i]) != 0) { Result(5, tmp); return; } else if (strchr("(", Input[i]) != 0) { Stat = 1; Vloj++; break; } else if (strchr("", Input[i]) != 0) { Result(2); return; } else if (strchr(".", Input[i]) != 0) { Result(5); break; } else { Result(3, &Input[i]); return; } } } if (Input[i] == '\0') { switch(Stat){ case 1: Result(1); break; case 2: Result(0); break; case 3: tmp[j++]='\0'; if (strstr(func,tmp) != 0) { Result(5, tmp); } else Result(0); break; case 4: Result(0); break; case 5: Result(0); break; case 6: Result(5, tmp); break; } } } void main()//пример чисто символический,потмоу чт все равно проект не проходит даже сборку { Analiz m1; m1.Input="x+1/2"; printf("/n %s /n",m1.Output); }
В отладчике выдается 2 ошибки:
1.error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup MSVCRTD.lib
2.fatal error LNK1120: 1 unresolved externals
Что делать ума не приложу.