#include "iostream"
#include "map"
#include "string"
#include "cctype"
using namespace std;

map<string, double> table;


int no_of_errors;

double number_value;
string string_value;

double error(const string& s) {
  no_of_errors++;
  cerr << "ERROR: " << s << endl;
  return 1;
}

enum Token_value {
  NAME, NUMBER, LINE_END, END, PLUS='+', MINUS='-', MUL='*', DIV='/', PRINT=';', ASSIGN='=', LP='(', RP=')'
};

Token_value curr_tok = LINE_END;

double expr(bool);


Token_value get_token() {
  char ch = 0;

  do {
    if (!cin.get(ch)) return curr_tok = END;
  }while (ch != '\n' && isspace(ch));

  switch(ch) {
    case '\n': curr_tok=LINE_END; break;
    case ';':
        curr_tok=PRINT; break;
    case '*':
    case '/':
    case '+':
    case '-':
    case '(':
    case ')':
    case '=':

        curr_tok = Token_value(ch); break;

    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8': case '9':
    case '.':
        cin.putback(ch);
        cin >> number_value;
          
        curr_tok = NUMBER; break;
    default:
        if (isalpha(ch)) {
          string_value = ch;
          while (cin.get(ch) && isalnum(ch)) string_value.push_back(ch);
          cin.putback(ch);
        
          curr_tok = NAME;
          break;
        }

        error("bad token");
        
        curr_tok = PRINT; break;
  }

  return curr_tok;

}


double prim(bool get) {
  if (get) get_token();

  switch (curr_tok) {
    case NUMBER: {
        double v = number_value;
        get_token();
        return v;
    }
    case NAME: {
        double& v = table[string_value];
        if (get_token() == ASSIGN) v = expr(true);
        return v;
    }
    case MINUS:
        return -prim(true);
    case LP: {
        double e = expr(true);
        if (curr_tok != RP) return error(") expected");
        get_token();
        return e;
    }
    default:
        return error("primary expected");
  }
}


double term(bool get)
{
  double left = prim(get);

  for (;;)
    switch (curr_tok) {
        case MUL:
          left *= prim(true);
          break;
        case DIV:
          if (double d = prim(true)) {
            left /= d;
            break;
          }
          return error("divide by 0");
        default: return left;
    }
}

double expr(bool get)
{
  double left = term(get);

  for (;;) {
    switch (curr_tok) {
        case PLUS:
          left += term(true);
          break;
        case MINUS:
          left -= term(true);
          break;
        default:
          return left;
    }
  }
}

int main(int argc, char* argv[])
{
  //符号表,可以事先定义一些常量
  table["pi"] = 3.141592654;
  table["e"] = 2.71828;
  
  while(cin) {
    get_token();
    if (curr_tok == END) break;
    if (curr_tok == LINE_END) continue;
  

    double p= (expr(false));

    if (curr_tok == PRINT)
        cout << "The result is: " << p << endl;

  }
  return no_of_errors;

}