Re: синтаксический анализатор мат.формул
- From
- Valery Krigan ()
- To
- All
- Date
- 2000-02-28T14:40:18Z
- Area
- RU.ALGORITHMS
From: "Valery Krigan" <valeri@mail.tomsknet.ru>
George Shuklin wrote in message...
> В 25 февраля 2000 01:12, Svirskiy Taras решил написать All:
> ST> Может кто-нибудь знает, или писал алгоритм сабжа,
> ST> или где об этом вообще почитать можно.
> ST> Плиз, пмомогите, сильно надо.
> Вот, лови. Не пинать. Писано в свое время для сдачи по ПОВС, посему
возможны
> глюки.
Народ, может конкурс объявить на самый шустрый интерпретатор?
Чтобы фигней всякой не пользоваться типа этого
http://members.xoom.com/thomasn/o_man.htm
который объявляется идеальным, при этом в 10-40 раз (в зависимости от
выражения)
медленнее и в 3-4 раза больше этого:
double Level0(char **text);
double Level1(char **text);
double Level2(char **text);
void remove_spaces(char *str)
{ for( char *s=str; *s; str++ )
{ while( *s==' ' || *s=='\t' || *s=='\r' || *s=='\n' )
s++;
*str= *s++;
}
*str= 0;
}
double calc(char *str)
{ return Level0(&str);
}
double
Level0(char **text)
{ double res= Level1(text);
while( **text=='+' || **text=='-' )
switch( **text )
{ case '+' : res += Level1(&++*text);
break;
case '-' : res -= Level1(&++*text);
break;
}
return res;
}
double
Level1(char **text)
{ double res= Level2(text);
while( **text=='*' || **text=='/' )
switch( **text )
{ case '*' : res *= Level2(&++*text);
break;
case '/' : res /= Level2(&++*text);
break;
}
return res;
}
double
Level2(char **text)
{
switch( **text )
{ case '(' : { double res= Level0(&++*text);
if( *(*text)++!=')' )
throw 1;
return res;
}
case '+' : return Level2(&++*text);
case '-' : return -Level2(&++*text);
}
if( **text>='0' && **text<='9' )
{ double res
= 0;
while( **text>='0' && **text<='9' )
res = res*10 + (*(*text)++ - '0');
return res;
}
return 0;
}
--- ifmail v.2.15dev4
* Origin: Tomsktelecom - Digital Networks (2:5020/400)