Related articles |
---|
Calculating expressions with several types div@infonet.nnov.ru (=?koi8-r?B?4c7Uz84=?=) (2000-12-11) |
Re: Calculating expressions with several types lgcl01@es.co.nz (Fairbairn Family) (2000-12-13) |
Re: Calculating expressions with several types chris@cjl1.demon.co.uk (Chris Locke) (2000-12-13) |
Re: Calculating expressions with several types jparis11@home.com (Jean Pariseau) (2000-12-18) |
From: | "Jean Pariseau" <jparis11@home.com> |
Newsgroups: | comp.compilers |
Date: | 18 Dec 2000 00:44:11 -0500 |
Organization: | Excite@Home - The Leader in Broadband http://home.com/faster |
References: | 00-12-044 |
Keywords: | types |
Posted-Date: | 18 Dec 2000 00:44:11 EST |
Don,
Depending on how you have your interpreter set up, how much effort
you want to put into it, and using a language like C++ or Object
pascal, another option to the struct or record solution is to use
classes and polymorphism. For example you can have a base node that
would encapsulate the basic functionality to be used by every type of
node in the tree.
class BaseNode
{
public:
virtual Node* Interpret();
virtual Node* Compile();
virtual int NodeType;
// and your ctor's and dtor's
}
class IntegerNode : public BaseNode
{
public:
int Value;
virtual Node* Interpret()
{
// don't need to do anything here for interpreter except maybe to
return this node
}
virtual Node* Compile()
{
// if we were to compile the tree, we could have it emit a line of
assembler or object code
}
....
};
class DoubleNode : public BaseNode
{
... similar to above except that this would be for a double instead of
an int
double Value;
};
class AdditionNode : public BaseNode
{
Node* ReturnNode;
Node* RightChild;
Node* LeftChild;
virtual Node* Interpret()
{
switch (LeftChild->NodeType)
{
case (type_Integer) :
{
switch(RightChild->NodeType)
{
case(type_Integer):
{
// int = int + int
ReturnNode = new IntegerNode(LeftNode->Value
+ RightNode->Value);
}
case(type_Double):
{
double = int + double
ReturnNode = new
DoubleNode((double)LeftNode->Value, RightNode->Value);
}
default:
ReturnNode = NULL;
}
// we are done with the comparison stuff so we return a
pointer of the base node
return ReturnNode;
}
//end
I'm sure you get the picture. To make life easier you could use
templates. check out www.relisoft.com for a great tutorial on an
object-oriiented parse tree.
Jean
Return to the
comp.compilers page.
Search the
comp.compilers archives again.