谁有C++ 计算器的源代码吗?
下面的代码用vc6调不出来哪位高手有现成的,能给我看下? 我是菜鸟来着。。。
#include "stdafx.h"
using namespace std;
enum Token_value
{
NAME,NUMBER,END,
PLUS='+',MINUS='-',MUL='*',DIV='/',
PRINT=';',ASSIGN='=',LP='(',RP=')'
};
Token_value curr_tok=PRINT;
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(true);
for(;;)
switch(curr_tok)
{
case MUL:
left*=prim(true);
break;
case DIV:
if(double d=prim(true))
{
left/=prim(true);
break;
}
return error("divide by 0");
default:
return left;
}
double number_value;
string string_value;
double prim(bool get)
{
if(get)
get_token();
switch(curr_token)
{
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");
}
}
Token_value get_token()
{
char ch;
do
{
if(!cin.get(ch))
return curr_tok=END;
}
while(ch!='\n'&&isspace(ch));
switch(ch)
{
case';':
case'\n':
return curr_tok=PRINT;
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':
cin.putback(ch);
cin>>number_value;
return curr_tok=NUMBER;
default:
if(isalpha(ch))
{
string_value=ch;
while(cin.get(ch)&&isalnum(ch))
string_value.push_back(ch);
cin.putback(ch);
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;
}
istream* input;
int main(int argc, char argv[])
{
switch(arg)
{
case 1:
input=&cin;
break;
case 2:
input=new istringstream(argv[1]);
break;
default:
error("too many arguments")
return 1;
}
table["pi"]=3.14159;
table["e"]=2.71828;
while(*input)
{
get_token();
if(curr_tok==END)
break;
if(curr_tok==PRINT)
continue;
}
if(input!=&cin)
delete input;
return no_of_error;
}
}