#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 ;
}
//==============================================================================
Token_value get_token()
{
char ch=;
cin>>ch;
switch(ch){
case :
return curr_tok=END;
case';':
case'*':
case'/':
case'+':
case'-':
case'(':
case')':
case'=':
return curr_tok=Token_value(ch);
case'':case'':case'':case'':case'':case'':
case'':case'':case'':case'':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;
}

最新文章

  1. javascript实现键盘自动打字效果
  2. php 如何解决“您访问的域名有误或网页不存在”
  3. Liunx下安装jdk
  4. .Net语言 APP开发平台——Smobiler学习日志:用MenuView控件仿钉钉APP的首页菜单
  5. EF的入门使用 (电影管理)
  6. 怎样用delphi关闭并重新启动 explorer.exe进程
  7. .NET分布式事务处理总结【下】 - 包含MSMQ的分布式事务处理
  8. js正则表达式验证大全
  9. Yii2 分页类的扩展和listview引用
  10. Map 的遍历
  11. Html批量读取json
  12. C语言-知识点及学习路线
  13. Excel阅读模式/单元格行列指示/聚光灯开发 技术要点再分享
  14. iOS——调试工具LLDB学习
  15. 2017湘潭大学邀请赛G题(贪心+优先队列)
  16. Hadoop+Hbas完全分布式安装部署
  17. serde
  18. 使用nginx服务器如果遇到timeou情况时可以如下设置参数,使用fastcgi: fastcgi_connect_timeout 75; 链接 fastcgi_read_timeout 600; 读取 fastcgi_send_timeout 600; 发请求
  19. python接口测试中安装whl格式的requests第三方模块
  20. 实现观察者模式(Observer Pattern)的2种方式

热门文章

  1. Logstash 安装及简单实用(同步MySql数据到Elasticsearch)(Linux)
  2. Nginx专题(1):Nginx之反向代理及配置
  3. Flask:对项目文件进行拆分
  4. NLP预训练模型-百度ERNIE2.0的效果到底有多好【附用户点评】
  5. JAVA内存溢出与内存泄露
  6. day 2上午 elect 选举 背包
  7. go xml 序列化
  8. Jmeter与压测相关概念
  9. 设置eclipse的字体大小
  10. vue2获取dom节点