darf man sowas machen?



  • hab mir mal nen simplen parser/tschenrechner geschreiben (an den ausm stroustrup angelehnt). da ich keine globalen variablen haben wollte hab ich das ganze in ne klasse gepackt und einen castoperator auf double definiert. jetzt kann man die mehr oder weniger wie ne funktion benutzen... aber macht man sowas? gibts da argumente gegen oder dafür?

    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include <cctype>
    
    class parse
    {                              
    public:
       parse(const char *str)
       {
          str_ = pos_ = str;
          result_ = expr(true);       
       }
       operator double()
       { return result_; }
    private:
       enum Token {LB='('  , RB=')' , PLUS='+', MINUS='-',
                   MULT='*', DIV='/', NUM     , END};
    
       double expr(bool);
       double term(bool);
       double prim(bool);
    
       void get_token();
       void skip_whites();
    
       const char *str_;
       const char *pos_;
    
       double num_value_;
       double result_;
    
       Token cur_token_;
    };
    
    void parse::skip_whites()
    {
       while(std::isspace(*pos_)) ++pos_;
    }
    
    void parse::get_token()
    {
       skip_whites();
       switch(*pos_)
       {
          case '.': case '0': case '1': case '2': case '3': case '4':
          case '5': case '6': case '7': case '8': case '9':
             cur_token_ = NUM;
             char *newpos;
             num_value_ = std::strtod(pos_, &newpos);
             pos_ = newpos;
             return;
    
          case '+': case '-': case '*': case '/': case '(': case ')': 
          cur_token_ = Token(*(pos_++)); break;
    
          default : cur_token_ = END; return;
       }
    }
    
    double parse::prim(bool get)
    {
       if(get)
          get_token();
    
       double result;
    
       switch(cur_token_)
       {
          case NUM:
             result = num_value_;
             get_token();
             return result;
    
          case MINUS:
             return -prim(true);
    
          case LB:
             result = expr(true);
             get_token();
             return result;
       }
    }
    
    double parse::term(bool get)
    {
       double left = prim(get);   
    
       for(;;)
          switch(cur_token_)
          {
             case MULT:
                left *= prim(true);
                break;
             case DIV:
                left /= prim(true);
                break;
             default:
                return left;
          }
    }
    
    double parse::expr(bool get)
    {
       double left = term(get);   
    
       for(;;)
       {
          switch(cur_token_)
          {
             case PLUS:
                left += term(true);
                break;
             case MINUS:
                left -= term(true);
                break;
             default:
                return left;
          }
       }
    }
    
    int main(int argc, char *argv[])
    {
      std::string str;
      std::getline(std::cin,str);
      std::cout << str << " = " << parse(str.c_str());
      std::cin.ignore();
      std::cin.ignore();
    
      return 0;
    }
    


  • MS VC++ 6:

    error C2039: 'isspace' : Ist kein Element von 'std'
    error C2039: 'strtod' : Ist kein Element von 'std'

    Bitte MS VC++ tauglich machen. 😃

    [ Dieser Beitrag wurde am 05.07.2003 um 23:52 Uhr von Erhard Henkes editiert. ]



  • ich weiss nicht was dagegen sprechen sollte. Naja, vielleicht das du dich irgend wie an den Typ double bindest, du könntest auch einen eigenen operator << schreiben

    Original erstellt von Erhard Henkes:
    **MS VC++ 6:

    error C2039: 'isspace' : Ist kein Element von 'std'
    error C2039: 'strtod' : Ist kein Element von 'std'

    Bitte MS VC++ tauglich machen. 😃
    **

    Bitte Compiler nehmen, der den Standard besser unterstützt 🙄



  • schreib dir ein using namespace std hinter die inlcudes.


Anmelden zum Antworten