#include "ast.h"
+#include "ivisitor.h"
#include <sstream>
#include <string.h>
#include <iostream>
node_type = typ;
}
-list<AST*>* AST::children(void)
+list<AST*>* AST::children(void) const
{
return node_children;
}
return new_clone;
}
+bool AST::operator ==(const AST& rhs) const
+{
+ bool ret = true;
+ std::list<AST*>* l_children;
+ std::list<AST*>* r_children;
+ std::list<AST*>::iterator lit;
+ std::list<AST*>::iterator rit;
+
+ // Setup our locals
+ l_children = children();
+ r_children = rhs.children();
+ lit = l_children->begin();
+ rit = r_children->begin();
+
+ // Check this node for equality
+ ret &= (type() == rhs.type());
+ ret &= ( 0 == text().compare( rhs.text() ) );
+ ret &= (l_children->size() == r_children->size());
+
+ // If we are still equal then check the children nodes
+ while( (lit != l_children->end()) && (rit != r_children->end()) )
+ {
+ ret &= ((NULL != *lit) && (NULL != *rit));
+ if( ret )
+ {
+ AST& left = *(*lit);
+ AST& right = *(*rit);
+ ret &= (left == right);
+ }
+ lit++;
+ rit++;
+ }
+ return ret;
+}
+
+bool AST::operator !=(const AST& rhs) const
+{
+ return !( *this == rhs );
+}
+
+void AST::process(IVisitor& visitor)
+{
+ visitor.visit( this );
+}
+
typedef unsigned int ASTNodeType;
+// This is defined elsewhere. We need to declare it here so we can use it
+class IVisitor;
+
class AST
{
protected:
AST(ASTNodeType type, int child_count, ...);
AST(ASTNodeType type, std::string text, int child_count, ...);
virtual ~AST();
-
AST& operator = (AST& rhs);
-
ASTNodeType type(void) const;
void type(ASTNodeType typ);
std::string text(void) const;
void text(std::string& txt);
- std::list<AST*>* children(void);
+ std::list<AST*>* children(void) const;
void addChild(AST* node);
AST* clone(void) const;
+ bool operator ==(const AST &other) const;
+ bool operator !=(const AST &other) const;
+ void process(IVisitor& visitor);
};
#endif