aboutsummaryrefslogblamecommitdiff
path: root/model.h
blob: 97959340db02ac1d9d7b8b2a8cfa14a27216eb22 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11










                  


                                                       
 






                                       

                                      
 


                             




                                                   




                                                                             
           





                                                                              
                              



                                                                          











                                                





                                                                             
           










                                                                            
                             



                                                 

                                            

                                              
                                       
                                                          
                                        
                                                          
                                        
            
                                     

                                    









                                                                    
                                                                     
                                                                                 
                                                                         
 
                                                                            
























                                                                    



                                                                               
                             
      





















                                                              
                               




















                                                              
                                                                          




                                                                            
                                                               














                                                                            

                                                                         
                                                      
























                                                                     





                                                               
                                                      
                                                                



                             

  











                                                                                   


                                    



                                                   
           














                                                                   







                                                                          
                                                                              


                                                                          

                                                 
           
                                            





                                                                                




                                                                         

  




                                                                               

                    






                                                                       
                           
 


                                                                           


      
#ifndef MODEL_H
#define MODEL_H

#include <string>
#include <list>
#include <map>

using std::list;
using std::string;
using std::map;

// the range of unsigned char is enough for these types
typedef unsigned char ClassType;  
typedef unsigned char NumLvl;      

static const int CLS_RET_ADDR = 1 << 0;
static const int CLS_EVAL_OBJ = 1 << 1;

static const int CLS_SIM_OBJ = 1 << 0;
static const int CLS_CONS_OBJ = 1 << 1;
static const int CLS_SYM_OBJ = 1 << 2;
static const int CLS_OPT_OBJ = 1 << 3;
static const int CLS_NUM_OBJ = 1 << 4;


#define TO_CONS(ptr) \
    (static_cast<Cons*>(ptr))

/** @class FrameObj
 * Objects that can be held in the evaluation stack
 */
class FrameObj {
    protected:
        /**
         * Report the type of the FrameObj, which can avoid the use of
         * dynamic_cast to improve efficiency. See the constructor for detail
         */
        ClassType ftype;   
    public:
        /**
         * Construct an EvalObj
         * @param ftype the type of the FrameObj (CLS_EVAL_OBJ for an EvalObj,
         * CLS_RET_ADDR for a return address)
         */
        FrameObj(ClassType ftype);
        virtual ~FrameObj() {}
        /**
         * Tell whether the object is a return address, according to ftype
         * @return true for yes
         */
        bool is_ret_addr();
#ifdef DEBUG
        virtual string _debug_repr() = 0;  
#endif
};


class Cons;
/** @class EvalObj
 * Objects that represents a value in evaluation
 */
class EvalObj : public FrameObj {
    protected:
        /**
         * Report the type of the EvalObj, which can avoid the use of
         * dynamic_cast to improve efficiency. See the constructor for detail
         */
        ClassType otype;
    public:
        /**
         * Construct an EvalObj
         * @param otype the type of the EvalObj (CLS_CONS_OBJ for a
         * construction, CLS_SIM_OBJ for a simple object), which defaults to
         * CLS_SIM_OBJ
         */
        EvalObj(ClassType otype = CLS_SIM_OBJ);
        /** Check if the object is a simple object (instead of a call
         * invocation) 
         * @return true if the object is not a construction (Cons)
         * */
        bool is_simple_obj();
        /** Check if the object is a symobl */
        bool is_sym_obj();
        /** Check if the object is an operator */
        bool is_opt_obj();
        /** Check if the object is a Cons */
        bool is_cons_obj();
        /** Check if the object is a number */
        bool is_num_obj();
        virtual void prepare(Cons *pc);
        /** Any EvalObj has its external representation */
        virtual string ext_repr() = 0;  
        /** Always true for all EvalObjs except BoolObj */
        virtual bool is_true();         
#ifdef DEBUG
        virtual string _debug_repr();
        virtual void _debug_print();
#endif
};

/** @class Cons
 * Pair construct, which can be used to represent a list, or further
 * more, a syntax tree
 * (car . cdr) in Scheme
 */
class Cons : public EvalObj {
    public:
        EvalObj *car;                   /**< car (as in Scheme) */
        EvalObj *cdr;                      /**< cdr (as in Scheme) */
        bool skip;                      /**< Wether to skip the current branch */
        Cons* next;                     /**< The next branch in effect */

        Cons(EvalObj *car, EvalObj *cdr);  /**< Create a Cons (car . cdr) */
#ifdef DEBUG
        void _debug_print();
        string _debug_repr();
#endif
        string ext_repr();
};

/** @class EmptyList
 * The empty list (special situation of a list)
 */
class EmptyList: public