好程序大家讀

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值