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)