Files Classes Functions Hierarchy
00001 #include <rpnfunc.h> 00002 00003 #include <algorithm> 00004 #include <iostream> 00005 #include <deque> 00006 #include <vector> 00007 #include <string> 00008 #include <sstream> 00009 using namespace std; 00010 00011 #include <rpn.h> 00012 #include <pathstuff.h> 00013 00014 #ifndef NDEBUG 00015 // Toggle Debug. 00016 #define DEBUG_RPNFUNC_H 00017 #endif 00018 00019 00020 // Implementation 00021 // ------------------------------------------------------------ 00022 // 00023 00024 00025 void rpnprogset::visit(deque<rpnbase*>& ds,rpninteger& n) 00026 { 00027 if (ds.size()<2) 00028 return; 00029 00030 rpnbase* x0 = ds.front(); 00031 ds.pop_front(); 00032 rpnbase* x1 = ds.front(); 00033 bool restore(true); 00034 if (x1->isprogram()) 00035 { 00036 rpnprogram * p = (rpnprogram*)x1; 00037 if ((n.num>=0)&&(n.num<4)) 00038 { 00039 restore=false; 00040 p->state = n.num; 00041 x0->dec(); 00042 } 00043 } 00044 00045 if (restore) 00046 ds.push_front(x0); 00047 } 00048 00049 00050 void rpnprogset::visit(deque<rpnbase*>& ds,rpnprogram& p) 00051 { 00052 new rpninteger(ds,p.state); 00053 } 00054 00055 00056 rpnprogset::rpnprogset 00057 ( 00058 deque<rpnbase*>& ds, 00059 bool const evaluate 00060 ) 00061 { 00062 if (evaluate) 00063 eval(ds); 00064 else 00065 ds.push_front(this); 00066 } 00067 00068 rpnbase* rpnprogset::copy() const 00069 { 00070 return new rpnprogset(); 00071 } 00072 00073 void rpnprogset::eval( deque<rpnbase*>& ds ) 00074 { 00075 if (!ds.empty()) 00076 ds[0]->accept(ds,*this); 00077 00078 dec(); 00079 } 00080 00081 00082 00083 00084 00085 00086 00087 00088 00089 rpnpush::rpnpush(deque<rpnbase*>& ds, bool const evaluate) 00090 { 00091 if (evaluate) 00092 eval(ds); 00093 else 00094 ds.push_front(this); 00095 } 00096 00097 rpnbase* rpnpush::copy() const 00098 { 00099 return new rpnpush(); 00100 } 00101 00102 void rpnpush::eval( deque<rpnbase*>& ds ) 00103 { 00104 if (!ds.empty()) 00105 { 00106 rpnprogramstackstate().ds2.push_front(ds.front()); 00107 ds.pop_front(); 00108 } 00109 00110 dec(); 00111 } 00112 00113 00114 rpnpop::rpnpop(deque<rpnbase*>& ds, bool const evaluate) 00115 { 00116 if (evaluate) 00117 eval(ds); 00118 else 00119 ds.push_front(this); 00120 } 00121 00122 rpnbase* rpnpop::copy() const 00123 { 00124 return new rpnpop(); 00125 } 00126 00127 void rpnpop::eval( deque<rpnbase*>& ds ) 00128 { 00129 //cout << "rpnpop::eval" << endl; 00130 if (!rpnprogramstackstate().ds2.empty()) 00131 { 00132 ds.push_front( rpnprogramstackstate().ds2.front() ); 00133 rpnprogramstackstate().ds2.pop_front(); 00134 } 00135 00136 dec(); 00137 } 00138 00139 00140 rpnpushn::rpnpushn(deque<rpnbase*>& ds, bool const evaluate) 00141 { 00142 if (evaluate) 00143 eval(ds); 00144 else 00145 ds.push_front(this); 00146 } 00147 00148 rpnbase* rpnpushn::copy() const 00149 { 00150 return new rpnpushn(); 00151 } 00152 00153 void rpnpushn::eval( deque<rpnbase*>& ds ) 00154 { 00155 if (!ds.empty()) 00156 ds[0]->accept(ds,*this); 00157 00158 dec(); 00159 } 00160 00161 void rpnpushn::visit(deque<rpnbase*>& ds,rpninteger& k) 00162 { 00163 if (k.num<0) 00164 return; 00165 00166 unsigned int n = (unsigned int)(k.num); 00167 00168 if (ds.size()<=n) 00169 return; 00170 00171 rpnbase* x0 = ds.front(); 00172 ds.pop_front(); 00173 00174 if (n==0) 00175 return; 00176 00177 for (unsigned int i=0, imax=k.num; i<imax; ++i) 00178 { 00179 rpnprogramstackstate().ds2.push_front(ds.front()); 00180 ds.pop_front(); 00181 } 00182 00183 x0->dec(); 00184 } 00185 00186 00187 rpnpopn::rpnpopn(deque<rpnbase*>& ds, bool const evaluate) 00188 { 00189 if (evaluate) 00190 eval(ds); 00191 else 00192 ds.push_front(this); 00193 } 00194 00195 rpnbase* rpnpopn::copy() const 00196 { 00197 return new rpnpopn(); 00198 } 00199 00200 void rpnpopn::eval( deque<rpnbase*>& ds ) 00201 { 00202 if (!ds.empty()) 00203 ds[0]->accept(ds,*this); 00204 00205 dec(); 00206 } 00207 00208 void rpnpopn::visit(deque<rpnbase*>& ds,rpninteger& k) 00209 { 00210 if (k.num<0) 00211 return; 00212 00213 unsigned int n = (unsigned int)(k.num); 00214 00215 if (rpnprogramstackstate().ds2.size()<n) 00216 return; 00217 00218 rpnbase* x0 = ds.front(); 00219 ds.pop_front(); 00220 00221 if (n==0) 00222 return; 00223 00224 for (unsigned int i=0, imax=n; i<imax; ++i) 00225 { 00226 ds.push_front( rpnprogramstackstate().ds2.front() ); 00227 rpnprogramstackstate().ds2.pop_front(); 00228 } 00229 00230 x0->dec(); 00231 } 00232 00233 00234 dssize2::dssize2(deque<rpnbase*>& ds, bool const evaluate) 00235 { 00236 if (evaluate) 00237 eval(ds); 00238 else 00239 ds.push_front(this); 00240 } 00241 00242 rpnbase* dssize2::copy() const 00243 { 00244 return new dssize2(); 00245 } 00246 00247 void dssize2::eval( deque<rpnbase*>& ds ) 00248 { 00249 new rpninteger(ds,rpnprogramstackstate().ds2.size()); 00250 00251 dec(); 00252 } 00253 00254 00255 rpneval::rpneval(deque<rpnbase*>& ds, bool const evaluate) 00256 { 00257 if (evaluate) 00258 eval(ds); 00259 else 00260 ds.push_front(this); 00261 } 00262 00263 rpnbase* rpneval::copy() const 00264 { 00265 return new rpneval(); 00266 } 00267 00268 void rpneval::eval( deque<rpnbase*>& ds ) 00269 { 00270 if (!ds.empty()) 00271 { 00272 rpnbase* x0 = ds.front(); 00273 ds.pop_front(); 00274 x0->eval(ds); 00275 } 00276 00277 dec(); 00278 } 00279 00280 00281 rpnclear::rpnclear(deque<rpnbase*>& ds, bool const evaluate) 00282 { 00283 if (evaluate) 00284 eval(ds); 00285 else 00286 ds.push_front(this); 00287 } 00288 00289 rpnbase* rpnclear::copy() const 00290 { 00291 return new rpnclear(); 00292 } 00293 00294 void rpnclear::eval( deque<rpnbase*>& ds ) 00295 { 00296 if (!ds.empty()) 00297 { 00298 for (unsigned int i=0, imax=ds.size(); i<imax; ++i) 00299 ds[i]->dec(); 00300 00301 ds.clear(); 00302 } 00303 00304 dec(); 00305 } 00306 00307 00308 rpnclearvar::rpnclearvar(deque<rpnbase*>& ds, bool const evaluate) 00309 { 00310 if (evaluate) 00311 eval(ds); 00312 else 00313 ds.push_front(this); 00314 } 00315 00316 rpnbase* rpnclearvar::copy() const 00317 { 00318 return new rpnclearvar(); 00319 } 00320 00321 void rpnclearvar::eval( deque<rpnbase*>& ds ) 00322 { 00323 deque<rpnvar*>& var = rpnprogramstackstate().vs(); 00324 if (!var.empty()) 00325 { 00326 for (unsigned int i=0, imax=var.size(); i<imax; ++i) 00327 var[i]->dec(); 00328 00329 var.clear(); 00330 } 00331 00332 dec(); 00333 } 00334 00335 00336 rpnclearboth::rpnclearboth(deque<rpnbase*>& ds, bool const evaluate) 00337 { 00338 if (evaluate) 00339 eval(ds); 00340 else 00341 ds.push_front(this); 00342 } 00343 00344 rpnbase* rpnclearboth::copy() const 00345 { 00346 return new rpnclearboth(); 00347 } 00348 00349 void rpnclearboth::eval( deque<rpnbase*>& ds ) 00350 { 00351 if (!ds.empty()) 00352 { 00353 for (unsigned int i=0, imax=ds.size(); i<imax; ++i) 00354 ds[i]->dec(); 00355 00356 ds.clear(); 00357 } 00358 00359 deque<rpnvar*>& var = rpnprogramstackstate().vs(); 00360 if (!var.empty()) 00361 { 00362 for (unsigned int i=0, imax=var.size(); i<imax; ++i) 00363 var[i]->dec(); 00364 00365 var.clear(); 00366 } 00367 00368 dec(); 00369 } 00370 00371 00372 rpndup::rpndup(deque<rpnbase*>& ds, bool const evaluate) 00373 { 00374 if (evaluate) 00375 eval(ds); 00376 else 00377 ds.push_front(this); 00378 } 00379 00380 rpnbase* rpndup::copy() const 00381 { 00382 return new rpndup(); 00383 } 00384 00385 void rpndup::eval( deque<rpnbase*>& ds ) 00386 { 00387 if (!ds.empty()) 00388 ds.push_front( ds[0]->copy() ); 00389 00390 dec(); 00391 } 00392 00393 00394 rpndupn::rpndupn(deque<rpnbase*>& ds, bool const evaluate) 00395 { 00396 if (evaluate) 00397 eval(ds); 00398 else 00399 ds.push_front(this); 00400 } 00401 00402 rpnbase* rpndupn::copy() const 00403 { 00404 return new rpndupn(); 00405 } 00406 00407 void rpndupn::eval( deque<rpnbase*>& ds ) 00408 { 00409 if (!ds.empty()) 00410 ds[0]->accept(ds,*this); 00411 00412 dec(); 00413 } 00414 00415 void rpndupn::visit(deque<rpnbase*>& ds,rpninteger& n) 00416 { 00417 rpnbase* x0 = ds.front(); 00418 ds.pop_front(); 00419 00420 unsigned int const k(n.num); 00421 x0->dec(); 00422 00423 if (n.num<=0) 00424 return; 00425 00426 if (ds.size()<k) 00427 return; 00428 00429 for (unsigned int i=0; i<k; ++i) 00430 ds.push_front( ds[k-1]->copy() ); 00431 00432 } 00433 00434 00435 dssize::dssize(deque<rpnbase*>& ds, bool const evaluate) 00436 { 00437 if (evaluate) 00438 eval(ds); 00439 else 00440 ds.push_front(this); 00441 } 00442 00443 rpnbase* dssize::copy() const 00444 { 00445 return new dssize(); 00446 } 00447 00448 void dssize::eval( deque<rpnbase*>& ds ) 00449 { 00450 new rpninteger(ds,ds.size()); 00451 00452 dec(); 00453 } 00454 00455 00456 rev::rev(deque<rpnbase*>& ds, bool const evaluate) 00457 { 00458 if (evaluate) 00459 eval(ds); 00460 else 00461 ds.push_front(this); 00462 } 00463 00464 rpnbase* rev::copy() const 00465 { 00466 return new rev(); 00467 } 00468 00469 void rev::eval( deque<rpnbase*>& ds ) 00470 { 00471 reverse(ds.begin(),ds.end()); 00472 00473 dec(); 00474 } 00475 00476 00477 rot::rot(deque<rpnbase*>& ds, bool const evaluate) 00478 { 00479 if (evaluate) 00480 eval(ds); 00481 else 00482 ds.push_front(this); 00483 } 00484 00485 rpnbase* rot::copy() const 00486 { 00487 return new rot(); 00488 } 00489 00490 void rot::eval( deque<rpnbase*>& ds ) 00491 { 00492 if (ds.size()>2) 00493 rotate(ds.begin(),ds.begin()+1,ds.begin()+3); 00494 00495 dec(); 00496 } 00497 00498 00499 rotn::rotn(deque<rpnbase*>& ds, bool const evaluate) 00500 { 00501 if (evaluate) 00502 eval(ds); 00503 else 00504 ds.push_front(this); 00505 } 00506 00507 rpnbase* rotn::copy() const 00508 { 00509 return new rotn(); 00510 } 00511 00512 void rotn::eval( deque<rpnbase*>& ds ) 00513 { 00514 if (!ds.empty()) 00515 ds[0]->accept(ds,*this); 00516 00517 dec(); 00518 } 00519 00520 void rotn::visit(deque<rpnbase*>& ds,rpninteger& k) 00521 { 00522 if (k.num==0) //no rotation 00523 return; 00524 00525 rpnbase* x0 = ds.front(); 00526 ds.pop_front(); 00527 rpnbase* x1 = ds.front(); 00528 ds.pop_front(); 00529 00530 if (x1->isinteger()) 00531 { 00532 int n = ((rpninteger*)x1)->num; 00533 00534 // Valid state to rotate data. 00535 if ((n>0)&&(ds.size()>=(unsigned int)n)) 00536 { 00537 // STL defines rotation in a minimalistic sense - a positive 00538 // integer mapping an element maps it back to the start. 00539 // While this is mathematical, for operational use a +ve and 00540 // -ve direction is easier. +k rotates it k times, -k is in 00541 // the other direction. 00542 00543 unsigned int k2 = (n-k.num)%n; 00544 rotate(ds.begin(),ds.begin()+k2,ds.begin()+n); 00545 00546 x0->dec(); 00547 x1->dec(); 00548 00549 return; 00550 00551 } 00552 } 00553 00554 // Error: restore the stack. 00555 ds.push_front(x1); 00556 ds.push_front(x0); 00557 } 00558 00559 rpnswap::rpnswap(deque<rpnbase*>& ds, bool const evaluate) 00560 { 00561 if (evaluate) 00562 eval(ds); 00563 else 00564 ds.push_front(this); 00565 } 00566 00567 rpnbase* rpnswap::copy() const 00568 { 00569 return new rpnswap(); 00570 } 00571 00572 void rpnswap::eval( deque<rpnbase*>& ds ) 00573 { 00574 if (ds.size()>1) 00575 { 00576 rpnbase* p = ds[0]; 00577 ds[0] = ds[1]; 00578 ds[1] = p; 00579 } 00580 00581 dec(); 00582 } 00583 00584 00585 rpnswap2::rpnswap2(deque<rpnbase*>& ds, bool const evaluate) 00586 { 00587 if (evaluate) 00588 eval(ds); 00589 else 00590 ds.push_front(this); 00591 } 00592 00593 rpnbase* rpnswap2::copy() const 00594 { 00595 return new rpnswap2(); 00596 } 00597 00598 void rpnswap2::eval( deque<rpnbase*>& ds ) 00599 { 00600 if (ds.size()>1) 00601 { 00602 rpnbase* p = ds[0]; 00603 ds[0] = ds[1]; 00604 ds[1] = p; 00605 } 00606 00607 dec(); 00608 } 00609 00610 00611 00612 dropi::dropi(deque<rpnbase*>& ds, bool const evaluate) 00613 { 00614 if (evaluate) 00615 eval(ds); 00616 else 00617 ds.push_front(this); 00618 } 00619 00620 rpnbase* dropi::copy() const 00621 { 00622 return new dropi(); 00623 } 00624 00625 void dropi::eval( deque<rpnbase*>& ds ) 00626 { 00627 if(!ds.empty()) 00628 ds[0]->accept(ds,*this); 00629 00630 dec(); 00631 } 00632 00633 void dropi::visit(deque<rpnbase*>& ds,rpninteger& n) 00634 { 00635 if (n.num<0) 00636 return; 00637 00638 unsigned int const k = n.num; 00639 if (ds.size()>(k+1)) 00640 { 00641 rpnbase* x0 = ds.front(); 00642 ds.pop_front(); 00643 00644 ds.erase(ds.begin()+k); 00645 x0->dec(); 00646 } 00647 } 00648 00649 00650 drop::drop(deque<rpnbase*>& ds, bool const evaluate) 00651 { 00652 if (evaluate) 00653 eval(ds); 00654 else 00655 ds.push_front(this); 00656 } 00657 00658 rpnbase* drop::copy() const 00659 { 00660 return new drop(); 00661 } 00662 00663 void drop::eval( deque<rpnbase*>& ds ) 00664 { 00665 if (!ds.empty()) 00666 { 00667 rpnbase* x0 = ds.front(); 00668 ds.pop_front(); 00669 x0->dec(); 00670 } 00671 00672 dec(); 00673 } 00674 00675 dropsymb::dropsymb(deque<rpnbase*>& ds, bool const evaluate) 00676 { 00677 if (evaluate) 00678 eval(ds); 00679 else 00680 ds.push_front(this); 00681 } 00682 00683 00684 dropn::dropn(deque<rpnbase*>& ds, bool const evaluate) 00685 { 00686 if (evaluate) 00687 eval(ds); 00688 else 00689 ds.push_front(this); 00690 } 00691 00692 rpnbase* dropn::copy() const 00693 { 00694 return new dropn(); 00695 } 00696 00697 void dropn::eval( deque<rpnbase*>& ds ) 00698 { 00699 if(!ds.empty()) 00700 ds[0]->accept(ds,*this); 00701 00702 dec(); 00703 } 00704 00705 void dropn::visit(deque<rpnbase*>& ds,rpninteger& n) 00706 { 00707 if (n.num<0) 00708 return; 00709 00710 unsigned int val = n.num; 00711 if (ds.size()>val) 00712 { 00713 rpnbase* x0 = ds.front(); 00714 ds.pop_front(); 00715 00716 ds.erase(ds.begin(),ds.begin()+val); 00717 x0->dec(); 00718 } 00719 } 00720 00721 00722 ifthen::ifthen(deque<rpnbase*>& ds, bool const evaluate) 00723 { 00724 if (evaluate) 00725 eval(ds); 00726 else 00727 ds.push_front(this); 00728 } 00729 00730 rpnbase* ifthen::copy() const 00731 { 00732 return new ifthen(); 00733 } 00734 00735 void ifthen::eval( deque<rpnbase*>& ds ) 00736 { 00737 if( ds.size()>1) 00738 ds[1]->accept(ds,*this); 00739 00740 dec(); 00741 } 00742 00743 void ifthen::visit(deque<rpnbase*>& ds,rpnreal& n) 00744 { 00745 00746 rpnbase* x0 = ds.front(); 00747 ds.pop_front(); 00748 // x1 is a pointer to n 00749 rpnbase* x1 = ds.front(); 00750 ds.pop_front(); 00751 00752 if (n.num != 0) 00753 { 00754 x1->dec(); 00755 x0->eval(ds); 00756 } 00757 else 00758 { 00759 x1->dec(); 00760 x0->dec(); 00761 } 00762 } 00763 00764 void ifthen::visit(deque<rpnbase*>& ds,rpninteger& n) 00765 { 00766 00767 rpnbase* x0 = ds.front(); 00768 ds.pop_front(); 00769 // x1 is a pointer to n 00770 rpnbase* x1 = ds.front(); 00771 ds.pop_front(); 00772 00773 if (n.num != 0) 00774 { 00775 x1->dec(); 00776 x0->eval(ds); 00777 } 00778 else 00779 { 00780 x1->dec(); 00781 x0->dec(); 00782 } 00783 } 00784 00785 00786 thenif::thenif(deque<rpnbase*>& ds, bool const evaluate) 00787 { 00788 if (evaluate) 00789 eval(ds); 00790 else 00791 ds.push_front(this); 00792 } 00793 00794 rpnbase* thenif::copy() const 00795 { 00796 return new thenif(); 00797 } 00798 00799 void thenif::eval( deque<rpnbase*>& ds ) 00800 { 00801 if( ds.size()>1) 00802 ds[0]->accept(ds,*this); 00803 00804 dec(); 00805 } 00806 00807 void thenif::visit(deque<rpnbase*>& ds,rpnreal& n) 00808 { 00809 rpnbase* x0 = ds.front(); 00810 ds.pop_front(); 00811 // x0 is a pointer to n 00812 rpnbase* x1 = ds.front(); 00813 ds.pop_front(); 00814 00815 if (n.num != 0) 00816 x1->eval(ds); 00817 else 00818 x1->dec(); 00819 00820 x0->dec(); 00821 } 00822 00823 void thenif::visit(deque<rpnbase*>& ds,rpninteger& n) 00824 { 00825 rpnbase* x0 = ds.front(); 00826 ds.pop_front(); 00827 // x0 is a pointer to n 00828 rpnbase* x1 = ds.front(); 00829 ds.pop_front(); 00830 00831 if (n.num != 0) 00832 x1->eval(ds); 00833 else 00834 x1->dec(); 00835 00836 x0->dec(); 00837 } 00838 00839 00840 ifthenelse::ifthenelse(deque<rpnbase*>& ds, bool const evaluate) 00841 { 00842 if (evaluate) 00843 eval(ds); 00844 else 00845 ds.push_front(this); 00846 } 00847 00848 rpnbase* ifthenelse::copy() const 00849 { 00850 return new ifthenelse(); 00851 } 00852 00853 void ifthenelse::eval( deque<rpnbase*>& ds ) 00854 { 00855 if( ds.size()>2) 00856 ds[2]->accept(ds,*this); 00857 00858 dec(); 00859 } 00860 00861 void ifthenelse::visit(deque<rpnbase*>& ds,rpnreal& n) 00862 { 00863 rpnbase* x0 = ds.front(); 00864 ds.pop_front(); 00865 rpnbase* x1 = ds.front(); 00866 ds.pop_front(); 00867 rpnbase* x2 = ds.front(); 00868 ds.pop_front(); 00869 00870 if (n.num != 0) 00871 { 00872 x2->dec(); 00873 x0->dec(); 00874 x1->eval(ds); 00875 } 00876 else 00877 { 00878 x2->dec(); 00879 x1->dec(); 00880 x0->eval(ds); 00881 } 00882 } 00883 00884 void ifthenelse::visit(deque<rpnbase*>& ds,rpninteger& n) 00885 { 00886 rpnbase* x0 = ds.front(); 00887 ds.pop_front(); 00888 rpnbase* x1 = ds.front(); 00889 ds.pop_front(); 00890 rpnbase* x2 = ds.front(); 00891 ds.pop_front(); 00892 00893 if (n.num != 0) 00894 { 00895 x2->dec(); 00896 x0->dec(); 00897 x1->eval(ds); 00898 } 00899 else 00900 { 00901 x2->dec(); 00902 x1->dec(); 00903 x0->eval(ds); 00904 } 00905 } 00906 00907 00908 thenelseif::thenelseif(deque<rpnbase*>& ds, bool const evaluate) 00909 { 00910 if (evaluate) 00911 eval(ds); 00912 else 00913 ds.push_front(this); 00914 } 00915 00916 rpnbase* thenelseif::copy() const 00917 { 00918 return new thenelseif(); 00919 } 00920 00921 void thenelseif::eval( deque<rpnbase*>& ds ) 00922 { 00923 if( ds.size()>2) 00924 ds[0]->accept(ds,*this); 00925 00926 dec(); 00927 } 00928 00929 void thenelseif::visit(deque<rpnbase*>& ds,rpnreal& n) 00930 { 00931 rpnbase* x0 = ds.front(); 00932 ds.pop_front(); 00933 rpnbase* x1 = ds.front(); 00934 ds.pop_front(); 00935 rpnbase* x2 = ds.front(); 00936 ds.pop_front(); 00937 00938 if (n.num != 0) 00939 { 00940 x1->dec(); 00941 x2->eval(ds); 00942 } 00943 else 00944 { 00945 x2->dec(); 00946 x1->eval(ds); 00947 } 00948 x0->dec(); 00949 } 00950 00951 void thenelseif::visit(deque<rpnbase*>& ds,rpninteger& n) 00952 { 00953 rpnbase* x0 = ds.front(); 00954 ds.pop_front(); 00955 rpnbase* x1 = ds.front(); 00956 ds.pop_front(); 00957 rpnbase* x2 = ds.front(); 00958 ds.pop_front(); 00959 00960 if (n.num != 0) 00961 { 00962 x1->dec(); 00963 x2->eval(ds); 00964 } 00965 else 00966 { 00967 x2->dec(); 00968 x1->eval(ds); 00969 } 00970 x0->dec(); 00971 } 00972 00973 00974 rpnnot::rpnnot(deque<rpnbase*>& ds, bool const evaluate) 00975 { 00976 if (evaluate) 00977 eval(ds); 00978 else 00979 ds.push_front(this); 00980 } 00981 00982 rpnbase* rpnnot::copy() const 00983 { 00984 return new rpnnot(); 00985 } 00986 00987 void rpnnot::eval( deque<rpnbase*>& ds ) 00988 { 00989 if(!ds.empty()) 00990 ds[0]->accept(ds,*this); 00991 00992 dec(); 00993 } 00994 00995 void rpnnot::visit(deque<rpnbase*>& ds,rpnreal& n) 00996 { 00997 if (n.num==0) 00998 n.num = 1; 00999 else 01000 n.num = 0; 01001 } 01002 01003 void rpnnot::visit(deque<rpnbase*>& ds,rpninteger& n) 01004 { 01005 if (n.num==0) 01006 n.num = 1; 01007 else 01008 n.num = 0; 01009 } 01010 01011 01012 rpnneg::rpnneg(deque<rpnbase*>& ds, bool const evaluate) 01013 { 01014 if (evaluate) 01015 eval(ds); 01016 else 01017 ds.push_front(this); 01018 } 01019 01020 rpnbase* rpnneg::copy() const 01021 { 01022 return new rpnneg(); 01023 } 01024 01025 void rpnneg::eval( deque<rpnbase*>& ds ) 01026 { 01027 if(!ds.empty()) 01028 ds[0]->accept(ds,*this); 01029 01030 dec(); 01031 } 01032 01033 void rpnneg::visit(deque<rpnbase*>& ds,rpnreal& n) 01034 { 01035 n.num *= -1; 01036 } 01037 01038 void rpnneg::visit(deque<rpnbase*>& ds,rpninteger& n) 01039 { 01040 n.num *= -1; 01041 } 01042 01043 void rpnneg::visit(deque<rpnbase*>& ds,rpncomplex& n) 01044 { 01045 n.num *= -1; 01046 } 01047 01048 01049 var::var(deque<rpnbase*>& ds, bool const evaluate) 01050 { 01051 if (evaluate) 01052 eval(ds); 01053 else 01054 ds.push_front(this); 01055 } 01056 01057 rpnbase* var::copy() const 01058 { 01059 return new var(); 01060 } 01061 01062 void var::eval( deque<rpnbase*>& ds ) 01063 { 01064 if (ds.size()>1) 01065 ds[0]->accept(ds,*this); 01066 01067 dec(); 01068 } 01069 01070 void var::visit(deque<rpnbase*>& ds,rpnstring& s) 01071 { 01072 rpnbase* x0 = ds.front(); 01073 ds.pop_front(); 01074 rpnbase* x1 = ds.front(); 01075 ds.pop_front(); 01076 01077 rpnprogramstackstate().add(x1,s.str); 01078 x0->dec(); 01079 } 01080 01081 01082 vardel::vardel(deque<rpnbase*>& ds, bool const evaluate) 01083 { 01084 if (evaluate) 01085 eval(ds); 01086 else 01087 ds.push_front(this); 01088 } 01089 01090 rpnbase* vardel::copy() const 01091 { 01092 return new vardel(); 01093 } 01094 01095 void vardel::eval( deque<rpnbase*>& ds ) 01096 { 01097 if (!ds.empty()) 01098 ds[0]->accept(ds,*this); 01099 01100 dec(); 01101 } 01102 01103 void vardel::visit(deque<rpnbase*>& ds,rpnstring& s) 01104 { 01105 rpnbase* x0 = ds.front(); 01106 ds.pop_front(); 01107 01108 rpnprogramstackstate().erase(s.str); 01109 01110 x0->dec(); 01111 } 01112 01113 01114 vareval::vareval(deque<rpnbase*>& ds, bool const evaluate) 01115 { 01116 if (evaluate) 01117 eval(ds); 01118 else 01119 ds.push_front(this); 01120 } 01121 01122 rpnbase* vareval::copy() const 01123 { 01124 return new vareval(); 01125 } 01126 01127 void vareval::eval( deque<rpnbase*>& ds ) 01128 { 01129 if (!ds.empty()) 01130 ds[0]->accept(ds,*this); 01131 01132 dec(); 01133 } 01134 01135 void vareval::visit(deque<rpnbase*>& ds,rpnstring& s) 01136 { 01137 rpnbase* x0 = ds.front(); 01138 ds.pop_front(); 01139 01140 rpnprogramstackstate().evaluate(ds,s.str); 01141 01142 x0->dec(); 01143 } 01144 01145 void vareval::visit(deque<rpnbase*>& ds,rpninteger& n) 01146 { 01147 rpnbase* x0 = ds.front(); 01148 ds.pop_front(); 01149 01150 if (n.num>=0) 01151 { 01152 unsigned int const n2 = (unsigned int)(n.num); 01153 if (n2<ds.size()) 01154 { 01155 rpnbase * x = ds[n.num]->copy(); 01156 x->eval(ds); 01157 } 01158 } 01159 01160 x0->dec(); 01161 } 01162 01163 01164 01165 void vareval::visit(deque<rpnbase*>& ds,rpnprogram& p) 01166 { 01167 rpnbase* x0 = ds.front(); 01168 ds.pop_front(); 01169 01170 x0->eval(ds); 01171 } 01172 01173 01174 varpushd::varpushd(deque<rpnbase*>& ds, bool const evaluate) 01175 { 01176 if (evaluate) 01177 eval(ds); 01178 else 01179 ds.push_front(this); 01180 } 01181 01182 rpnbase* varpushd::copy() const 01183 { 01184 return new varpushd(); 01185 } 01186 01187 void varpushd::eval( deque<rpnbase*>& ds ) 01188 { 01189 if (!ds.empty()) 01190 ds[0]->accept(ds,*this); 01191 01192 dec(); 01193 } 01194 01195 void varpushd::visit(deque<rpnbase*>& ds,rpnstring& s) 01196 { 01197 rpnbase* x0 = ds.front(); 01198 ds.pop_front(); 01199 01200 bool found(false); 01201 rpnprogram* p; 01202 vector<string> v; 01203 pathstuff().convert(v,s.str); 01204 01205 //for (unsigned int i=0; i<v.size(); ++i) 01206 //{ 01207 // cout << "*" << v[i] << "*" << endl; 01208 //} 01209 01210 pathstuff().findpath(found,p,v); 01211 01212 //cout << "varpushd::visit(ds," << s.str << ")" << endl; 01213 //cout << " found=" << found << endl; 01214 01215 if (found) 01216 { 01217 rpnprogramstackstate().push(p); 01218 x0->dec(); 01219 } 01220 else 01221 ds.push_front(x0); // Restore the stack. 01222 } 01223 01224 void varpushd::visit(deque<rpnbase*>& ds,rpnprogram& p) 01225 { 01226 rpnprogramstackstate().push(&p); 01227 } 01228 01229 01230 varpopd::varpopd(deque<rpnbase*>& ds, bool const evaluate) 01231 { 01232 if (evaluate) 01233 eval(ds); 01234 else 01235 ds.push_front(this); 01236 } 01237 01238 rpnbase* varpopd::copy() const 01239 { 01240 return new varpopd(); 01241 } 01242 01243 void varpopd::eval( deque<rpnbase*>& ds ) 01244 { 01245 rpnprogramstackstate().pop(); 01246 01247 dec(); 01248 } 01249 01250 01251 depthd::depthd(deque<rpnbase*>& ds, bool const evaluate) 01252 { 01253 if (evaluate) 01254 eval(ds); 01255 else 01256 ds.push_front(this); 01257 } 01258 01259 rpnbase* depthd::copy() const 01260 { 01261 return new depthd(); 01262 } 01263 01264 void depthd::eval( deque<rpnbase*>& ds ) 01265 { 01266 new rpninteger 01267 ( 01268 ds, 01269 rpnprogramstackstate().ps->size() 01270 ); 01271 01272 dec(); 01273 } 01274 01275 01276 varls::varls(deque<rpnbase*>& ds, bool const evaluate) 01277 { 01278 if (evaluate) 01279 eval(ds); 01280 else 01281 ds.push_front(this); 01282 } 01283 01284 rpnbase* varls::copy() const 01285 { 01286 return new varls(); 01287 } 01288 01289 void varls::eval( deque<rpnbase*>& ds ) 01290 { 01291 deque<rpnvar*>& v = rpnprogramstackstate().vs(); 01292 if (!v.empty()) 01293 { 01294 cout << "{ " << endl; 01295 for (unsigned int i=0, imax=v.size(); i<imax; ++i) 01296 { 01297 cout << " " << v[i]->varname << "="; 01298 cout << v[i]->x << endl; 01299 } 01300 cout << "}" << endl; 01301 } 01302 01303 dec(); 01304 } 01305 01306 01307 vartree::vartree(deque<rpnbase*>& ds, bool const evaluate) 01308 { 01309 if (evaluate) 01310 eval(ds); 01311 else 01312 ds.push_front(this); 01313 } 01314 01315 rpnbase* vartree::copy() const 01316 { 01317 return new vartree(); 01318 } 01319 01320 void vartree::draw(rpnprogram* p, unsigned int const depth) 01321 { 01322 if(p->variables.empty()) 01323 return; 01324 01325 string space; 01326 for (unsigned int i=0; i<depth; ++i) 01327 space += " "; 01328 01329 for (unsigned int i=0, imax=p->variables.size(); i<imax; ++i) 01330 { 01331 if (p->variables[i]->x->isprogram()) 01332 { 01333 cout << space << p->variables[i]->varname << endl; 01334 draw((rpnprogram*)(p->variables[i]->x),depth+1); 01335 } 01336 } 01337 } 01338 01339 void vartree::eval( deque<rpnbase*>& ds ) 01340 { 01341 cout << "." << endl; 01342 draw(rpnprogramstackstate().ps->front(),1); 01343 01344 dec(); 01345 } 01346 01347 01348 varpwd::varpwd(deque<rpnbase*>& ds, bool const evaluate) 01349 { 01350 if (evaluate) 01351 eval(ds); 01352 else 01353 ds.push_front(this); 01354 } 01355 01356 rpnbase* varpwd::copy() const 01357 { 01358 return new varpwd(); 01359 } 01360 01361 void varpwd::eval( deque<rpnbase*>& ds ) 01362 { 01363 string path; 01364 bool found(false); 01365 01366 // rpnprogramstackstate().findprogram( 01367 // found,path,rpnprogramstackstate().ps->front() ); 01368 01369 deque<rpnprogram*> & ps( * rpnprogramstackstate().ps ); 01370 for ( unsigned int i=0; (i<ps.size())&&(!found); ++i ) 01371 { 01372 rpnprogramstackstate().findprogram( 01373 found,path,ps[i] ); 01374 } 01375 01376 if (!found) 01377 path = ""; 01378 01379 new rpnstring(ds,path); 01380 01381 dec(); 01382 } 01383 01384 01385 pathtoggle::pathtoggle(deque<rpnbase*>& ds, bool const evaluate) 01386 { 01387 if (evaluate) 01388 eval(ds); 01389 else 01390 ds.push_front(this); 01391 } 01392 01393 rpnbase* pathtoggle::copy() const 01394 { 01395 return new pathtoggle(); 01396 } 01397 01398 void pathtoggle::eval( deque<rpnbase*>& ds ) 01399 { 01400 if (!ds.empty()) 01401 ds[0]->accept(ds,*this); 01402 01403 dec(); 01404 } 01405 01406 void pathtoggle::visit(deque<rpnbase*>& ds,rpnstring& path) 01407 { 01408 rpnbase* x0 = ds.front(); 01409 ds.pop_front(); 01410 01411 if (path.str.empty()) 01412 { 01413 x0->dec(); 01414 return; 01415 } 01416 01417 rpnprogram* p = new rpnprogram(); 01418 01419 vector<string> v; 01420 pathstuff().convert(v,path.str); 01421 pathstuff().convert(*p,v); 01422 01423 ds.push_front(p); 01424 01425 x0->dec(); 01426 } 01427 01428 void pathtoggle::visit(deque<rpnbase*>& ds,rpnprogram& path) 01429 { 01430 rpnbase* x0 = ds.front(); 01431 01432 rpnstring* s = new rpnstring(); 01433 01434 vector<string> v; 01435 pathstuff().convert(v,path); 01436 pathstuff().convert(s->str,v); 01437 01438 ds.pop_front(); 01439 01440 ds.push_front(s); 01441 01442 x0->dec(); 01443 } 01444 01445 01446 varinc::varinc(deque<rpnbase*>& ds, bool const evaluate) 01447 { 01448 if (evaluate) 01449 eval(ds); 01450 else 01451 ds.push_front(this); 01452 } 01453 01454 rpnbase* varinc::copy() const 01455 { 01456 return new varinc(); 01457 } 01458 01459 void varinc::eval( deque<rpnbase*>& ds ) 01460 { 01461 if (!ds.empty()) 01462 ds[0]->accept(ds,*this); 01463 01464 dec(); 01465 } 01466 01467 01468 void varinc::visit(deque<rpnbase*>& ds,rpninteger& n) 01469 { 01470 n.num += 1; 01471 } 01472 01473 void varinc::visit(deque<rpnbase*>& ds,rpnreal& n) 01474 { 01475 n.num += 1; 01476 } 01477 01478 void varinc::visit(deque<rpnbase*>& ds,rpnstring& s) 01479 { 01480 rpnbase* x0 = ds.front(); 01481 ds.pop_front(); 01482 01483 bool res; 01484 unsigned int i,k; 01485 rpnvar* x; 01486 01487 rpnprogramstackstate().find(res,i,k,x,s.str); 01488 if (res) 01489 { 01490 bool foundtype(false); 01491 01492 rpnbase* w = x->x; 01493 if (w->isinteger()) 01494 { 01495 ((rpninteger*)w)->num += 1; 01496 foundtype=true; 01497 } 01498 else 01499 if (w->isreal()) 01500 { 01501 ((rpnreal*)w)->num += 1; 01502 foundtype=true; 01503 } 01504 01505 if (foundtype) 01506 { 01507 w->inc(); 01508 ds.push_front(w); 01509 } 01510 } 01511 01512 x0->dec(); 01513 } 01514 01515 vardec::vardec(deque<rpnbase*>& ds, bool const evaluate) 01516 { 01517 if (evaluate) 01518 eval(ds); 01519 else 01520 ds.push_front(this); 01521 } 01522 01523 rpnbase* vardec::copy() const 01524 { 01525 return new vardec(); 01526 } 01527 01528 void vardec::eval( deque<rpnbase*>& ds ) 01529 { 01530 if (!ds.empty()) 01531 ds[0]->accept(ds,*this); 01532 01533 dec(); 01534 } 01535 01536 void vardec::visit(deque<rpnbase*>& ds,rpninteger& n) 01537 { 01538 n.num -= 1; 01539 } 01540 01541 void vardec::visit(deque<rpnbase*>& ds,rpnreal& n) 01542 { 01543 n.num -= 1; 01544 } 01545 01546 void vardec::visit(deque<rpnbase*>& ds,rpnstring& s) 01547 { 01548 rpnbase* x0 = ds.front(); 01549 ds.pop_front(); 01550 01551 bool res; 01552 unsigned int i,k; 01553 rpnvar* x; 01554 01555 rpnprogramstackstate().find(res,i,k,x,s.str); 01556 if (res) 01557 { 01558 bool foundtype(false); 01559 01560 rpnbase* w = x->x; 01561 if (w->isinteger()) 01562 { 01563 ((rpninteger*)w)->num -= 1; 01564 foundtype=true; 01565 } 01566 else 01567 if (w->isreal()) 01568 { 01569 ((rpnreal*)w)->num -= 1; 01570 foundtype=true; 01571 } 01572 01573 if (foundtype) 01574 { 01575 w->inc(); 01576 ds.push_front(w); 01577 } 01578 } 01579 01580 x0->dec(); 01581 } 01582 01583 01584 01585 01586 varexists::varexists(deque<rpnbase*>& ds, bool const evaluate) 01587 { 01588 if (evaluate) 01589 eval(ds); 01590 else 01591 ds.push_front(this); 01592 } 01593 01594 rpnbase* varexists::copy() const 01595 { 01596 return new varexists(); 01597 } 01598 01599 void varexists::eval( deque<rpnbase*>& ds ) 01600 { 01601 if (!ds.empty()) 01602 ds[0]->accept(ds,*this); 01603 01604 dec(); 01605 } 01606 01607 void varexists::visit(deque<rpnbase*>& ds,rpnstring& s) 01608 { 01609 bool res; 01610 rpnprogramstackstate().exists(res,s.str); 01611 new rpninteger(ds,res); 01612 } 01613 01614 01615 varreplace::varreplace(deque<rpnbase*>& ds, bool const evaluate) 01616 { 01617 if (evaluate) 01618 eval(ds); 01619 else 01620 ds.push_front(this); 01621 } 01622 01623 rpnbase* varreplace::copy() const 01624 { 01625 return new varreplace(); 01626 } 01627 01628 void varreplace::eval( deque<rpnbase*>& ds ) 01629 { 01630 if (ds.size()>1) 01631 ds[0]->accept(ds,*this); 01632 01633 dec(); 01634 } 01635 01636 void varreplace::visit(deque<rpnbase*>& ds,rpnstring& s) 01637 { 01638 rpnbase* x0 = ds.front(); 01639 ds.pop_front(); 01640 rpnbase* x1 = ds.front(); 01641 ds.pop_front(); 01642 01643 rpnprogramstackstate().replace(x1,s.str); 01644 01645 x0->dec(); 01646 } 01647 01648 void varreplace::visit(deque<rpnbase*>& ds,rpninteger& k) 01649 { 01650 if (ds.size()<=3) 01651 return; 01652 01653 rpnbase* x0 = ds.front(); 01654 ds.pop_front(); 01655 rpnbase* x1 = ds.front(); 01656 ds.pop_front(); 01657 01658 bool restore(false); 01659 01660 int const sz = ds.size(); 01661 01662 int a; 01663 int b = k.num; 01664 if (! x1->isinteger() ) 01665 restore=true; 01666 else 01667 { 01668 a = ((rpninteger*)x1)->num; 01669 if ( (a<0) || (b<0) || (a>=sz) || (b>=sz) || (a==b) ) 01670 restore=true; 01671 } 01672 01673 if (restore) 01674 { 01675 ds.push_front(x1); 01676 ds.push_front(x0); 01677 return; 01678 } 01679 01680 x0->dec(); 01681 x1->dec(); 01682 01683 ds[a]->dec(); 01684 ds[a]=ds[b]; 01685 ds[b]->inc(); 01686 } 01687 01688 01689 varrecall::varrecall(deque<rpnbase*>& ds, bool const evaluate) 01690 { 01691 if (evaluate) 01692 eval(ds); 01693 else 01694 ds.push_front(this); 01695 } 01696 01697 rpnbase* varrecall::copy() const 01698 { 01699 return new varrecall(); 01700 } 01701 01702 void varrecall::eval( deque<rpnbase*>& ds ) 01703 { 01704 if (!ds.empty()) 01705 ds[0]->accept(ds,*this); 01706 01707 dec(); 01708 } 01709 01710 void varrecall::visit(deque<rpnbase*>& ds,rpnstring& s) 01711 { 01712 rpnbase* x0 = ds.front(); 01713 ds.pop_front(); 01714 01715 rpnprogramstackstate().recall(ds,s.str); 01716 01717 x0->dec(); 01718 } 01719 01720 void varrecall::visit(deque<rpnbase*>& ds,rpninteger& n) 01721 { 01722 rpnbase* x0 = ds.front(); 01723 ds.pop_front(); 01724 01725 if (n.num>=0) 01726 { 01727 unsigned int const n2 = (unsigned int)(n.num); 01728 if (n2<ds.size()) 01729 ds.push_front( ds[n.num]->copy() ); 01730 } 01731 01732 x0->dec(); 01733 } 01734 01735 01736 rpnadd::rpnadd(deque<rpnbase*>& ds, bool const evaluate) 01737 { 01738 if (evaluate) 01739 eval(ds); 01740 else 01741 ds.push_front(this); 01742 } 01743 01744 rpnbase* rpnadd::copy() const 01745 { 01746 return new rpnadd(); 01747 } 01748 01749 void rpnadd::eval( deque<rpnbase*>& ds ) 01750 { 01751 if (ds.size()>1) 01752 ds[0]->accept(ds,*this); 01753 01754 dec(); 01755 } 01756 01757 void rpnadd::visit(deque<rpnbase*>& ds,rpncomplex& n) 01758 { 01759 rpnbase* x0 = ds.front(); 01760 ds.pop_front(); 01761 01762 rpnbase* x1 = ds.front(); 01763 if (x1->iscomplex()) 01764 { 01765 ((rpncomplex*)(x1))->num += n.num; 01766 x0->dec(); 01767 return; 01768 } 01769 else if (x1->isreal()) 01770 { 01771 ds.pop_front(); 01772 ds.push_front(x0); 01773 n.num += ((rpnreal*)x1)->num; 01774 x1->dec(); 01775 return; 01776 } 01777 else if (x1->isinteger()) 01778 { 01779 ds.pop_front(); 01780 ds.push_front(x0); 01781 n.num += ((rpninteger*)x1)->num; 01782 x1->dec(); 01783 return; 01784 } 01785 01786 //Restor the stack. 01787 ds.push_front(x0); 01788 } 01789 01790 void rpnadd::visit(deque<rpnbase*>& ds,rpnreal& n) 01791 { 01792 rpnbase* x0 = ds.front(); 01793 ds.pop_front(); 01794 01795 rpnbase* x1 = ds.front(); 01796 if (x1->isreal()) 01797 { 01798 ((rpnreal*)(x1))->num += n.num; 01799 x0->dec(); 01800 return; 01801 } 01802 else if (x1->iscomplex()) 01803 { 01804 ((rpncomplex*)(x1))->num += n.num; 01805 x0->dec(); 01806 return; 01807 } 01808 else if (x1->isinteger()) 01809 { 01810 ds.pop_front(); 01811 n.num += ((rpninteger*)x1)->num; 01812 ds.push_front(x0); 01813 x1->dec(); 01814 return; 01815 } 01816 01817 // Restore the stack. 01818 ds.push_front(x0); 01819 } 01820 01821 void rpnadd::visit(deque<rpnbase*>& ds,rpninteger& n) 01822 { 01823 rpninteger* x0 = (rpninteger*)(ds.front()); 01824 ds.pop_front(); 01825 01826 rpnbase* x1 = ds.front(); 01827 if (x1->isinteger()) 01828 { 01829 ((rpninteger*)(x1))->num += n.num; 01830 x0->dec(); 01831 return; 01832 } 01833 else if (x1->isreal()) 01834 { 01835 ((rpnreal*)(x1))->num += n.num; 01836 x0->dec(); 01837 return; 01838 } 01839 else if (x1->iscomplex()) 01840 { 01841 ((rpncomplex*)(x1))->num += n.num; 01842 x0->dec(); 01843 return; 01844 } 01845 01846 // Restor the stack. 01847 ds.push_front(x0); 01848 } 01849 01850 01851 rpnmultiply::rpnmultiply(deque<rpnbase*>& ds, bool const evaluate) 01852 { 01853 if (evaluate) 01854 eval(ds); 01855 else 01856 ds.push_front(this); 01857 } 01858 01859 rpnbase* rpnmultiply::copy() const 01860 { 01861 return new rpnmultiply(); 01862 } 01863 01864 void rpnmultiply::eval( deque<rpnbase*>& ds ) 01865 { 01866 if (ds.size()>1) 01867 ds[0]->accept(ds,*this); 01868 01869 dec(); 01870 } 01871 01872 void rpnmultiply::visit(deque<rpnbase*>& ds,rpnreal& n) 01873 { 01874 rpnbase* x0 = ds.front(); 01875 ds.pop_front(); 01876 01877 rpnbase* x1 = ds.front(); 01878 if (x1->isreal()) 01879 { 01880 ((rpnreal*)(x1))->num *= n.num; 01881 x0->dec(); 01882 return; 01883 } 01884 else if (x1->iscomplex()) 01885 { 01886 ((rpncomplex*)(x1))->num *= n.num; 01887 x0->dec(); 01888 return; 01889 } 01890 else if (x1->isinteger()) 01891 { 01892 ds.pop_front(); 01893 n.num *= ((rpninteger*)x1)->num; 01894 ds.push_front(x0); 01895 x1->dec(); 01896 return; 01897 } 01898 01899 // Restore the stack. 01900 ds.push_front(x0); 01901 } 01902 01903 void rpnmultiply::visit(deque<rpnbase*>& ds,rpninteger& n) 01904 { 01905 rpninteger* x0 = (rpninteger*)(ds.front()); 01906 ds.pop_front(); 01907 01908 rpnbase* x1 = ds.front(); 01909 if (x1->isinteger()) 01910 { 01911 ((rpninteger*)(x1))->num *= n.num; 01912 x0->dec(); 01913 return; 01914 } 01915 else if (x1->isreal()) 01916 { 01917 ((rpnreal*)(x1))->num *= n.num; 01918 x0->dec(); 01919 return; 01920 } 01921 else if (x1->iscomplex()) 01922 { 01923 ((rpncomplex*)(x1))->num *= n.num; 01924 x0->dec(); 01925 return; 01926 } 01927 01928 // Restor the stack. 01929 ds.push_front(x0); 01930 } 01931 01932 void rpnmultiply::visit(deque<rpnbase*>& ds,rpncomplex& n) 01933 { 01934 rpnbase* x0 = ds.front(); 01935 ds.pop_front(); 01936 01937 rpnbase* x1 = ds.front(); 01938 if (x1->iscomplex()) 01939 { 01940 ((rpncomplex*)(x1))->num *= n.num; 01941 x0->dec(); 01942 return; 01943 } 01944 else if (x1->isreal()) 01945 { 01946 ds.pop_front(); 01947 ds.push_front(x0); 01948 n.num *= ((rpnreal*)x1)->num; 01949 x1->dec(); 01950 return; 01951 } 01952 else if (x1->isinteger()) 01953 { 01954 ds.pop_front(); 01955 ds.push_front(x0); 01956 n.num *= ((rpninteger*)x1)->num; 01957 x1->dec(); 01958 return; 01959 } 01960 01961 //Restor the stack. 01962 ds.push_front(x0); 01963 } 01964 01965 01966 01967 rpnlessthan::rpnlessthan(deque<rpnbase*>& ds, bool const evaluate) 01968 { 01969 if (evaluate) 01970 eval(ds); 01971 else 01972 ds.push_front(this); 01973 } 01974 01975 rpnbase* rpnlessthan::copy() const 01976 { 01977 return new rpnlessthan(); 01978 } 01979 01980 void rpnlessthan::eval( deque<rpnbase*>& ds ) 01981 { 01982 if (ds.size()>1) 01983 ds[0]->accept(ds,*this); 01984 01985 dec(); 01986 } 01987 01988 void rpnlessthan::visit(deque<rpnbase*>& ds,rpnreal& n) 01989 { 01990 rpnbase* x0 = ds.front(); 01991 ds.pop_front(); 01992 rpnbase* x1 = ds.front(); 01993 ds.pop_front(); 01994 01995 if ( x1->isinteger()) 01996 { 01997 new rpninteger(ds, ((rpninteger*)x1)->num < n.num ); 01998 } 01999 else 02000 if (x1->isreal()) 02001 { 02002 new rpninteger(ds, ((rpnreal*)x1)->num < n.num ); 02003 } 02004 02005 x0->dec(); 02006 x1->dec(); 02007 } 02008 02009 void rpnlessthan::visit(deque<rpnbase*>& ds,rpninteger& n) 02010 { 02011 rpnbase* x0 = ds.front(); 02012 ds.pop_front(); 02013 rpnbase* x1 = ds.front(); 02014 ds.pop_front(); 02015 02016 if ( x1->isreal()) 02017 { 02018 new rpninteger(ds, ((rpnreal*)x1)->num < n.num ); 02019 } 02020 else 02021 if ( x1->isinteger()) 02022 { 02023 new rpninteger(ds, ((rpninteger*)x1)->num < n.num ); 02024 } 02025 02026 x0->dec(); 02027 x1->dec(); 02028 } 02029 02030 02031 rpnlessthanequal::rpnlessthanequal(deque<rpnbase*>& ds, bool const evaluate) 02032 { 02033 if (evaluate) 02034 eval(ds); 02035 else 02036 ds.push_front(this); 02037 } 02038 02039 rpnbase* rpnlessthanequal::copy() const 02040 { 02041 return new rpnlessthanequal(); 02042 } 02043 02044 void rpnlessthanequal::eval( deque<rpnbase*>& ds ) 02045 { 02046 if (ds.size()>1) 02047 ds[0]->accept(ds,*this); 02048 02049 dec(); 02050 } 02051 02052 void rpnlessthanequal::visit(deque<rpnbase*>& ds,rpnreal& n) 02053 { 02054 rpnbase* x0 = ds.front(); 02055 ds.pop_front(); 02056 rpnbase* x1 = ds.front(); 02057 ds.pop_front(); 02058 02059 if ( x1->isinteger()) 02060 { 02061 new rpninteger(ds, ((rpninteger*)x1)->num <= n.num ); 02062 } 02063 else 02064 if (x1->isreal()) 02065 { 02066 new rpninteger(ds, ((rpnreal*)x1)->num <= n.num ); 02067 } 02068 02069 x0->dec(); 02070 x1->dec(); 02071 } 02072 02073 void rpnlessthanequal::visit(deque<rpnbase*>& ds,rpninteger& n) 02074 { 02075 rpnbase* x0 = ds.front(); 02076 ds.pop_front(); 02077 rpnbase* x1 = ds.front(); 02078 ds.pop_front(); 02079 02080 if ( x1->isreal()) 02081 { 02082 new rpninteger(ds, ((rpnreal*)x1)->num <= n.num ); 02083 } 02084 else 02085 if ( x1->isinteger()) 02086 { 02087 new rpninteger(ds, ((rpninteger*)x1)->num <= n.num ); 02088 } 02089 02090 x0->dec(); 02091 x1->dec(); 02092 } 02093 02094 02095 rpngreaterthanequal::rpngreaterthanequal(deque<rpnbase*>& ds, bool const evaluate) 02096 { 02097 if (evaluate) 02098 eval(ds); 02099 else 02100 ds.push_front(this); 02101 } 02102 02103 rpnbase* rpngreaterthanequal::copy() const 02104 { 02105 return new rpngreaterthanequal(); 02106 } 02107 02108 void rpngreaterthanequal::eval( deque<rpnbase*>& ds ) 02109 { 02110 if (ds.size()>1) 02111 ds[0]->accept(ds,*this); 02112 02113 dec(); 02114 } 02115 02116 void rpngreaterthanequal::visit(deque<rpnbase*>& ds,rpnreal& n) 02117 { 02118 rpnbase* x0 = ds.front(); 02119 ds.pop_front(); 02120 rpnbase* x1 = ds.front(); 02121 ds.pop_front(); 02122 02123 if ( x1->isinteger()) 02124 { 02125 new rpninteger(ds, ((rpninteger*)x1)->num >= n.num ); 02126 } 02127 else 02128 if (x1->isreal()) 02129 { 02130 new rpninteger(ds, ((rpnreal*)x1)->num >= n.num ); 02131 } 02132 02133 x0->dec(); 02134 x1->dec(); 02135 } 02136 02137 void rpngreaterthanequal::visit(deque<rpnbase*>& ds,rpninteger& n) 02138 { 02139 rpnbase* x0 = ds.front(); 02140 ds.pop_front(); 02141 rpnbase* x1 = ds.front(); 02142 ds.pop_front(); 02143 02144 if ( x1->isreal()) 02145 { 02146 new rpninteger(ds, ((rpnreal*)x1)->num >= n.num ); 02147 } 02148 else 02149 if ( x1->isinteger()) 02150 { 02151 new rpninteger(ds, ((rpninteger*)x1)->num >= n.num ); 02152 } 02153 02154 x0->dec(); 02155 x1->dec(); 02156 } 02157 02158 02159 rpngreaterthan::rpngreaterthan(deque<rpnbase*>& ds, bool const evaluate) 02160 { 02161 if (evaluate) 02162 eval(ds); 02163 else 02164 ds.push_front(this); 02165 } 02166 02167 rpnbase* rpngreaterthan::copy() const 02168 { 02169 return new rpngreaterthan(); 02170 } 02171 02172 void rpngreaterthan::eval( deque<rpnbase*>& ds ) 02173 { 02174 if (ds.size()>1) 02175 ds[0]->accept(ds,*this); 02176 02177 dec(); 02178 } 02179 02180 void rpngreaterthan::visit(deque<rpnbase*>& ds,rpnreal& n) 02181 { 02182 rpnbase* x0 = ds.front(); 02183 ds.pop_front(); 02184 rpnbase* x1 = ds.front(); 02185 ds.pop_front(); 02186 02187 if ( x1->isinteger()) 02188 { 02189 new rpninteger(ds, ((rpninteger*)x1)->num > n.num ); 02190 } 02191 else 02192 if (x1->isreal()) 02193 { 02194 new rpninteger(ds, ((rpnreal*)x1)->num > n.num ); 02195 } 02196 02197 x0->dec(); 02198 x1->dec(); 02199 } 02200 02201 void rpngreaterthan::visit(deque<rpnbase*>& ds,rpninteger& n) 02202 { 02203 rpnbase* x0 = ds.front(); 02204 ds.pop_front(); 02205 rpnbase* x1 = ds.front(); 02206 ds.pop_front(); 02207 02208 if ( x1->isreal()) 02209 { 02210 new rpninteger(ds, ((rpnreal*)x1)->num > n.num ); 02211 } 02212 else 02213 if ( x1->isinteger()) 02214 { 02215 new rpninteger(ds, ((rpninteger*)x1)->num > n.num ); 02216 } 02217 02218 x0->dec(); 02219 x1->dec(); 02220 } 02221 02222 02223 rpnequal::rpnequal(deque<rpnbase*>& ds, bool const evaluate) 02224 { 02225 if (evaluate) 02226 eval(ds); 02227 else 02228 ds.push_front(this); 02229 } 02230 02231 rpnbase* rpnequal::copy() const 02232 { 02233 return new rpnequal(); 02234 } 02235 02236 void rpnequal::eval( deque<rpnbase*>& ds ) 02237 { 02238 if (ds.size()>1) 02239 ds[0]->accept(ds,*this); 02240 02241 dec(); 02242 } 02243 02244 void rpnequal::visit(deque<rpnbase*>& ds,rpnreal& n) 02245 { 02246 rpnbase* x0 = ds.front(); 02247 ds.pop_front(); 02248 rpnbase* x1 = ds.front(); 02249 ds.pop_front(); 02250 02251 if ( x1->isinteger()) 02252 { 02253 new rpninteger(ds, ((rpninteger*)x1)->num == n.num ); 02254 } 02255 else 02256 if (x1->isreal()) 02257 { 02258 new rpninteger(ds, ((rpnreal*)x1)->num == n.num ); 02259 } 02260 02261 x0->dec(); 02262 x1->dec(); 02263 } 02264 02265 void rpnequal::visit(deque<rpnbase*>& ds,rpninteger& n) 02266 { 02267 rpnbase* x0 = ds.front(); 02268 ds.pop_front(); 02269 rpnbase* x1 = ds.front(); 02270 ds.pop_front(); 02271 02272 if ( x1->isreal()) 02273 { 02274 new rpninteger(ds, ((rpnreal*)x1)->num == n.num ); 02275 } 02276 else 02277 if ( x1->isinteger()) 02278 { 02279 new rpninteger(ds, ((rpninteger*)x1)->num == n.num ); 02280 } 02281 02282 x0->dec(); 02283 x1->dec(); 02284 } 02285 02286 02287 rpnfor::rpnfor(deque<rpnbase*>& ds, bool const evaluate) 02288 { 02289 if (evaluate) 02290 eval(ds); 02291 else 02292 ds.push_front(this); 02293 } 02294 02295 rpnbase* rpnfor::copy() const 02296 { 02297 return new rpnfor(); 02298 } 02299 02300 void rpnfor::eval( deque<rpnbase*>& ds ) 02301 { 02302 if (ds.size()>1) 02303 ds[0]->accept(ds,*this); 02304 02305 dec(); 02306 } 02307 02308 02309 /* 02310 02311 Weird for loop crap 02312 02313 02314 02315 if ( x1->isprogram()) 02316 { 02317 02318 bool flag; 02319 rpnbase* x3; 02320 02321 for ( ; flag; ) 02322 { 02323 x0->copy()->eval(ds); 02324 x1->copy()->eval(ds); 02325 x3 = ds.front(); 02326 ds.pop_front(); 02327 if (x3->isinteger()) 02328 { 02329 flag=((rpninteger*)x3)->num; 02330 x3->dec(); 02331 } 02332 else 02333 { 02334 new rpnstring(ds,"error in for: test needs to return integer."); 02335 break; 02336 } 02337 } 02338 02339 02340 02341 02342 */ 02343 02344 02345 02346 02347 02348 02349 void rpnfor::visit(deque<rpnbase*>& ds,rpnprogram& n) 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 } 02428 02429 02430 02431 02432 rpnforn::rpnforn(deque<rpnbase*>& ds, bool const evaluate) 02433 { 02434 if (evaluate) 02435 eval(ds); 02436 else 02437 ds.push_front(this); 02438 } 02439 02440 rpnbase* rpnforn::copy() const 02441 { 02442 return new rpnforn(); 02443 } 02444 02445 void rpnforn::eval( deque<rpnbase*>& ds ) 02446 { 02447 if (ds.size()>1) 02448 ds[0]->accept(ds,*this); 02449 02450 dec(); 02451 } 02452 02453 void rpnforn::visit(deque<rpnbase*>& ds,rpninteger& n) 02454 { 02455 rpnbase* x0 = ds.front(); 02456 ds.pop_front(); 02457 rpnbase* x1 = ds.front(); 02458 ds.pop_front(); 02459 02460 long int num = n.num; 02461 if (num<=0) 02462 return; 02463 02464 if ( ! x1->isprogram() ) 02465 { 02466 ds.push_front(x1); 02467 ds.push_front(x0); 02468 02469 return; 02470 } 02471 02472 for (long int i=0; i<num; ++i) 02473 { 02474 new rpninteger(ds,i); 02475 x1->copy()->eval(ds); 02476 } 02477 02478 x0->dec(); 02479 x1->dec(); 02480 } 02481 02482 void rpnforn::visit(deque<rpnbase*>& ds,rpnprogram& n) 02483 { 02484 rpnbase* x0 = ds.front(); // body 02485 ds.pop_front(); 02486 rpnbase* x1 = ds.front(); // test 02487 ds.pop_front(); 02488 02489 if ( ! x1->isinteger() ) 02490 { 02491 ds.push_front(x1); 02492 ds.push_front(x0); 02493 02494 return; 02495 } 02496 02497 long int num = ((rpninteger*)x1)->num; 02498 if (num<=0) 02499 { 02500 ds.push_front(x1); 02501 ds.push_front(x0); 02502 02503 return; 02504 } 02505 02506 for (long int i=0; i<num; ++i) 02507 { 02508 new rpninteger(ds,i); 02509 x1->copy()->eval(ds); 02510 } 02511 02512 x0->dec(); 02513 x1->dec(); 02514 } 02515 02516 02517 02518 02519 02520 prognew::prognew(deque<rpnbase*>& ds, bool const evaluate) 02521 { 02522 if (evaluate) 02523 eval(ds); 02524 else 02525 ds.push_front(this); 02526 } 02527 02528 rpnbase* prognew::copy() const 02529 { 02530 return new prognew(); 02531 } 02532 02533 void prognew::eval( deque<rpnbase*>& ds ) 02534 { 02535 if(!ds.empty()) 02536 ds[0]->accept(ds,*this); 02537 02538 dec(); 02539 } 02540 02541 void prognew::visit(deque<rpnbase*>& ds,rpninteger& n) 02542 { 02543 rpnbase* x0 = ds.front(); 02544 ds.pop_front(); 02545 02546 if ( (n.num<0) || ((unsigned int) n.num > ds.size()) ) 02547 { 02548 ds.push_front(x0); 02549 return; 02550 } 02551 02552 rpnprogram* xp = new rpnprogram(); 02553 02554 if (n.num != 0) 02555 { 02556 for (unsigned int i=0, imax=n.num; i<imax; ++i) 02557 { 02558 xp->v.push_front(ds.front()); 02559 ds.pop_front(); 02560 } 02561 } 02562 02563 ds.push_front(xp); 02564 02565 x0->dec(); 02566 } 02567 02568 02569 progdecompose::progdecompose(deque<rpnbase*>& ds, bool const evaluate) 02570 { 02571 if (evaluate) 02572 eval(ds); 02573 else 02574 ds.push_front(this); 02575 } 02576 02577 rpnbase* progdecompose::copy() const 02578 { 02579 return new progdecompose(); 02580 } 02581 02582 void progdecompose::eval( deque<rpnbase*>& ds ) 02583 { 02584 if(!ds.empty()) 02585 ds[0]->accept(ds,*this); 02586 02587 dec(); 02588 } 02589 02590 void progdecompose::visit(deque<rpnbase*>& ds,rpnprogram& p) 02591 { 02592 rpnbase* x0 = ds.front(); 02593 ds.pop_front(); 02594 02595 unsigned int n = p.v.size(); 02596 02597 if (n>0) 02598 { 02599 for (unsigned int i=0; i<n; ++i) 02600 { 02601 ds.push_front( p.v.front() ); 02602 p.v.pop_front(); 02603 } 02604 } 02605 02606 new rpninteger(ds,n); 02607 02608 x0->dec(); 02609 } 02610 02611 02612 02613 02614 02615 02616 progrev::progrev(deque<rpnbase*>& ds, bool const evaluate) 02617 { 02618 if (evaluate) 02619 eval(ds); 02620 else 02621 ds.push_front(this); 02622 } 02623 02624 rpnbase* progrev::copy() const 02625 { 02626 return new progrev(); 02627 } 02628 02629 void progrev::eval( deque<rpnbase*>& ds ) 02630 { 02631 if(!ds.empty()) 02632 ds[0]->accept(ds,*this); 02633 02634 dec(); 02635 } 02636 02637 void progrev::visit(deque<rpnbase*>& ds,rpnprogram& pr) 02638 { 02639 reverse(pr.v.begin(),pr.v.end()); 02640 } 02641 02642 02643 rpnsubtract::rpnsubtract(deque<rpnbase*>& ds, bool const evaluate) 02644 { 02645 if (evaluate) 02646 eval(ds); 02647 else 02648 ds.push_front(this); 02649 } 02650 02651 rpnbase* rpnsubtract::copy() const 02652 { 02653 return new rpnsubtract(); 02654 } 02655 02656 void rpnsubtract::eval( deque<rpnbase*>& ds ) 02657 { 02658 if (ds.size()>1) 02659 ds[0]->accept(ds,*this); 02660 02661 dec(); 02662 } 02663 02664 void rpnsubtract::visit(deque<rpnbase*>& ds,rpncomplex& n) 02665 { 02666 rpnbase* x0 = ds.front(); 02667 ds.pop_front(); 02668 rpnbase* x1 = ds.front(); 02669 ds.pop_front(); 02670 02671 if (x1->iscomplex()) 02672 { 02673 ((rpncomplex*)x1)->num -= n.num; 02674 ds.push_front(x1); 02675 x0->dec(); 02676 return; 02677 } 02678 else 02679 if (x1->isreal()) 02680 { 02681 n.num *= -1; 02682 n.num += ((rpnreal*)x1)->num; 02683 ds.push_front(x0); 02684 x1->dec(); 02685 return; 02686 } 02687 else 02688 if (x1->isinteger()) 02689 { 02690 n.num *= -1; 02691 n.num += ((rpninteger*)x1)->num; 02692 ds.push_front(x0); 02693 x1->dec(); 02694 return; 02695 } 02696 02697 // Error so restore stack 02698 ds.push_front(x1); 02699 ds.push_front(x0); 02700 } 02701 02702 void rpnsubtract::visit(deque<rpnbase*>& ds,rpnreal& n) 02703 { 02704 rpnbase* x0 = ds.front(); 02705 ds.pop_front(); 02706 rpnbase* x1 = ds.front(); 02707 ds.pop_front(); 02708 02709 if (x1->isreal()) 02710 { 02711 ((rpnreal*)x1)->num -= n.num; 02712 ds.push_front(x1); 02713 x0->dec(); 02714 return; 02715 } 02716 else 02717 if (x1->iscomplex()) 02718 { 02719 ((rpncomplex*)x1)->num -= n.num; 02720 ds.push_front(x1); 02721 x0->dec(); 02722 return; 02723 } 02724 else 02725 if ( x1->isinteger()) 02726 { 02727 n.num *= -1; 02728 n.num += ((rpninteger*)x1)->num; 02729 ds.push_front(x0); 02730 x1->dec(); 02731 return; 02732 } 02733 02734 // Error so restore stack 02735 ds.push_front(x1); 02736 ds.push_front(x0); 02737 } 02738 02739 void rpnsubtract::visit(deque<rpnbase*>& ds,rpninteger& n) 02740 { 02741 rpnbase* x0 = ds.front(); 02742 ds.pop_front(); 02743 rpnbase* x1 = ds.front(); 02744 02745 if ( x1->isreal() ) 02746 { 02747 ((rpnreal*)x1)->num -= n.num; 02748 x0->dec(); 02749 return; 02750 } 02751 else 02752 if ( x1->isinteger() ) 02753 { 02754 ((rpninteger*)x1)->num -= n.num; 02755 x0->dec(); 02756 return; 02757 } 02758 else 02759 if ( x1->iscomplex() ) 02760 { 02761 ((rpncomplex*)x1)->num -= n.num; 02762 x0->dec(); 02763 return; 02764 } 02765 02766 // Restore the stack. 02767 ds.push_front(x0); 02768 } 02769 02770 02771 rpndivide::rpndivide(deque<rpnbase*>& ds, bool const evaluate) 02772 { 02773 if (evaluate) 02774 eval(ds); 02775 else 02776 ds.push_front(this); 02777 } 02778 02779 rpnbase* rpndivide::copy() const 02780 { 02781 return new rpndivide(); 02782 } 02783 02784 void rpndivide::eval( deque<rpnbase*>& ds ) 02785 { 02786 if (ds.size()>1) 02787 ds[0]->accept(ds,*this); 02788 02789 dec(); 02790 } 02791 02792 void rpndivide::visit(deque<rpnbase*>& ds,rpnreal& n) 02793 { 02794 rpnbase* x0 = ds.front(); 02795 ds.pop_front(); 02796 rpnbase* x1 = ds.front(); 02797 ds.pop_front(); 02798 02799 if (x1->isreal()) 02800 { 02801 ((rpnreal*)x1)->num /= n.num; 02802 ds.push_front(x1); 02803 x0->dec(); 02804 return; 02805 } 02806 else 02807 if (x1->iscomplex()) 02808 { 02809 ((rpncomplex*)x1)->num /= n.num; 02810 ds.push_front(x1); 02811 x0->dec(); 02812 return; 02813 } 02814 else 02815 if ( x1->isinteger()) 02816 { 02817 new rpnreal(ds,((rpninteger*)x1)->num / n.num); 02818 x0->dec(); 02819 x1->dec(); 02820 return; 02821 } 02822 02823 // Error so restore stack 02824 ds.push_front(x1); 02825 ds.push_front(x0); 02826 } 02827 02828 void rpndivide::visit(deque<rpnbase*>& ds,rpninteger& n) 02829 { 02830 rpnbase* x0 = ds.front(); 02831 ds.pop_front(); 02832 rpnbase* x1 = ds.front(); 02833 02834 if ( x1->isinteger() ) 02835 { 02836 if ( ((rpninteger*)x1)->num % n.num == 0 ) 02837 { 02838 ((rpninteger*)x1)->num /= n.num; 02839 x0->dec(); 02840 return; 02841 } 02842 else 02843 { 02844 long double w = ((rpninteger*)x1)->num; 02845 ds.pop_front(); 02846 new rpnreal(ds,w/n.num); 02847 02848 x0->dec(); 02849 x1->dec(); 02850 return; 02851 } 02852 } 02853 else 02854 if ( x1->isreal()) 02855 { 02856 ((rpnreal*)x1)->num /= n.num; 02857 x0->dec(); 02858 return; 02859 } 02860 else 02861 if ( x1->iscomplex()) 02862 { 02863 ((rpncomplex*)x1)->num /= n.num; 02864 x0->dec(); 02865 return; 02866 } 02867 02868 // Restore the stack. 02869 ds.push_front(x0); 02870 } 02871 02872 void rpndivide::visit(deque<rpnbase*>& ds,rpncomplex& n) 02873 { 02874 rpnbase* x0 = ds.front(); 02875 ds.pop_front(); 02876 rpnbase* x1 = ds.front(); 02877 02878 if ( x1->iscomplex()) 02879 { 02880 ((rpncomplex*)x1)->num /= n.num; 02881 x0->dec(); 02882 return; 02883 } 02884 else 02885 if ( x1->isreal()) 02886 { 02887 n.num = ((rpnreal*)x1)->num / n.num; 02888 ds.pop_front(); 02889 ds.push_front(x0); 02890 x1->dec(); 02891 return; 02892 } 02893 else 02894 if ( x1->isinteger()) 02895 { 02896 02897 n.num = complex<long double>(1.0,0.0) / n.num; 02898 n.num *= ((rpninteger*)x1)->num; 02899 ds.pop_front(); 02900 ds.push_front(x0); 02901 x1->dec(); 02902 return; 02903 } 02904 02905 // Restore the stack. 02906 ds.push_front(x0); 02907 } 02908 02909 02910 02911 02912 02913 02914 isrpnstring::isrpnstring(deque<rpnbase*>& ds, bool const evaluate) 02915 { 02916 if (evaluate) 02917 eval(ds); 02918 else 02919 ds.push_front(this); 02920 } 02921 02922 rpnbase* isrpnstring::copy() const 02923 { 02924 return new isrpnstring(); 02925 } 02926 02927 void isrpnstring::eval( deque<rpnbase*>& ds ) 02928 { 02929 if(ds.empty()) 02930 return; 02931 02932 ds[0]->accept(ds,*this); 02933 02934 rpninteger* res = new rpninteger(); 02935 res->num = 0; 02936 02937 if( ds[0]->isstring() ) 02938 res->num = 1; 02939 02940 ds.push_front(res); 02941 02942 dec(); 02943 } 02944 02945 02946 isrpninteger::isrpninteger(deque<rpnbase*>& ds, bool const evaluate) 02947 { 02948 if (evaluate) 02949 eval(ds); 02950 else 02951 ds.push_front(this); 02952 } 02953 02954 rpnbase* isrpninteger::copy() const 02955 { 02956 return new isrpninteger(); 02957 } 02958 02959 void isrpninteger::eval( deque<rpnbase*>& ds ) 02960 { 02961 if(ds.empty()) 02962 return; 02963 02964 ds[0]->accept(ds,*this); 02965 02966 rpninteger* res = new rpninteger(); 02967 res->num = 0; 02968 02969 if( ds[0]->isinteger() ) 02970 res->num = 1; 02971 02972 ds.push_front(res); 02973 02974 dec(); 02975 } 02976 02977 02978 isrpnreal::isrpnreal(deque<rpnbase*>& ds, bool const evaluate) 02979 { 02980 if (evaluate) 02981 eval(ds); 02982 else 02983 ds.push_front(this); 02984 } 02985 02986 rpnbase* isrpnreal::copy() const 02987 { 02988 return new isrpnreal(); 02989 } 02990 02991 void isrpnreal::eval( deque<rpnbase*>& ds ) 02992 { 02993 if(ds.empty()) 02994 return; 02995 02996 ds[0]->accept(ds,*this); 02997 02998 rpninteger* res = new rpninteger(); 02999 res->num = 0; 03000 03001 if( ds[0]->isreal() ) 03002 res->num = 1; 03003 03004 ds.push_front(res); 03005 03006 dec(); 03007 } 03008 03009 03010 03011 03012 isrpncomplex::isrpncomplex(deque<rpnbase*>& ds, bool const evaluate) 03013 { 03014 if (evaluate) 03015 eval(ds); 03016 else 03017 ds.push_front(this); 03018 } 03019 03020 rpnbase* isrpncomplex::copy() const 03021 { 03022 return new isrpncomplex(); 03023 } 03024 03025 void isrpncomplex::eval( deque<rpnbase*>& ds ) 03026 { 03027 if(ds.empty()) 03028 return; 03029 03030 ds[0]->accept(ds,*this); 03031 03032 rpninteger* res = new rpninteger(); 03033 res->num = 0; 03034 03035 if( ds[0]->iscomplex() ) 03036 res->num = 1; 03037 03038 ds.push_front(res); 03039 03040 dec(); 03041 } 03042 03043 03044 03045 03046 03047 isrpnprogram::isrpnprogram(deque<rpnbase*>& ds, bool const evaluate) 03048 { 03049 if (evaluate) 03050 eval(ds); 03051 else 03052 ds.push_front(this); 03053 } 03054 03055 rpnbase* isrpnprogram::copy() const 03056 { 03057 return new isrpnprogram(); 03058 } 03059 03060 void isrpnprogram::eval( deque<rpnbase*>& ds ) 03061 { 03062 if(ds.empty()) 03063 return; 03064 03065 ds[0]->accept(ds,*this); 03066 03067 rpninteger* res = new rpninteger(); 03068 res->num = 0; 03069 03070 if( ds[0]->isprogram() ) 03071 res->num = 1; 03072 03073 ds.push_front(res); 03074 03075 dec(); 03076 } 03077 03078 03079 03080 03081 03082 pathcd::pathcd(deque<rpnbase*>& ds, bool const evaluate) 03083 { 03084 if (evaluate) 03085 eval(ds); 03086 else 03087 ds.push_front(this); 03088 } 03089 03090 rpnbase* pathcd::copy() const 03091 { 03092 return new pathcd(); 03093 } 03094 03095 void pathcd::eval( deque<rpnbase*>& ds ) 03096 { 03097 if (!ds.empty()) 03098 ds[0]->accept(ds,*this); 03099 03100 dec(); 03101 } 03102 03103 void pathcd::visit(deque<rpnbase*>& ds,rpnstring& s) 03104 { 03105 rpnbase* x0 = ds.front(); 03106 ds.pop_front(); 03107 03108 bool found; 03109 deque<rpnprogram*> programlist; 03110 vector<string> v; 03111 pathstuff().convert(v,s.str); 03112 03113 pathstuff().findpath(found,programlist,v); 03114 03115 if (found) 03116 { 03117 rpnprogramstackstate().ps->clear(); 03118 if (!programlist.empty()) 03119 { 03120 for (unsigned int i=0, imax=programlist.size(); i<imax; ++i) 03121 rpnprogramstackstate().push(programlist[i]); 03122 } 03123 03124 x0->dec(); 03125 } 03126 else 03127 ds.push_front(x0); // Restore the stack. 03128 } 03129 03130 void pathcd::visit(deque<rpnbase*>& ds,rpnprogram& p) 03131 { 03132 rpnprogramstackstate().push(&p); 03133 } 03134 03135 03136 pathquery::pathquery(deque<rpnbase*>& ds, bool const evaluate) 03137 { 03138 if (evaluate) 03139 eval(ds); 03140 else 03141 ds.push_front(this); 03142 } 03143 03144 rpnbase* pathquery::copy() const 03145 { 03146 return new pathquery(); 03147 } 03148 03149 void pathquery::eval( deque<rpnbase*>& ds ) 03150 { 03151 if (!ds.empty()) 03152 ds[0]->accept(ds,*this); 03153 03154 dec(); 03155 } 03156 03157 void pathquery::visit(deque<rpnbase*>& ds,rpnstring& s) 03158 { 03159 bool found; 03160 rpnprogram* p; 03161 vector<string> v; 03162 pathstuff().convert(v,s.str); 03163 03164 pathstuff().findpath(found,p,v); 03165 03166 rpninteger* x = new rpninteger(); 03167 x->num = 0; 03168 03169 if (found) 03170 x->num = 1; 03171 03172 ds.push_front(x); 03173 } 03174 03175 03176 varmv::varmv(deque<rpnbase*>& ds, bool const evaluate) 03177 { 03178 if (evaluate) 03179 eval(ds); 03180 else 03181 ds.push_front(this); 03182 } 03183 03184 rpnbase* varmv::copy() const 03185 { 03186 return new varmv(); 03187 } 03188 03189 void varmv::eval( deque<rpnbase*>& ds ) 03190 { 03191 if (!ds.empty()) 03192 ds[0]->accept(ds,*this); 03193 03194 dec(); 03195 } 03196 03197 void varmv::visit(deque<rpnbase*>& ds,rpnstring& varname) 03198 { 03199 if (ds.size()<2) 03200 return; 03201 03202 if (!ds[1]->isstring()) 03203 return; 03204 03205 deque<rpnvar*>& vs = rpnprogramstackstate().vs(); 03206 if (vs.empty()) 03207 return; 03208 03209 rpnbase* x0 = ds.front(); 03210 ds.pop_front(); 03211 rpnbase* x1 = ds.front(); 03212 ds.pop_front(); 03213 03214 string nm(varname.str); 03215 bool found = false; 03216 unsigned int index; 03217 for (unsigned int i=0, imax=vs.size(); i<imax; ++i) 03218 { 03219 if (vs[i]->varname==nm) 03220 { 03221 found = true; 03222 index = i; 03223 i = imax; 03224 } 03225 } 03226 03227 if (!found) 03228 { 03229 ds.push_front(x1); 03230 ds.push_front(x0); 03231 return; 03232 } 03233 03234 rpnstring* s = (rpnstring*)x1; 03235 03236 rpnprogram* p; 03237 vector<string> v; 03238 pathstuff().convert(v,s->str); 03239 03240 pathstuff().findpath(found,p,v); 03241 03242 if (!found) 03243 { 03244 ds.push_front(x1); 03245 ds.push_front(x0); 03246 03247 return; 03248 } 03249 03250 p->variables.push_back( vs[index] ); 03251 vs.erase(vs.begin()+index); 03252 03253 x0->dec(); 03254 x1->dec(); 03255 } 03256 03257 03258 rpncp::rpncp(deque<rpnbase*>& ds, bool const evaluate) 03259 { 03260 if (evaluate) 03261 eval(ds); 03262 else 03263 ds.push_front(this); 03264 } 03265 03266 rpnbase* rpncp::copy() const 03267 { 03268 return new rpncp(); 03269 } 03270 03271 void rpncp::eval( deque<rpnbase*>& ds ) 03272 { 03273 if (!ds.empty()) 03274 ds[0]->accept(ds,*this); 03275 03276 dec(); 03277 } 03278 03279 void rpncp::visit(deque<rpnbase*>& ds,rpnstring& varname) 03280 { 03281 if (ds.size()<2) 03282 return; 03283 03284 if (!ds[1]->isstring()) 03285 return; 03286 03287 deque<rpnvar*>& vs = rpnprogramstackstate().vs(); 03288 if (vs.empty()) 03289 return; 03290 03291 rpnbase* x0 = ds.front(); 03292 ds.pop_front(); 03293 rpnbase* x1 = ds.front(); 03294 ds.pop_front(); 03295 03296 string nm(varname.str); 03297 bool found = false; 03298 unsigned int index; 03299 for (unsigned int i=0, imax=vs.size(); i<imax; ++i) 03300 { 03301 if (vs[i]->varname==nm) 03302 { 03303 found = true; 03304 index = i; 03305 i = imax; 03306 } 03307 } 03308 03309 if (!found) 03310 { 03311 ds.push_front(x1); 03312 ds.push_front(x0); 03313 return; 03314 } 03315 03316 rpnstring* s = (rpnstring*)x1; 03317 03318 rpnprogram* p; 03319 vector<string> v; 03320 pathstuff().convert(v,s->str); 03321 03322 pathstuff().findpath(found,p,v); 03323 03324 if (!found) 03325 { 03326 ds.push_front(x1); 03327 ds.push_front(x0); 03328 03329 return; 03330 } 03331 03332 p->variables.push_back( (rpnvar*)(vs[index]->copy()) ); 03333 03334 x0->dec(); 03335 x1->dec(); 03336 } 03337 03338 03339 rpninsert::rpninsert(deque<rpnbase*>& ds, bool const evaluate) 03340 { 03341 if (evaluate) 03342 eval(ds); 03343 else 03344 ds.push_front(this); 03345 } 03346 03347 rpnbase* rpninsert::copy() const 03348 { 03349 return new rpninsert(); 03350 } 03351 03352 void rpninsert::eval( deque<rpnbase*>& ds ) 03353 { 03354 if (!ds.empty()) 03355 ds[0]->accept(ds,*this); 03356 03357 dec(); 03358 } 03359 03360 void rpninsert::visit(deque<rpnbase*>& ds,rpninteger& n) 03361 { 03362 if (ds.size()<2) 03363 return; 03364 03365 if (n.num<0) 03366 return; 03367 03368 unsigned int k = (unsigned int)(n.num); 03369 03370 if (k+2>ds.size()) 03371 return; 03372 03373 rpnbase* x0 = ds.front(); 03374 ds.pop_front(); 03375 rpnbase* x1 = ds.front(); 03376 ds.pop_front(); 03377 03378 ds.insert(ds.begin()+k,x1); 03379 03380 x0->dec(); 03381 } 03382 03383 03384 rpnerase::rpnerase(deque<rpnbase*>& ds, bool const evaluate) 03385 { 03386 if (evaluate) 03387 eval(ds); 03388 else 03389 ds.push_front(this); 03390 } 03391 03392 rpnbase* rpnerase::copy() const 03393 { 03394 return new rpnerase(); 03395 } 03396 03397 void rpnerase::eval( deque<rpnbase*>& ds ) 03398 { 03399 if (!ds.empty()) 03400 ds[0]->accept(ds,*this); 03401 03402 dec(); 03403 } 03404 03405 void rpnerase::visit(deque<rpnbase*>& ds,rpninteger& n) 03406 { 03407 if (ds.size()<2) 03408 return; 03409 03410 if (n.num<0) 03411 return; 03412 03413 unsigned int k = (unsigned int)(n.num); 03414 03415 if (k+1>=ds.size()) 03416 return; 03417 03418 rpnbase* x0 = ds.front(); 03419 ds.pop_front(); 03420 03421 deque<rpnbase*>::iterator i = ds.begin()+k; 03422 (*i)->dec(); 03423 ds.erase(i); 03424 03425 x0->dec(); 03426 } 03427 03428 03429 rpnpointermake::rpnpointermake(deque<rpnbase*>& ds, bool const evaluate) 03430 { 03431 if (evaluate) 03432 eval(ds); 03433 else 03434 ds.push_front(this); 03435 } 03436 03437 rpnbase* rpnpointermake::copy() const 03438 { 03439 return new rpnpointermake(); 03440 } 03441 03442 void rpnpointermake::eval( deque<rpnbase*>& ds ) 03443 { 03444 if (!ds.empty()) 03445 ds[0]->accept(ds,*this); 03446 03447 dec(); 03448 } 03449 03450 void rpnpointermake::visit(deque<rpnbase*>& ds,rpninteger& n) 03451 { 03452 if (ds.size()<=2) 03453 return; 03454 03455 if (n.num<0) 03456 return; 03457 03458 unsigned int k = (unsigned int)(n.num); 03459 03460 if (k+1>ds.size()) 03461 return; 03462 03463 rpnbase* x0 = ds.front(); 03464 ds.pop_front(); 03465 x0->dec(); 03466 03467 rpnbase* xk = ds[k]; 03468 xk->inc(); 03469 ds.push_front( xk ); 03470 } 03471 03472 void rpnpointermake::visit(deque<rpnbase*>& ds,rpnstring& s) 03473 { 03474 rpnbase* x0 = ds.front(); 03475 ds.pop_front(); 03476 03477 rpnprogramstackstate().recallpointer(ds,s.str); 03478 03479 x0->dec(); 03480 } 03481 03482 03483 rpnvectormake::rpnvectormake(deque<rpnbase*>& ds, bool const evaluate) 03484 { 03485 if (evaluate) 03486 eval(ds); 03487 else 03488 ds.push_front(this); 03489 } 03490 03491 rpnbase* rpnvectormake::copy() const 03492 { 03493 return new rpnvectormake(); 03494 } 03495 03496 void rpnvectormake::eval( deque<rpnbase*>& ds ) 03497 { 03498 if (!ds.empty()) 03499 ds[0]->accept(ds,*this); 03500 03501 dec(); 03502 } 03503 03504 void rpnvectormake::visit(deque<rpnbase*>& ds,rpninteger& n) 03505 { 03506 if (ds.size()<=2) 03507 return; 03508 03509 if (n.num<0) 03510 return; 03511 03512 unsigned int k = (unsigned int)(n.num); 03513 if (k+1>=ds.size()) 03514 return; 03515 03516 rpnbase* x0 = ds.front(); 03517 ds.pop_front(); 03518 x0->dec(); 03519 03520 rpnbase* xk = new rpnvector(k); 03521 ds.push_front( xk ); 03522 } 03523 03524 void rpnvectormake::visit(deque<rpnbase*>& ds,rpnstring& s) 03525 { 03526 if (ds.size()<=3) 03527 return; 03528 03529 rpnbase* x1 = ds[1]; 03530 if (!x1->isinteger()) 03531 return; 03532 03533 int n = ((rpninteger*)x1)->num; 03534 if ( n<0 ) 03535 return; 03536 03537 unsigned int k = (unsigned int)n; 03538 if (k+2>=ds.size()) 03539 return; 03540 03541 rpnbase* x0 = ds.front(); 03542 ds.pop_front(); 03543 ds.pop_front(); 03544 03545 new rpnvar 03546 ( 03547 *(rpnprogramstackstate().ps->front()), 03548 new rpnvector(k), 03549 s.str 03550 ); 03551 03552 x0->dec(); 03553 x1->dec(); 03554 } 03555 03556 03557 03558 rpnvectorpointermake::rpnvectorpointermake 03559 (deque<rpnbase*>& ds, bool const evaluate) 03560 { 03561 if (evaluate) 03562 eval(ds); 03563 else 03564 ds.push_front(this); 03565 } 03566 03567 rpnbase* rpnvectorpointermake::copy() const 03568 { 03569 return new rpnvectorpointermake(); 03570 } 03571 03572 void rpnvectorpointermake::eval( deque<rpnbase*>& ds ) 03573 { 03574 if (!ds.empty()) 03575 ds[0]->accept(ds,*this); 03576 03577 dec(); 03578 } 03579 03580 void rpnvectorpointermake::visit(deque<rpnbase*>& ds,rpnvector& v) 03581 { 03582 if (ds.size()<=2) 03583 return; 03584 03585 rpnbase* x0 = ds.front(); 03586 rpnbase* x1 = ds[1]; 03587 03588 if (!x1->isinteger()) 03589 return; 03590 03591 long int n = ((rpninteger*)x1)->num; 03592 03593 ds.pop_front(); 03594 ds.pop_front(); 03595 03596 03597 int n2 = v.index(); 03598 n += n2; 03599 03600 if ( (n<0) || !(n<(int)ds.size()) ) 03601 { 03602 ds.push_front(x1); 03603 ds.push_front(x0); 03604 return; 03605 } 03606 03607 x0->dec(); 03608 x1->dec(); 03609 03610 rpnbase* w = ds[n]; 03611 w->inc(); 03612 ds.push_front(w); 03613 } 03614 03615 03616 03617 void rpnvectorpointermake::visit(deque<rpnbase*>& ds,rpninteger& k) 03618 { 03619 if (ds.size()<=2) 03620 return; 03621 03622 rpnbase* x0 = ds.front(); 03623 rpnbase* x1 = ds[1]; 03624 03625 if (!x1->isvector()) 03626 return; 03627 03628 // int n = ((rpninteger*)x1)->num; 03629 03630 long int n(k.num); 03631 03632 ds.pop_front(); 03633 ds.pop_front(); 03634 03635 03636 int n2 = ((rpnvector*)x1)->index(); 03637 n += n2; 03638 03639 03640 if ( (n<0) || !(n<(int)ds.size()) ) 03641 { 03642 ds.push_front(x1); 03643 ds.push_front(x0); 03644 return; 03645 } 03646 03647 x0->dec(); 03648 x1->dec(); 03649 03650 rpnbase* w = ds[n]; 03651 w->inc(); 03652 ds.push_front(w); 03653 } 03654 03655 03656 03657 void rpnvectorpointermake::visit(deque<rpnbase*>& ds,rpnstring& s) 03658 { 03659 if (ds.size()<=2) 03660 return; 03661 03662 rpnbase* x0 = ds.front(); 03663 rpnbase* x1 = ds[1]; 03664 03665 if (!x1->isinteger()) 03666 return; 03667 03668 int n = ((rpninteger*)x1)->num; 03669 03670 unsigned int sz0 = ds.size(); 03671 rpnprogramstackstate().recallpointer(ds,s.str); 03672 unsigned int sz1 = ds.size(); 03673 if (sz0==sz1) 03674 return; 03675 03676 rpnbase* x2 = ds.front(); 03677 03678 if( ! x2->isvector() ) 03679 { 03680 x2->dec(); 03681 ds.pop_front(); 03682 return; 03683 } 03684 03685 rpnvector& v = *((rpnvector*)x2); 03686 03687 ds.pop_front(); 03688 ds.pop_front(); 03689 ds.pop_front(); 03690 03691 int n2 = v.index(); 03692 x2->dec(); 03693 n += n2; 03694 03695 if ( (n<0) || !(n<(int)ds.size()) ) 03696 { 03697 ds.push_front(x1); 03698 ds.push_front(x0); 03699 return; 03700 } 03701 03702 x0->dec(); 03703 x1->dec(); 03704 03705 rpnbase* w = ds[n]; 03706 w->inc(); 03707 ds.push_front(w); 03708 } 03709 03710 03711 pstream::pstream(deque<rpnbase*>& ds, bool const evaluate) 03712 { 03713 if (evaluate) 03714 eval(ds); 03715 else 03716 ds.push_front(this); 03717 } 03718 03719 rpnbase* pstream::copy() const 03720 { 03721 return new pstream(); 03722 } 03723 03724 void pstream::eval( deque<rpnbase*>& ds ) 03725 { 03726 if (!ds.empty()) 03727 ds[0]->accept(ds,*this); 03728 03729 dec(); 03730 } 03731 03732 03733 void pstream::visit(deque<rpnbase*>& ds,rpnprogram& p0) 03734 { 03735 if (ds.size()<2) 03736 return; 03737 03738 rpnbase* x1 = ds[1]; 03739 if (! x1->isprogram() ) 03740 return; 03741 03742 rpnprogram& p1 = *( (rpnprogram*) x1 ); 03743 03744 rpnprogram& p = * new rpnprogram(ds); 03745 03746 rpnprogramstackstate().push(&p); 03747 03748 if (!p1.v.empty()) 03749 { 03750 rpnbase* w; 03751 for (unsigned int i=0, imax = p1.v.size(); i<imax; ++i) 03752 { 03753 w = p1.v[i]; 03754 w->inc(); 03755 p.v.push_front(w); 03756 03757 cout << "*"; 03758 p0.print(cout); 03759 cout << endl; 03760 03761 p0.inc(); 03762 p0.eval( p.v ); 03763 } 03764 } 03765 03766 if (!p.v.empty()) 03767 reverse(p.v.begin(),p.v.end()); 03768 03769 rpnprogramstackstate().pop(); 03770 } 03771 03772 03773 rpnintegerhex::rpnintegerhex(deque<rpnbase*>& ds, bool const evaluate) 03774 { 03775 if (evaluate) 03776 eval(ds); 03777 else 03778 ds.push_front(this); 03779 } 03780 03781 rpnbase* rpnintegerhex::copy() const 03782 { 03783 return new rpnintegerhex(); 03784 } 03785 03786 void rpnintegerhex::eval( deque<rpnbase*>& ds ) 03787 { 03788 rpninteger::displaybase=16; 03789 03790 dec(); 03791 } 03792 03793 03794 03795 03796 rpnintegeroct::rpnintegeroct(deque<rpnbase*>& ds, bool const evaluate) 03797 { 03798 if (evaluate) 03799 eval(ds); 03800 else 03801 ds.push_front(this); 03802 } 03803 03804 rpnbase* rpnintegeroct::copy() const 03805 { 03806 return new rpnintegeroct(); 03807 } 03808 03809 void rpnintegeroct::eval( deque<rpnbase*>& ds ) 03810 { 03811 rpninteger::displaybase=8; 03812 03813 dec(); 03814 } 03815 03816 03817 03818 rpnintegerdec::rpnintegerdec(deque<rpnbase*>& ds, bool const evaluate) 03819 { 03820 if (evaluate) 03821 eval(ds); 03822 else 03823 ds.push_front(this); 03824 } 03825 03826 rpnbase* rpnintegerdec::copy() const 03827 { 03828 return new rpnintegerdec(); 03829 } 03830 03831 void rpnintegerdec::eval( deque<rpnbase*>& ds ) 03832 { 03833 rpninteger::displaybase=10; 03834 03835 dec(); 03836 } 03837 03838 03839 03840 03841 rpnintegerbin::rpnintegerbin(deque<rpnbase*>& ds, bool const evaluate) 03842 { 03843 if (evaluate) 03844 eval(ds); 03845 else 03846 ds.push_front(this); 03847 } 03848 03849 rpnbase* rpnintegerbin::copy() const 03850 { 03851 return new rpnintegerbin(); 03852 } 03853 03854 void rpnintegerbin::eval( deque<rpnbase*>& ds ) 03855 { 03856 rpninteger::displaybase=2; 03857 03858 dec(); 03859 } 03860 03861 03862 rpnbitnot::rpnbitnot(deque<rpnbase*>& ds, bool const evaluate) 03863 { 03864 if (evaluate) 03865 eval(ds); 03866 else 03867 ds.push_front(this); 03868 } 03869 03870 rpnbase* rpnbitnot::copy() const 03871 { 03872 return new rpnbitnot(); 03873 } 03874 03875 void rpnbitnot::eval( deque<rpnbase*>& ds ) 03876 { 03877 if (!ds.empty()) 03878 ds[0]->accept(ds,*this); 03879 03880 dec(); 03881 } 03882 03883 void rpnbitnot::visit(deque<rpnbase*>& ds,rpninteger& n) 03884 { 03885 n.num = ~n.num; 03886 } 03887 03888 03889 rpnbitxor::rpnbitxor(deque<rpnbase*>& ds, bool const evaluate) 03890 { 03891 if (evaluate) 03892 eval(ds); 03893 else 03894 ds.push_front(this); 03895 } 03896 03897 rpnbase* rpnbitxor::copy() const 03898 { 03899 return new rpnbitxor(); 03900 } 03901 03902 void rpnbitxor::eval( deque<rpnbase*>& ds ) 03903 { 03904 if (ds.size()>1) 03905 ds[0]->accept(ds,*this); 03906 03907 dec(); 03908 } 03909 03910 void rpnbitxor::visit(deque<rpnbase*>& ds,rpninteger& n) 03911 { 03912 rpnbase* x0 = ds.front(); 03913 rpnbase* x1 = ds[1]; 03914 03915 if (!x1->isinteger()) 03916 return; 03917 03918 ds.pop_front(); 03919 03920 ((rpninteger*)x1)->num ^= n.num; 03921 03922 x0->dec(); 03923 } 03924 03925 03926 rpnbitand::rpnbitand(deque<rpnbase*>& ds, bool const evaluate) 03927 { 03928 if (evaluate) 03929 eval(ds); 03930 else 03931 ds.push_front(this); 03932 } 03933 03934 rpnbase* rpnbitand::copy() const 03935 { 03936 return new rpnbitand(); 03937 } 03938 03939 void rpnbitand::eval( deque<rpnbase*>& ds ) 03940 { 03941 if (ds.size()>1) 03942 ds[0]->accept(ds,*this); 03943 03944 dec(); 03945 } 03946 03947 void rpnbitand::visit(deque<rpnbase*>& ds,rpninteger& n) 03948 { 03949 rpnbase* x0 = ds.front(); 03950 rpnbase* x1 = ds[1]; 03951 03952 if (!x1->isinteger()) 03953 return; 03954 03955 ds.pop_front(); 03956 03957 ((rpninteger*)x1)->num &= n.num; 03958 03959 x0->dec(); 03960 } 03961 03962 03963 rpnbitor::rpnbitor(deque<rpnbase*>& ds, bool const evaluate) 03964 { 03965 if (evaluate) 03966 eval(ds); 03967 else 03968 ds.push_front(this); 03969 } 03970 03971 rpnbase* rpnbitor::copy() const 03972 { 03973 return new rpnbitor(); 03974 } 03975 03976 void rpnbitor::eval( deque<rpnbase*>& ds ) 03977 { 03978 if (ds.size()>1) 03979 ds[0]->accept(ds,*this); 03980 03981 dec(); 03982 } 03983 03984 void rpnbitor::visit(deque<rpnbase*>& ds,rpninteger& n) 03985 { 03986 rpnbase* x0 = ds.front(); 03987 rpnbase* x1 = ds[1]; 03988 03989 if (!x1->isinteger()) 03990 return; 03991 03992 ds.pop_front(); 03993 03994 ((rpninteger*)x1)->num |= n.num; 03995 03996 x0->dec(); 03997 } 03998 03999 04000 04001 rpnbitshiftleft::rpnbitshiftleft(deque<rpnbase*>& ds, bool const evaluate) 04002 { 04003 if (evaluate) 04004 eval(ds); 04005 else 04006 ds.push_front(this); 04007 } 04008 04009 rpnbase* rpnbitshiftleft::copy() const 04010 { 04011 return new rpnbitshiftleft(); 04012 } 04013 04014 void rpnbitshiftleft::eval( deque<rpnbase*>& ds ) 04015 { 04016 if (ds.size()>1) 04017 ds[0]->accept(ds,*this); 04018 04019 dec(); 04020 } 04021 04022 void rpnbitshiftleft::visit(deque<rpnbase*>& ds,rpninteger& n) 04023 { 04024 rpnbase* x0 = ds.front(); 04025 rpnbase* x1 = ds[1]; 04026 04027 if (!x1->isinteger()) 04028 return; 04029 04030 ds.pop_front(); 04031 04032 ((rpninteger*)x1)->num = (((rpninteger*)x1)->num << n.num); 04033 04034 x0->dec(); 04035 } 04036 04037 04038 04039 04040 04041 rpnbitshiftright::rpnbitshiftright(deque<rpnbase*>& ds, bool const evaluate) 04042 { 04043 if (evaluate) 04044 eval(ds); 04045 else 04046 ds.push_front(this); 04047 } 04048 04049 rpnbase* rpnbitshiftright::copy() const 04050 { 04051 return new rpnbitshiftright(); 04052 } 04053 04054 void rpnbitshiftright::eval( deque<rpnbase*>& ds ) 04055 { 04056 if (ds.size()>1) 04057 ds[0]->accept(ds,*this); 04058 04059 dec(); 04060 } 04061 04062 void rpnbitshiftright::visit(deque<rpnbase*>& ds,rpninteger& n) 04063 { 04064 rpnbase* x0 = ds.front(); 04065 rpnbase* x1 = ds[1]; 04066 04067 if (!x1->isinteger()) 04068 return; 04069 04070 ds.pop_front(); 04071 04072 ((rpninteger*)x1)->num = (((rpninteger*)x1)->num >> n.num); 04073 04074 x0->dec(); 04075 } 04076 04077 04078 rpnintegerconvert::rpnintegerconvert(deque<rpnbase*>& ds, bool const evaluate) 04079 { 04080 if (evaluate) 04081 eval(ds); 04082 else 04083 ds.push_front(this); 04084 } 04085 04086 rpnbase* rpnintegerconvert::copy() const 04087 { 04088 return new rpnintegerconvert(); 04089 } 04090 04091 void rpnintegerconvert::eval( deque<rpnbase*>& ds ) 04092 { 04093 if(!ds.empty()) 04094 ds[0]->accept(ds,*this); 04095 04096 dec(); 04097 } 04098 04099 void rpnintegerconvert::visit(deque<rpnbase*>& ds,rpnreal& n) 04100 { 04101 rpnbase* x0 = ds.front(); 04102 ds.pop_front(); 04103 04104 long int num = (long int)(n.num); 04105 04106 new rpninteger(ds,num); 04107 04108 x0->dec(); 04109 } 04110 04111 04112 void rpnintegerconvert::visit(deque<rpnbase*>& ds,rpnstring & s) 04113 { 04114 rpnbase* x0 = ds.front(); 04115 ds.pop_front(); 04116 04117 long int n; 04118 stringstream ss(s.str.c_str()); 04119 ss >> n; 04120 new rpninteger(ds,n); 04121 04122 x0->dec(); 04123 } 04124 rpnstringconvert::rpnstringconvert(deque<rpnbase*>& ds, bool const evaluate) 04125 { 04126 if (evaluate) 04127 eval(ds); 04128 else 04129 ds.push_front(this); 04130 } 04131 04132 rpnbase* rpnstringconvert::copy() const 04133 { 04134 return new rpnstringconvert(); 04135 } 04136 04137 void rpnstringconvert::eval( deque<rpnbase*>& ds ) 04138 { 04139 if(!ds.empty()) 04140 ds[0]->accept(ds,*this); 04141 04142 dec(); 04143 } 04144 04145 void rpnstringconvert::visit(deque<rpnbase*>& ds,rpninteger & n) 04146 { 04147 rpnbase* x0 = ds.front(); 04148 ds.pop_front(); 04149 04150 stringstream ss; 04151 ss << n.num; 04152 04153 new rpnstring(ds,ss.str()); 04154 04155 x0->dec(); 04156 } 04157 04158 void rpnstringconvert::visit(deque<rpnbase*>& ds,rpnreal & n) 04159 { 04160 rpnbase* x0 = ds.front(); 04161 ds.pop_front(); 04162 04163 stringstream ss; 04164 ss << n.num; 04165 04166 new rpnstring(ds,ss.str()); 04167 04168 x0->dec(); 04169 } 04170 04171 04172 rpnfactorial::rpnfactorial(deque<rpnbase*>& ds, bool const evaluate) 04173 { 04174 if (evaluate) 04175 eval(ds); 04176 else 04177 ds.push_front(this); 04178 } 04179 04180 rpnbase* rpnfactorial::copy() const 04181 { 04182 return new rpnfactorial(); 04183 } 04184 04185 void rpnfactorial::eval( deque<rpnbase*>& ds ) 04186 { 04187 if(!ds.empty()) 04188 ds[0]->accept(ds,*this); 04189 04190 dec(); 04191 } 04192 04193 void rpnfactorial::visit(deque<rpnbase*>& ds,rpninteger & n) 04194 { 04195 if (n.num<0) 04196 return; 04197 04198 long int num(1); 04199 for (long int i=1; i<=n.num; ++i) 04200 num *= i; 04201 04202 n.num = num; 04203 } 04204 04205 04206 rpnmod::rpnmod(deque<rpnbase*>& ds, bool const evaluate) 04207 { 04208 if (evaluate) 04209 eval(ds); 04210 else 04211 ds.push_front(this); 04212 } 04213 04214 rpnbase* rpnmod::copy() const 04215 { 04216 return new rpnmod(); 04217 } 04218 04219 void rpnmod::eval( deque<rpnbase*>& ds ) 04220 { 04221 if(ds.size()>1) 04222 ds[0]->accept(ds,*this); 04223 04224 dec(); 04225 } 04226 04227 void rpnmod::visit(deque<rpnbase*>& ds,rpninteger & n) 04228 { 04229 if (!ds[1]->isinteger()) 04230 return; 04231 if (n.num<1) 04232 return; 04233 04234 rpnbase* x0 = ds.front(); 04235 ds.pop_front(); 04236 04237 rpninteger* x1 = (rpninteger *)(ds.front()); 04238 x1->num %= n.num; 04239 04240 x0->dec(); 04241 } 04242 04243 04244 rpnascii::rpnascii(deque<rpnbase*>& ds, bool const evaluate) 04245 { 04246 if (evaluate) 04247 eval(ds); 04248 else 04249 ds.push_front(this); 04250 } 04251 04252 rpnbase* rpnascii::copy() const 04253 { 04254 return new rpnascii(); 04255 } 04256 04257 void rpnascii::eval( deque<rpnbase*>& ds ) 04258 { 04259 if(!ds.empty()) 04260 ds[0]->accept(ds,*this); 04261 04262 dec(); 04263 } 04264 04265 void rpnascii::visit(deque<rpnbase*>& ds,rpninteger & n) 04266 { 04267 rpnbase* x0 = ds.front(); 04268 ds.pop_front(); 04269 04270 char ch = (char)(n.num); 04271 string s; s+= ch; 04272 04273 new rpnstring(ds,s); 04274 04275 x0->dec(); 04276 } 04277 04278 void rpnascii::visit(deque<rpnbase*>& ds,rpnstring& s) 04279 { 04280 if (s.str.empty()) 04281 return; 04282 04283 rpnbase* x0 = ds.front(); 04284 ds.pop_front(); 04285 04286 long int num = s.str[0]; 04287 04288 new rpninteger(ds,num); 04289 04290 x0->dec(); 04291 } 04292 04293 04294 rpngcd::rpngcd(deque<rpnbase*>& ds, bool const evaluate) 04295 { 04296 if (evaluate) 04297 eval(ds); 04298 else 04299 ds.push_front(this); 04300 } 04301 04302 rpnbase* rpngcd::copy() const 04303 { 04304 return new rpngcd(); 04305 } 04306 04307 void rpngcd::eval( deque<rpnbase*>& ds ) 04308 { 04309 if(ds.size()>1) 04310 ds[0]->accept(ds,*this); 04311 04312 dec(); 04313 } 04314 04315 void rpngcd::visit(deque<rpnbase*>& ds,rpninteger & n) 04316 { 04317 if (!ds[1]->isinteger()) 04318 return; 04319 if (n.num<1) 04320 return; 04321 04322 rpnbase* x0 = ds.front(); 04323 ds.pop_front(); 04324 04325 rpninteger* x1 = (rpninteger *)(ds.front()); 04326 04327 long int a = x1->num; 04328 if (a<1) 04329 { 04330 ds.push_front(x0); 04331 return; 04332 } 04333 04334 long int b = n.num; 04335 04336 if (a<b) 04337 { 04338 long int c = a; 04339 a = b; 04340 b = c; 04341 } 04342 04343 if (a!=b) 04344 { 04345 for (long int c=a%b;c!=0;) 04346 { 04347 a = b; 04348 b = c; 04349 c = a%b; 04350 } 04351 04352 } 04353 04354 x1->num = b; 04355 04356 x0->dec(); 04357 } 04358 04359 04360 04361 04362
1.5.8