Files Classes Functions Hierarchy
#include <rpnfunc.h>
Public Member Functions | |
| rpnfor () | |
| rpnfor (deque< rpnbase * > &ds, bool const evaluate=true) | |
| ~rpnfor () | |
| rpnbase * | copy () const |
| void | visit (deque< rpnbase * > &ds, rpnprogram &n) |
| string const | name () const |
| void | eval (deque< rpnbase * > &ds) |
Definition at line 811 of file rpnfunc.h.
| rpnfor::rpnfor | ( | ) | [inline] |
Definition at line 2287 of file rpnfunc.cpp.
References eval().
02288 { 02289 if (evaluate) 02290 eval(ds); 02291 else 02292 ds.push_front(this); 02293 }
| rpnbase * rpnfor::copy | ( | ) | const [virtual] |
Reimplemented from rpnfunction.
Definition at line 2295 of file rpnfunc.cpp.
References rpnfor().
02296 { 02297 return new rpnfor(); 02298 }
| void rpnfor::eval | ( | deque< rpnbase * > & | ds | ) | [virtual] |
Reimplemented from rpnfunction.
Definition at line 2300 of file rpnfunc.cpp.
References rpnbase::accept(), and rpnbase::dec().
Referenced by rpnfor().
| string const rpnfor::name | ( | ) | const [inline, virtual] |
| void rpnfor::visit | ( | deque< rpnbase * > & | ds, | |
| rpnprogram & | n | |||
| ) | [virtual] |
Reimplemented from rpnfunction.
Definition at line 2349 of file rpnfunc.cpp.
References rpnbase::copy(), rpnbase::dec(), rpnbase::eval(), rpnbase::isinteger(), and rpnbase::isprogram().
02350 { 02351 rpnbase* x0 = ds.front(); // body 02352 ds.pop_front(); 02353 rpnbase* x1 = ds.front(); // test 02354 ds.pop_front(); 02355 02356 //cout << "Entering rpnfor" << endl; 02357 02358 if ( x1->isprogram()) 02359 { 02360 02361 bool flag(0); 02362 rpnbase* x3; 02363 02364 x1->copy()->eval(ds); 02365 x3 = ds.front(); 02366 ds.pop_front(); 02367 if (x3->isinteger()) 02368 { 02369 flag=((rpninteger*)x3)->num; 02370 x3->dec(); 02371 } 02372 else 02373 { 02374 new rpnstring(ds,"error in for: test needs to return integer."); 02375 } 02376 02377 // 02378 // MAGIC NUMBER 02379 // MAGIC NUMBER 02380 // MAGIC NUMBER 02381 // 02382 // Limit for loop computation. 02383 long unsigned int loopcounter(100000); 02384 02385 02386 for ( ; flag; ) 02387 { 02388 x0->copy()->eval(ds); 02389 02390 x1->copy()->eval(ds); 02391 x3 = ds.front(); 02392 ds.pop_front(); 02393 if (x3->isinteger()) 02394 { 02395 flag=((rpninteger*)x3)->num; 02396 //cout << "num=" << ((rpninteger*)x3)->num << " "; 02397 //cout << "flag=" << flag << endl; 02398 x3->dec(); 02399 } 02400 else 02401 { 02402 new rpnstring(ds,"error in for: test needs to return integer."); 02403 break; 02404 } 02405 02406 --loopcounter; 02407 if (loopcounter==0) 02408 { 02409 new rpnstring(ds,"error: for in infinite loop."); 02410 02411 flag=false; 02412 break; 02413 } 02414 } 02415 02416 } 02417 else 02418 { // Restore the stack and exit. 02419 ds.push_front(x1); 02420 ds.push_front(x0); 02421 return; 02422 } 02423 02424 x0->dec(); 02425 x1->dec(); 02426 02427 }
1.5.8