blob: 97959340db02ac1d9d7b8b2a8cfa14a27216eb22 (
plain) (
tree)
|
|
#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;
|