#include<iostream>
#include<string>
#include<map>
#include<cctype>
using namespace std;
enum token_value{
name,number,end,
plus='+',minus='-',mul='*',div='/',
print=';',assign='=',lp='(',rp=')'
};
token_value curr_tok=print;
double term(bool get);
double prim(bool get);
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;
}
}
}
double term(bool get)
{
double left=prim(get);
for(;;)
{
switch(curr_tok)
{
case mul:
left*=prim(true);
case div:
left/=prim(true);
default:
return left;
}
}
}
double number_value;
string string_value;
double prim(bool get)
{
if(get)get_token();
switch(curr_tok)
{
case number:
{
double v=number_value;
get_token();
return curr_tok;
}
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");
}
}
map<string,double>table;
token_value get_token()
{
char ch=0;
cin>>ch;
switch(ch)
{
case 0:
return curr_tok=end;
case';':
case'*':
case'/':
case'+':
case'-':
case'(':
case')':
case'=':
return curr_tok=token_value(ch);
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;
return curr_tok=number;
default:
if(isalpha(ch))
{
cin.putback(ch);
cin>>string_value;
return curr_tok=name;
}
error("bad token");
return curr_tok=print;
}
}
int no_of_errors;
double error(const string &s)
{
no_of_errors++;
cerr<<"error:"<<s<<'/n';
return 1;
}
int main()
{
table["pi"]=3.14159;
table["e"]=2.71828;
while(cin)
{
get_token();
if(curr_tok==end)break;
if(curr_tok==print)continue;
cout<<expr(false)<<'/n';
}
return no_of_errors;
}