1 //原书本代码 2 #include "../../st.h" 3 4 const char number='8'; 5 const char quit = 'q'; 6 const char print=';'; 7 const char name = 'a'; 8 const char let ='L'; 9 const string declkey="let"; 10 11 class Variable{ 12 public: 13 string name; 14 double value; 15 Variable(string n,double v):name(n),value(v){} 16 }; 17 18 vector<Variable> var_table; 19 20 double get_value(string s) 21 { 22 for(int i=0;i<var_table.size();++i) 23 if(var_table[i].name==s) 24 return var_table[i].value; 25 error("get:undefined variable",s); 26 } 27 28 29 30 class Token{ 31 public: 32 char kind; 33 double value; 34 string name; 35 Token(char ch) 36 :kind(ch),value(0){} 37 Token(char ch,double val) 38 :kind(ch),value(val){} 39 Token(char ch,string n) 40 :kind(ch),name(n){} 41 }; 42 43 class Token_stream{ 44 public: 45 Token_stream(); 46 Token get(); 47 void putback(Token t); 48 void ignore(char c); 49 private: 50 bool full; 51 Token buffer; 52 }; 53 54 Token_stream::Token_stream() 55 :full(false),buffer(0) 56 { 57 } 58 59 void Token_stream::putback(Token t) 60 { 61 if(full) error("putback() into a full buffer"); 62 buffer=t; 63 full=true; 64 } 65 66 Token Token_stream::get() 67 { 68 if(full){ 69 full=false; 70 return buffer; 71 } 72 char ch; 73 cin>>ch; 74 switch(ch){ 75 case print: case quit: case '(': case ')': case '{': 76 case '}': case '+': case '-': case '*': case '/': 77 case '!':case '%': case '=': 78 return Token(ch); 79 case '.': 80 case '0': case '1': case '2': case '3': case '4': 81 case '5': case '6': case '7': case '8': case '9': 82 { 83 cin.putback(ch); 84 double val; 85 cin>>val; 86 return Token(number,val); 87 } 88 default: 89 if(isalpha(ch)) 90 { 91 string s; 92 s+=ch; 93 while(cin.get(ch)&&(isalpha(ch)||isdigit(ch))) //检查ch是否为字母或数字 94 s+=ch; 95 cin.putback(ch); 96 if(s==declkey) 97 return Token(let); 98 return Token(name,s); 99 100 } 101 error("bad token"); 102 } 103 } 104 105 void Token_stream::ignore(char c) 106 { 107 if(full&&c==buffer.kind) 108 { 109 full=false; 110 return; 111 } 112 full=false; 113 char ch=0; 114 while(cin>>ch) 115 if(ch==c) 116 return; 117 } 118 119 Token_stream ts; 120 double expression(); 121 122 123 124 double primary() 125 { 126 127 Token t=ts.get(); 128 switch(t.kind){ 129 case '(': 130 { 131 double d=expression(); 132 t=ts.get(); 133 if(t.kind!=')') 134 error("')'expected"); 135 return d; 136 } 137 case number: 138 return t.value; 139 case name: //书里没这个 140 return get_value(t.name); 141 case '-': 142 return -primary(); 143 case '+': 144 return +primary(); 145 default: 146 error("primary expected"); 147 } 148 } 149 150 double primary1() 151 { 152 Token t=ts.get(); 153 while(true) 154 { 155 switch(t.kind){ 156 case '{': 157 { 158 double d=expression(); 159 t=ts.get(); 160 if(t.kind!='}') 161 error("'}'expected"); 162 return d; 163 } 164 default: 165 ts.putback(t); 166 return primary(); 167 } 168 } 169 170 171 } 172 173 double primary2() 174 { 175 double left=primary1(); 176 Token t=ts.get(); 177 while(true) 178 { 179 if(t.kind=='!') 180 { 181 if(left==0) 182 left=1; 183 for(int i=left-1;i>0;i--) 184 left*=i; 185 t=ts.get(); 186 } 187 else 188 { 189 ts.putback(t); 190 return left; 191 } 192 } 193 } 194 195 double term() 196 { 197 double left=primary2(); 198 Token t=ts.get(); 199 200 while(true){ 201 switch(t.kind){ 202 203 case '*': 204 left*=primary2(); 205 t=ts.get(); 206 break; 207 case '/': 208 { 209 double d=primary2(); 210 if(d==0) 211 error ("divide by 0"); 212 left /=d; 213 t=ts.get(); 214 break; 215 } 216 case '%': 217 { 218 int i1=narrow_cast<int>(left); 219 int i2=narrow_cast<int>(term()); 220 left=i1%i2; 221 t=ts.get(); 222 break; 223 } 224 default: 225 ts.putback(t); 226 return left; 227 } 228 } 229 } 230 231 double expression() 232 { 233 double left=term(); 234 Token t=ts.get(); 235 while(true){ 236 switch(t.kind){ 237 case '+': 238 left+=term(); 239 t=ts.get(); 240 break; 241 case '-': 242 left-=term(); 243 t=ts.get(); 244 break; 245 default: 246 ts.putback(t); 247 return left; 248 } 249 } 250 } 251 252 void clean_up_mess() 253 { 254 ts.ignore(print); 255 } 256 257 bool is_declared(string var) 258 { 259 for(int i=0;i<var_table.size();++i) 260 if(var_table[i].name==var) 261 return true; 262 return false; 263 } 264 265 double define_name(string var,double val) 266 { 267 if(is_declared(var)) 268 error(var," declared twice"); 269 var_table.push_back(Variable(var,val)); 270 return val; 271 } 272 273 double declaration() 274 { 275 Token t=ts.get(); 276 if(t.kind!=name) 277 error("name expected in declaration"); 278 string var_name=t.name; 279 280 Token t2=ts.get(); 281 if(t2.kind!='=') 282 error("=missing in declaration of",var_name); 283 284 double d=expression(); 285 define_name(var_name,d); 286 return d; 287 288 } 289 290 double statement() 291 { 292 Token t=ts.get(); 293 switch(t.kind) 294 { 295 case let: 296 return declaration(); 297 default: 298 ts.putback(t); 299 return expression(); 300 } 301 } 302 303 void calculate() 304 { 305 while(cin) 306 try{ 307 cout<<"> "; 308 Token t=ts.get(); 309 while(t.kind==print) 310 t=ts.get(); 311 if(t.kind==quit) 312 { 313 keep_window_open(); 314 return; 315 } 316 ts.putback(t); 317 cout<<"="<<statement()<<endl; 318 } 319 catch(exception&e){ 320 cerr<<e.what()<<endl; 321 clean_up_mess(); 322 } 323 } 324 325 int main() 326 { 327 try{ 328 calculate(); 329 keep_window_open(); 330 return 0; 331 332 } 333 334 catch(exception&e){ 335 cerr<<e.what()<<endl; 336 //cout<<"please enter the character ~ to close the window\n"; 337 //char ch; 338 //while(cin>>ch) 339 // if(ch=='~') 340 // return 1; 341 keep_window_open("~~"); 342 return 1; 343 } 344 345 catch(...){ 346 cerr<<"exception\n"; 347 keep_window_open("~~"); 348 return 2; 349 } 350 351 }
1 //还有添加了简单练习7 8 9题 2 #include "../../st.h" 3 4 const char number='8'; 5 const char quit = 'q'; 6 7 const char print=';'; 8 const char name = 'a'; 9 const char let ='L'; 10 const char const_='c'; 11 const string declkey1="const"; 12 //const string declkey="let"; 13 const string sqrt_ ="sqrt"; 14 const string pow_="pow"; 15 16 class Variable{ 17 public: 18 string name; 19 double value; 20 bool is_const; 21 Variable(string n,double v,bool b):name(n),value(v),is_const(b){} 22 }; 23 24 vector<Variable> var_table; 25 26 double get_value(string s) 27 { 28 for(int i=0;i<var_table.size();++i) 29 if(var_table[i].name==s) 30 return var_table[i].value; 31 error("get:undefined variable",s); 32 } 33 34 bool get_bool(string s) 35 { 36 for(int i=0;i<var_table.size();++i) 37 if(var_table[i].name==s) 38 return var_table[i].is_const; 39 error("get:undefined bool",s); 40 } 41 42 void set_value(string s,double d) 43 { 44 for(int i=0;i<var_table.size();++i) 45 if(var_table[i].name==s){ 46 var_table[i].value=d; 47 return; 48 } 49 error("set:undefined variable",s); 50 } 51 52 class Token{ 53 public: 54 char kind; 55 double value; 56 string name; 57 Token(char ch) 58 :kind(ch),value(0){} 59 Token(char ch,double val) 60 :kind(ch),value(val){} 61 Token(char ch,string n) 62 :kind(ch),name(n){} 63 }; 64 65 class Token_stream{ 66 public: 67 Token_stream(); 68 Token get(); 69 void putback(Token t); 70 void ignore(char c); 71 private: 72 bool full; 73 Token buffer; 74 }; 75 76 Token_stream::Token_stream() 77 :full(false),buffer(0) 78 { 79 } 80 81 void Token_stream::putback(Token t) 82 { 83 if(full) error("putback() into a full buffer"); 84 buffer=t; 85 full=true; 86 } 87 88 Token Token_stream::get() 89 { 90 if(full){ 91 full=false; 92 return buffer; 93 } 94 char ch; 95 cin>>ch; 96 switch(ch){ 97 case print: case '(': case ')': case '{': 98 case '}': case '+':case '-': case '*': case '/': 99 case '!':case '%': case '=':case ',': 100 //case quit: 101 return Token(ch); 102 case '.': 103 case '0': case '1': case '2': case '3': case '4': 104 case '5': case '6': case '7': case '8': case '9': 105 { 106 cin.putback(ch); 107 double val; 108 cin>>val; 109 return Token(number,val); 110 } 111 default: 112 if(isalpha(ch)||ch=='#') 113 { 114 if(ch=='#') 115 return Token(let); 116 string s; 117 s+=ch; 118 while(cin.get(ch)&&(isalpha(ch)||isdigit(ch)||ch=='_')) //检查ch是否为字母或数字 119 s+=ch; 120 cin.putback(ch); 121 //if(s==declkey) 122 //return Token(let); 123 if(s==declkey1) 124 return Token(const_); 125 if(s==sqrt_) 126 return Token('s'); 127 else if(s==pow_) 128 return Token('p'); 129 if(s=="exit") 130 return Token(quit); 131 return Token(name,s); 132 133 } 134 error("bad token"); 135 } 136 } 137 138 void Token_stream::ignore(char c) 139 { 140 if(full&&c==buffer.kind) 141 { 142 full=false; 143 return; 144 } 145 full=false; 146 char ch=0; 147 while(cin>>ch) 148 if(ch==c) 149 return; 150 } 151 152 Token_stream ts; 153 double expression(); 154 155 156 157 double primary() 158 { 159 160 Token t=ts.get(); 161 switch(t.kind){ 162 case '(': 163 { 164 double d=expression(); 165 t=ts.get(); 166 if(t.kind!=')') 167 error("')'expected"); 168 return d; 169 } 170 case number: 171 return t.value; 172 case name: //书里没这个 173 { 174 string s1=t.name; 175 t=ts.get(); 176 if(t.kind=='=') 177 { 178 if(!get_bool(s1)) 179 { 180 double d=expression(); 181 set_value(s1,d); 182 return d; 183 } 184 if(get_bool(s1)) 185 error("the number is const"); 186 } 187 else 188 { 189 ts.putback(t); 190 return get_value(s1); 191 } 192 } 193 194 case '-': 195 return -primary(); 196 case '+': 197 return +primary(); 198 default: 199 error("primary expected"); 200 } 201 } 202 203 double primary1() 204 { 205 Token t=ts.get(); 206 while(true) 207 { 208 switch(t.kind){ 209 case '{': 210 { 211 double d=expression(); 212 t=ts.get(); 213 if(t.kind!='}') 214 error("'}'expected"); 215 return d; 216 } 217 default: 218 ts.putback(t); 219 return primary(); 220 } 221 } 222 223 224 } 225 226 double primary2() 227 { 228 double left=primary1(); 229 Token t=ts.get(); 230 while(true) 231 { 232 if(t.kind=='!') 233 { 234 if(left==0) 235 left=1; 236 for(int i=left-1;i>0;i--) 237 left*=i; 238 t=ts.get(); 239 } 240 else 241 { 242 ts.putback(t); 243 return left; 244 } 245 } 246 } 247 248 double term() 249 { 250 double left=primary2(); 251 Token t=ts.get(); 252 253 while(true){ 254 switch(t.kind){ 255 256 case '*': 257 left*=primary2(); 258 t=ts.get(); 259 break; 260 case '/': 261 { 262 double d=primary2(); 263 if(d==0) 264 error ("divide by 0"); 265 left /=d; 266 t=ts.get(); 267 break; 268 } 269 case '%': 270 { 271 int i1=narrow_cast<int>(left); 272 int i2=narrow_cast<int>(term()); 273 left=i1%i2; 274 t=ts.get(); 275 break; 276 } 277 default: 278 ts.putback(t); 279 return left; 280 } 281 } 282 } 283 284 double expression() 285 { 286 double left=term(); 287 Token t=ts.get(); 288 while(true){ 289 switch(t.kind){ 290 case '+': 291 left+=term(); 292 t=ts.get(); 293 break; 294 case '-': 295 left-=term(); 296 t=ts.get(); 297 break; 298 default: 299 ts.putback(t); 300 return left; 301 } 302 } 303 } 304 305 void clean_up_mess() 306 { 307 ts.ignore(print); 308 } 309 310 bool is_declared(string var) 311 { 312 for(int i=0;i<var_table.size();++i) 313 if(var_table[i].name==var) 314 return true; 315 return false; 316 } 317 318 double define_name(string var,double val,bool b) 319 { 320 if(is_declared(var)) 321 error(var," declared twice"); 322 var_table.push_back(Variable(var,val,b)); 323 return val; 324 } 325 326 double declaration() 327 { 328 Token t=ts.get(); 329 if(t.kind!=name) 330 error("name expected in declaration"); 331 string var_name=t.name; 332 333 Token t2=ts.get(); 334 if(t2.kind!='=') 335 error("=missing in declaration of",var_name); 336 337 double d=expression(); 338 define_name(var_name,d,false); 339 return d; 340 341 } 342 343 344 345 double declaration1() 346 { 347 Token t=ts.get(); 348 if(t.kind!=name) 349 error("name expected in declaration"); 350 string var_name=t.name; 351 352 Token t2=ts.get(); 353 if(t2.kind!='=') 354 error("=missing in declaration of",var_name); 355 356 double d=expression(); 357 define_name(var_name,d,true); 358 return d; 359 360 } 361 362 363 364 double sqrt1() //第七章简单练习7 365 { 366 Token t=ts.get(); 367 switch(t.kind){ 368 case '(': 369 { 370 double d=expression(); 371 t=ts.get(); 372 if(t.kind!=')') 373 error("')'expected"); 374 if(d<0) //第七章简单练习8 375 error("sqrt error"); 376 return sqrt(d); 377 } 378 } 379 } 380 381 double pow1() //第七章简单练习9 382 { 383 Token t=ts.get(); 384 switch(t.kind){ 385 case '(': 386 { 387 double d=expression(); 388 t=ts.get(); 389 if(t.kind==',') 390 { 391 int i2=narrow_cast<int>(expression()); 392 t=ts.get(); 393 if(t.kind!=')') 394 error("')'expected"); 395 return pow(d,i2); 396 } 397 else 398 error(", loss"); 399 } 400 } 401 } 402 403 double statement() 404 { 405 Token t=ts.get(); 406 switch(t.kind) 407 { 408 case let: 409 return declaration(); 410 case const_: 411 return declaration1(); 412 case 's': 413 return sqrt1(); 414 case 'p': 415 return pow1(); 416 default: 417 ts.putback(t); 418 return expression(); 419 } 420 } 421 422 void calculate() 423 { 424 while(cin) 425 try{ 426 cout<<"> "; 427 Token t=ts.get(); 428 while(t.kind==print) 429 t=ts.get(); 430 if(t.kind==quit) 431 return; 432 ts.putback(t); 433 cout<<"="<<statement()<<endl; 434 } 435 catch(exception&e){ 436 cerr<<e.what()<<endl; 437 clean_up_mess(); 438 } 439 } 440 441 int main() 442 { 443 try{ 444 calculate(); 445 keep_window_open(); 446 return 0; 447 448 } 449 450 catch(exception&e){ 451 cerr<<e.what()<<endl; 452 //cout<<"please enter the character ~ to close the window\n"; 453 //char ch; 454 //while(cin>>ch) 455 // if(ch=='~') 456 // return 1; 457 keep_window_open("~~"); 458 return 1; 459 } 460 461 catch(...){ 462 cerr<<"exception\n"; 463 keep_window_open("~~"); 464 return 2; 465 } 466 467 }
习题4
习题5
1 //去掉结束符号 用过行号取代 2 #include "../../st.h" 3 4 const char number='8'; 5 const char quit = 'q'; 6 7 const char print=';'; 8 const char name = 'a'; 9 const char let ='L'; 10 const char const_='c'; 11 const string declkey1="const"; 12 //const string declkey="let"; 13 const string sqrt_ ="sqrt"; 14 const string pow_="pow"; 15 16 class Variable{ 17 public: 18 string name; 19 double value; 20 bool is_const; 21 Variable(string n,double v,bool b):name(n),value(v),is_const(b){} 22 }; 23 24 class Symbol_table{ 25 public: 26 vector<Variable> var_table; 27 double get(string s); 28 void set(string s,double d); 29 bool get_bool(string s); 30 bool is_declared(string var); 31 double define_name(string var,double val,bool b); 32 }; 33 34 Symbol_table st; 35 36 double Symbol_table::get(string s) 37 { 38 for(int i=0;i<var_table.size();++i) 39 if(var_table[i].name==s) 40 return var_table[i].value; 41 error("get:undefined variable",s); 42 } 43 44 bool Symbol_table::get_bool(string s) 45 { 46 for(int i=0;i<var_table.size();++i) 47 if(var_table[i].name==s) 48 return var_table[i].is_const; 49 error("get:undefined bool",s); 50 } 51 52 53 void Symbol_table::set(string s,double d) 54 { 55 for(int i=0;i<var_table.size();++i) 56 if(var_table[i].name==s){ 57 var_table[i].value=d; 58 return; 59 } 60 error("set:undefined variable",s); 61 } 62 63 bool Symbol_table::is_declared(string var) 64 { 65 for(int i=0;i<var_table.size();++i) 66 if(var_table[i].name==var) 67 return true; 68 return false; 69 } 70 71 double Symbol_table::define_name(string var,double val,bool b) 72 { 73 if(is_declared(var)) 74 error(var," declared twice"); 75 var_table.push_back(Variable(var,val,b)); 76 return val; 77 } 78 79 80 81 82 //vector<Variable> var_table; 83 84 /*double get_value(string s)/// 85 { 86 for(int i=0;i<var_table.size();++i) 87 if(var_table[i].name==s) 88 return var_table[i].value; 89 error("get:undefined variable",s); 90 } 91 92 bool get_bool(string s)/// 93 { 94 for(int i=0;i<var_table.size();++i) 95 if(var_table[i].name==s) 96 return var_table[i].is_const; 97 error("get:undefined bool",s); 98 } 99 100 void set_value(string s,double d)/ 101 { 102 for(int i=0;i<var_table.size();++i) 103 if(var_table[i].name==s){ 104 var_table[i].value=d; 105 return; 106 } 107 error("set:undefined variable",s); 108 }*/ 109 110 class Token{ 111 public: 112 char kind; 113 double value; 114 string name; 115 Token(char ch) 116 :kind(ch),value(0){} 117 Token(char ch,double val) 118 :kind(ch),value(val){} 119 Token(char ch,string n) 120 :kind(ch),name(n){} 121 }; 122 123 class Token_stream{ 124 public: 125 Token_stream(); 126 Token get(); 127 void putback(Token t); 128 void ignore(char c); 129 private: 130 bool full; 131 Token buffer; 132 }; 133 134 Token_stream::Token_stream() 135 :full(false),buffer(0) 136 { 137 } 138 139 void Token_stream::putback(Token t) 140 { 141 if(full) error("putback() into a full buffer"); 142 buffer=t; 143 full=true; 144 } 145 146 Token Token_stream::get() 147 { 148 if(full){ 149 full=false; 150 return buffer; 151 } 152 char ch; 153 cin.get(ch); 154 switch(ch){ 155 156 case '\n': //第七章 习题5 157 return Token(print); 158 //case print: 159 case '(': case ')': case '{': 160 case '}': case '+':case '-': case '*': case '/': 161 case '!':case '%': case '=':case ',': 162 //case quit: 163 return Token(ch); 164 case '.': 165 case '0': case '1': case '2': case '3': case '4': 166 case '5': case '6': case '7': case '8': case '9': 167 { 168 cin.putback(ch); 169 double val; 170 cin>>val; 171 return Token(number,val); 172 } 173 case ' ': //第七章 习题5 174 { 175 while(isspace(ch)) 176 cin>>ch; 177 if(ch=='\n') 178 return Token(print); 179 } 180 default: 181 if(isalpha(ch)||ch=='#') 182 { 183 if(ch=='#') 184 return Token(let); 185 string s; 186 s+=ch; 187 while(cin.get(ch)&&(isalpha(ch)||isdigit(ch)||ch=='_')) //检查ch是否为字母或数字 188 s+=ch; 189 cin.putback(ch); 190 //if(s==declkey) 191 //return Token(let); 192 if(s==declkey1) 193 return Token(const_); 194 if(s==sqrt_) 195 return Token('s'); 196 else if(s==pow_) 197 return Token('p'); 198 if(s=="exit") 199 return Token(quit); 200 return Token(name,s); 201 202 } 203 error("bad token"); 204 } 205 } 206 207 void Token_stream::ignore(char c) 208 { 209 if(full&&c==buffer.kind) 210 { 211 full=false; 212 return; 213 } 214 full=false; 215 char ch=0; 216 while(cin>>ch) 217 if(ch==c) 218 return; 219 } 220 221 Token_stream ts; 222 double expression(); 223 224 225 226 double primary() 227 { 228 229 Token t=ts.get(); 230 switch(t.kind){ 231 case '(': 232 { 233 double d=expression(); 234 t=ts.get(); 235 if(t.kind!=')') 236 error("')'expected"); 237 return d; 238 } 239 case number: 240 return t.value; 241 case name: //书里没这个 242 { 243 string s1=t.name; 244 t=ts.get(); 245 if(t.kind=='=') 246 { 247 if(!st.get_bool(s1)) 248 { 249 double d=expression(); 250 st.set(s1,d); 251 return d; 252 } 253 if(st.get_bool(s1)) 254 error("the number is const"); 255 } 256 else 257 { 258 ts.putback(t); 259 return st.get(s1); 260 } 261 } 262 263 case '-': 264 return -primary(); 265 case '+': 266 return +primary(); 267 default: 268 error("primary expected"); 269 } 270 } 271 272 double primary1() 273 { 274 Token t=ts.get(); 275 while(true) 276 { 277 switch(t.kind){ 278 case '{': 279 { 280 double d=expression(); 281 t=ts.get(); 282 if(t.kind!='}') 283 error("'}'expected"); 284 return d; 285 } 286 default: 287 ts.putback(t); 288 return primary(); 289 } 290 } 291 292 293 } 294 295 double primary2() 296 { 297 double left=primary1(); 298 Token t=ts.get(); 299 while(true) 300 { 301 if(t.kind=='!') 302 { 303 if(left==0) 304 left=1; 305 for(int i=left-1;i>0;i--) 306 left*=i; 307 t=ts.get(); 308 } 309 else 310 { 311 ts.putback(t); 312 return left; 313 } 314 } 315 } 316 317 double term() 318 { 319 double left=primary2(); 320 Token t=ts.get(); 321 322 while(true){ 323 switch(t.kind){ 324 325 case '*': 326 left*=primary2(); 327 t=ts.get(); 328 break; 329 case '/': 330 { 331 double d=primary2(); 332 if(d==0) 333 error ("divide by 0"); 334 left /=d; 335 t=ts.get(); 336 break; 337 } 338 case '%': 339 { 340 int i1=narrow_cast<int>(left); 341 int i2=narrow_cast<int>(term()); 342 left=i1%i2; 343 t=ts.get(); 344 break; 345 } 346 default: 347 ts.putback(t); 348 return left; 349 } 350 } 351 } 352 353 double expression() 354 { 355 double left=term(); 356 Token t=ts.get(); 357 while(true){ 358 switch(t.kind){ 359 case '+': 360 left+=term(); 361 t=ts.get(); 362 break; 363 case '-': 364 left-=term(); 365 t=ts.get(); 366 break; 367 default: 368 ts.putback(t); 369 return left; 370 } 371 } 372 } 373 374 void clean_up_mess() 375 { 376 ts.ignore(print); 377 } 378 379 /*bool is_declared(string var) 380 { 381 for(int i=0;i<var_table.size();++i) 382 if(var_table[i].name==var) 383 return true; 384 return false; 385 } 386 387 double define_name(string var,double val,bool b) 388 { 389 if(is_declared(var)) 390 error(var," declared twice"); 391 var_table.push_back(Variable(var,val,b)); 392 return val; 393 }*/ 394 395 double declaration() 396 { 397 Token t=ts.get(); 398 if(t.kind!=name) 399 error("name expected in declaration"); 400 string var_name=t.name; 401 402 Token t2=ts.get(); 403 if(t2.kind!='=') 404 error("=missing in declaration of",var_name); 405 406 double d=expression(); 407 st.define_name(var_name,d,false); 408 return d; 409 410 } 411 412 413 414 double declaration1() 415 { 416 Token t=ts.get(); 417 if(t.kind!=name) 418 error("name expected in declaration"); 419 string var_name=t.name; 420 421 Token t2=ts.get(); 422 if(t2.kind!='=') 423 error("=missing in declaration of",var_name); 424 425 double d=expression(); 426 st.define_name(var_name,d,true); 427 return d; 428 429 } 430 431 432 433 double sqrt1() //第七章简单练习7 434 { 435 Token t=ts.get(); 436 switch(t.kind){ 437 case '(': 438 { 439 double d=expression(); 440 t=ts.get(); 441 if(t.kind!=')') 442 error("')'expected"); 443 if(d<0) //第七章简单练习8 444 error("sqrt error"); 445 return sqrt(d); 446 } 447 } 448 } 449 450 double pow1() //第七章简单练习9 451 { 452 Token t=ts.get(); 453 switch(t.kind){ 454 case '(': 455 { 456 double d=expression(); 457 t=ts.get(); 458 if(t.kind==',') 459 { 460 int i2=narrow_cast<int>(expression()); 461 t=ts.get(); 462 if(t.kind!=')') 463 error("')'expected"); 464 return pow(d,i2); 465 } 466 else 467 error(", loss"); 468 } 469 } 470 } 471 472 double statement() 473 { 474 Token t=ts.get(); 475 switch(t.kind) 476 { 477 case let: 478 return declaration(); 479 case const_: 480 return declaration1(); 481 case 's': 482 return sqrt1(); 483 case 'p': 484 return pow1(); 485 default: 486 ts.putback(t); 487 return expression(); 488 } 489 } 490 491 void calculate() 492 { 493 while(cin) 494 try{ 495 cout<<"> "; 496 Token t=ts.get(); 497 while(t.kind==print) 498 t=ts.get(); 499 if(t.kind==quit) 500 return; 501 ts.putback(t); 502 cout<<"="<<statement()<<endl; 503 } 504 catch(exception&e){ 505 cerr<<e.what()<<endl; 506 clean_up_mess(); 507 } 508 } 509 510 int main() 511 { 512 try{ 513 calculate(); 514 keep_window_open(); 515 return 0; 516 517 } 518 519 catch(exception&e){ 520 cerr<<e.what()<<endl; 521 //cout<<"please enter the character ~ to close the window\n"; 522 //char ch; 523 //while(cin>>ch) 524 // if(ch=='~') 525 // return 1; 526 keep_window_open("~~"); 527 return 1; 528 } 529 530 catch(...){ 531 cerr<<"exception\n"; 532 keep_window_open("~~"); 533 return 2; 534 } 535 536 }
本章的计算机 是前九章最经典的 好好了解 特别是文法结构