IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Синтаксический анализатор на С++
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Суть задания в том чтобы разработь класс для синтаксического анализатора арифметических выражений.

//---------------------------------------------------------------------------

#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

Что делать ума не приложу.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Krjuger   Синтаксический анализатор на С++   19.11.2009 22:51
volvo   Создать консольное приложение, а не Win32-проект. …   19.11.2009 23:01
Krjuger   Ну я создаю пустой win32 console application и там…   19.11.2009 23:06
Krjuger   Я чуть изменил код, //---------------------------…   20.11.2009 0:37
volvo   Здесь - не должна (у меня и не переходит, но я тес…   20.11.2009 1:09
Krjuger   Не, у меня это происходит именно в третьем case ,а…   20.11.2009 1:46
volvo   Они что там, в MS вообще с ума посходили? Теперь п…   20.11.2009 1:56
Krjuger   Да я бы сам на другом написал бы,но препод принима…   20.11.2009 2:00
Krjuger   Так проблема с 3 кейсом тоже отпала,но появилась н…   20.11.2009 3:11
volvo   Стоп... А с чего ты решил, что ? В тот момент tmp …   20.11.2009 3:14
Krjuger   Не ,его как раз быть не должно по задумке,потому ч…   20.11.2009 3:19
volvo   А ты это что, уже объяснил функции strstr? Ей по ф…   20.11.2009 3:21
Krjuger   С проверкой я разобрался теперь все нормально рабо…   20.11.2009 3:42
Krjuger   В общем помучавшись мальца я пришел к такому вариа…   24.11.2009 23:12


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 21.05.2024 16:07
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name