读<>,第6章的计算器程序有问题

kof99 2003-08-26 02:40:42
由于没有给出完整的代码,只能根据书上的自己写.也不知道漏了什么
最后编译有1个error,11个warning.
程序如下,望有看过这本书的前辈帮我找出错误
#include <string>
#include <iostream>
#include <map>
#include <cctype>
using namespace std;

map<string,double>table;

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

double expr(bool get);
double term(bool get);
double prim(bool get);
Token_value get_token();
double error(const string& s);

Token_value curr_tok = PRINT;
double number_value;
string string_value;
int no_of_errors;

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);
break;
case DIV:
if(double d = prim(true)){
left /= d;
break;
}
else error("divide by 0");
default:
return left;
}
}


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 != PR)
return error(") expected");
get_token();
return e;
}
default:
return error("primary expected");
}
}

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


switch(ch){
case ';':
case '\n':
return curr_tok = PRINT;
case 0:
return curr_tok = END;

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;
}
}

double error(const string& s)
{
no_of_errors++;
cerr << "error:" << s << '\n';
return 1;
}

int main()
{
table["pi"] = 3.1415926535897932385;
table["e"] = 2.7182818284590452354;
while(cin){
get_token();
if(curr_tok == END) break;
if(curr_tok == PRINT) continue;
cout << expr(false) << '\n';
}
return no_of_errors;
}
...全文
49 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xdspower 2003-08-26
  • 打赏
  • 举报
回复
vc编译器对标准的支持不够规范?!是否是没有get_token()函数?
OSNC_17 2003-08-26
  • 打赏
  • 举报
回复
我还以为是Bjarne Stroustrup写的东西有问题。
kof99 2003-08-26
  • 打赏
  • 举报
回复
UP一下,有没有人看啊
kof99 2003-08-26
  • 打赏
  • 举报
回复
改用DEv-C编译,可以运行,只是enum Token_value中的LP有定义了,只好换个名字,不过运行顺利.怎么用VC6.0不行呢
kof99 2003-08-26
  • 打赏
  • 举报
回复
用vc6.0,错误在get_token()
while (cin.get(ch) && isalnum(ch))
string_value.push_back(ch);

E:\soure\calculator\calculator.cpp(128) : error C2039: 'push_back' : is not a member of 'basic_string<char,struct std::char_traits<char>,class std::allocator<char> >'

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧