class node {
public:
enum node_type {
var_node,
num_node,
op_node
}
node(const node &);
~node(void);
node & operator = (const node &);
bool constant_fold(void);
void print(ostream &) const;
private:
node_type nt;
node * left, node * right; // for operators
big_num val; // for numbers
string name // for variables and ops
};
void node::print(ostream & os) const {
switch (ntype) {
case op_node:
left->print(os);
os << " " << name << " ";
right->print(os;
break;
case num_node:
val->print(os);
break;
case num_node:
os << name;
break;
default:
cerr << "Unknown node type in node::print().\n";
exit(EXIT_FAILURE);
}
}
class node {
public:
virtual ~node() { }
virtual void print(ostream * os) const { }
virtual bool constant_fold(void) { return false; }
};
class node {
public:
virtual ~node() = 0;
virtual void print(ostream * os) const = 0;
virtual bool constant_fold(void) = 0;
};
class num_node : node {
public:
num_node(big_num & bn) : val(bn) { }
void print(ostream & os) const { val->print(os); }
bool constant_fold(void) { return true; }
private:
big_num val;
};
class var_node : node {
public:
var_node(string & n) : name(n) { }
void print(ostream & os) const { os << name; }
bool constant_fold(void) { return false; }
private:
string name;
};
class op_node : node {
public:
op_node(const string & o, node * l, node * r)
: op(o), left(l), right(r) { }
op_node(const op_node &) { }
~op_node(void) { /* Whatever */ }
op_node & operator = (const op_node & on) { /* whatever */ }
void print(ostream & os) const {
left->print(os);
os << " " << op << " "
right->print(os);
}
bool constant_fold(void) { /* Whatever */ }
private:
const string op;
node * left, * right;
};
void try_commute(node * np) {
op_node * onp = dymamic_cast<op_node *>(np);
if (onp)
onp->commute();
}
It could indicate a missed opportunity for subtype polymorphism.
This page last modified on 11 December 2001.