proj home

Files   Classes   Functions   Hierarchy  

rpnfor Class Reference

#include <rpnfunc.h>

Inheritance diagram for rpnfor:
Collaboration diagram for rpnfor:

List of all members.

Public Member Functions

 rpnfor ()
 rpnfor (deque< rpnbase * > &ds, bool const evaluate=true)
 ~rpnfor ()
rpnbasecopy () const
void visit (deque< rpnbase * > &ds, rpnprogram &n)
string const name () const
void eval (deque< rpnbase * > &ds)


Detailed Description

Definition at line 811 of file rpnfunc.h.


Constructor & Destructor Documentation

rpnfor::rpnfor (  )  [inline]

Definition at line 815 of file rpnfunc.h.

Referenced by copy().

00815 {}

rpnfor::rpnfor ( deque< rpnbase * > &  ds,
bool const   evaluate = true 
)

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 }

rpnfor::~rpnfor (  )  [inline]

Definition at line 817 of file rpnfunc.h.

00817 {}


Member Function Documentation

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().

02301 {
02302   if (ds.size()>1)
02303     ds[0]->accept(ds,*this);
02304 
02305   dec();
02306 }

string const rpnfor::name (  )  const [inline, virtual]

Reimplemented from rpnfunction.

Definition at line 822 of file rpnfunc.h.

00822 { return string("for"); }

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 }


The documentation for this class was generated from the following files:

Generated on Fri Mar 4 00:50:14 2011 for Chelton Evans Source by  doxygen 1.5.8