From 08187893f62edfb09f8945ab142ea12ad18ff1b8 Mon Sep 17 00:00:00 2001 From: "Mike D. Lowis" Date: Thu, 7 Jun 2012 19:18:21 -0400 Subject: [PATCH] Added comparison operators and process method for AST class. --- source/parser/ast/ast.cpp | 48 ++++++++++++++++++++++++++++++++++++++- source/parser/ast/ast.h | 10 +++++--- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/source/parser/ast/ast.cpp b/source/parser/ast/ast.cpp index 172b16c..d7c715a 100644 --- a/source/parser/ast/ast.cpp +++ b/source/parser/ast/ast.cpp @@ -1,4 +1,5 @@ #include "ast.h" +#include "ivisitor.h" #include #include #include @@ -98,7 +99,7 @@ void AST::type(ASTNodeType typ) node_type = typ; } -list* AST::children(void) +list* AST::children(void) const { return node_children; } @@ -129,3 +130,48 @@ AST* AST::clone(void) const return new_clone; } +bool AST::operator ==(const AST& rhs) const +{ + bool ret = true; + std::list* l_children; + std::list* r_children; + std::list::iterator lit; + std::list::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 ); +} + diff --git a/source/parser/ast/ast.h b/source/parser/ast/ast.h index 5661ce1..ae4a479 100644 --- a/source/parser/ast/ast.h +++ b/source/parser/ast/ast.h @@ -8,6 +8,9 @@ typedef unsigned int ASTNodeType; +// This is defined elsewhere. We need to declare it here so we can use it +class IVisitor; + class AST { protected: @@ -22,16 +25,17 @@ class AST 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* children(void); + std::list* 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 -- 2.51.0