
//
// Przykładowy kod z rozdziału 6.5.2.3 "Wyrażenia — do trzech razy sztuka" książki
// "Programowanie. Teoria i praktyka z wykorzystaniem C++" Bjarne'a Stroustrupa.
//

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

class Token {
public:
    char kind;        // rodzaj tokenu
    double value;     // Dla liczb: wartość.
    Token(char ch)    // Tworzy Token ze znaku.
        :kind(ch), value(0) { }    
    Token(char ch, double val)     // Tworzy Token ze znaku i wartości typu double.
        :kind(ch), value(val) { }
};

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

Token get_token();    // Wczytuje token ze strumienia cin.

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

double term();        // Wczytuje i wartościuje składnik.

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

double expression()
{
    double left = term();      // Wczytuje i oblicza wartość składnika.
    Token t = get_token();     // następny token
    while ( t.kind=='+' || t.kind=='-') {    // Szuka znaków + i -.
        if (t.kind == '+')
            left += term();    // Oblicza wartość składnika i wykonuje dodawanie.
        else
            left -= term();    // Oblicza wartość składnika i wykonuje odejmowanie.
        t = get_token();
    }
    return left;               // Jeśli nie ma więcej znaków + lub –, zwraca odpowiedź.
}

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