00001 #ifndef BINARY_EXPRESSION_H 00002 #define BINARY_EXPRESSION_H 00003 00004 #include <string> 00005 #include "expression.h" 00006 00007 using namespace std; 00008 00009 class BinaryExpression : public Expression { 00010 private: 00011 Expression *leftExpression; 00012 Expression *rightExpression; 00013 string op; 00014 00015 public: 00016 BinaryExpression(SrcPosition *position, Expression *expression1, Expression *expression2, string op) 00017 : Expression(position), Ast(position), leftExpression(expression1), rightExpression(expression2), op(op) {} 00018 00019 BinaryExpression(const BinaryExpression& binaryExpression) : Expression(binaryExpression.position), Ast(position) { 00020 *(this) = binaryExpression; 00021 } 00022 00023 virtual ~BinaryExpression() { 00024 delete this->leftExpression; 00025 delete this->rightExpression; 00026 } 00027 00028 00029 Expression *getLeftExpression() { 00030 return this->leftExpression; 00031 } 00032 00033 Expression *getRightExpression() { 00034 return this->rightExpression; 00035 } 00036 00037 string getOp() const { 00038 return this->op; 00039 } 00040 00041 virtual Ast& operator = (const Ast& ast); 00042 virtual bool operator == (const Ast& ast) const; 00043 00044 virtual VisitorReturn *visit(Visitor& visitor) { 00045 return visitor.visitBinaryExpression(this); 00046 } 00047 00048 virtual Ast& clone() const { 00049 return *(new BinaryExpression(new SrcPosition(*(this->position)), 00050 this->leftExpression ? dynamic_cast<Expression*>(&(this->leftExpression->clone())) : 0, 00051 this->rightExpression ? dynamic_cast<Expression*>(&(this->rightExpression->clone())) : 0, 00052 this->op)); 00053 } 00054 }; 00055 00056 #endif