C++桌面计算机

#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 number_value;
string string_value;
map<string,double>table;
int no_of_errors;
double error(const string& s)
{
    no_of_errors++;
    cerr<<"error:"<<s<<'\n';
    return 1;
}
//==============================================================================
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;
    }
}
//==============================================================================
double expr(bool);
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()
{
    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;
}

 

转载于:https://www.cnblogs.com/little-white/p/3594396.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值