charlie@genrad.com (Charlie D. Havener) (01/02/90)
// Zortech 2.0 bug with multiple inheritance
// compiler says ztc Bug 9513 and stops
// Walter, what is code 9513? Is there a work around?
// The Sun 2.0 C++ compiles and runs it OK
// charlie Havener GenRad Inc. 508-369-4400 x3302
// charlie@genrad.com
// This example is a part of an Abstract Syntax Tree
// as described in Dewhurst and Stark book
#include <stream.h>
#include <stdlib.h>
//---------------- Data Related classes follow -----
union Value
{
int ival;
double rval;
};
enum DataType { INT, REAL, UNKNOWN };
// class Node; // a forward declaration DOESN'T WORK!
// for class Data : public Node with Data eval()
class Data // an abstract class
{
protected:
Data() {} // for 1.2 C++ to prevent instantiation
// should make pure virtual funcs below in C++ 2.0
public:
Value x; // had to make public so derived class mfuncs
// could access it
virtual DataType GetType() const { return UNKNOWN; }
virtual ~Data() {}
virtual Data operator+(const Data&);
virtual Data eval() { cerr << "Data eval() base class\n"; return *this;}
};
class Int : public Data
{
public:
Int(int t) { x.ival = t; }
// no dtor needed since ctor didn't use new
DataType GetType() const { return INT; }
Data eval() { return *this; }
Data operator+(const Data&);
};
class Real : public Data
{
public:
Real(double t) { x.rval = t; }
// no dtor needed since ctor didn't use new
DataType GetType() const { return REAL; }
Data eval() { return *this; }
Data operator+(const Data&);
};
// ------------- Parse tree nodes ----------------
class Node
{
protected:
Node(){}
public:
virtual ~Node() {}
virtual Data eval() {Real x(0.0); cerr << "In Node virtual eval()"; return x;}
virtual void print() { cerr << "No print() defined\n"; }
};
class Binop : public Node
{
protected:
Node *left;
Node *right;
Binop(Node *l,Node *r) { left = l; right = r;}
~Binop() { delete left; delete right; }
};
class Plus : public Binop
{
public:
Plus(Node *l,Node *r) : (l,r) {};
Data eval() { return ( left->eval() + right->eval()); }
};
//------------------------------------
class IntVal : public Node , public Data
{
Int t;
public:
IntVal(Int &p) : t(p) { }
};
main()
{
Real x(0.0);
Int k(0);
IntVal iv(k);
IntVal rv(k);
Node *np = new Plus(&iv,&rv);
cout << "Hello world\n";
np->print();
}
//-------------- implementation -----------------
Data Int::operator+(const Data& y)
{
if ( y.GetType() == INT )
{
Int result(x.ival + y.x.ival);
return result;
}
else if ( y.GetType() == REAL )
{
Real result(x.ival + y.x.rval);
return result;
}
else
{
cerr << "unknown rhs type in int'+' operator \n";
exit(1);
}
}
Data Real::operator+(const Data& y)
{
if ( y.GetType() == INT )
{
Real result(x.rval + y.x.ival);
return result;
}
else if ( y.GetType() == REAL )
{
Real result(x.rval + y.x.rval);
return result;
}
else
{
cerr << "unknown rhs type in real '+' operator \n";
exit(1);
}
}
Data Data::operator+(const Data&)
{ cerr << "virtual Data::operator+()!!!\n"; exit(1); }