Operators like <=, > work now. Only logical are left know.

functions
Justyna Ilczuk 2012-12-22 15:43:51 +01:00
parent c6e3678f15
commit eed9925160
4 changed files with 112 additions and 5 deletions

View File

@ -90,6 +90,22 @@ SenchaObject BasicExpression::evaluate()
{
so = SenchaObject(right != left);
}
else if(oper == ">")
{
so = SenchaObject(left > right);
}
else if(oper == ">=")
{
so = SenchaObject(left >= right);
}
else if(oper == "<=")
{
so = SenchaObject(left <= right);
}
else if(oper == "<")
{
so = SenchaObject(left < right);
}
return so;
}

View File

@ -223,7 +223,7 @@ SenchaObject SenchaObject::operator/(const SenchaObject& right)const
}
SenchaObject SenchaObject::operator==(const SenchaObject& right)const
{
{
SenchaObject result;
bool value = false;
result.type = boolean;
@ -254,10 +254,10 @@ SenchaObject SenchaObject::operator==(const SenchaObject& right)const
result.truthy = value;
return result;
}
}
SenchaObject SenchaObject::operator!=(const SenchaObject& right)const
{
SenchaObject SenchaObject::operator!=(const SenchaObject& right) const
{
SenchaObject result;
result.type = boolean;
@ -267,6 +267,91 @@ SenchaObject SenchaObject::operator!=(const SenchaObject& right)const
else result.truthy = true;
return result;
}
SenchaObject SenchaObject::operator>(const SenchaObject& right) const
{
SenchaObject result;
bool value = false;
result.type = boolean;
if(type == right.type)
{
switch(type){
case string_literal:
if(this->text > right.text)
{
value = true;
}
break;
case integer_number:
if(this->integer > right.integer)
{
value = true;
}
break;
case float_number:
if(this->number > right.number)
{
value = true;
}
break;
}
}
else if(type == float_number && right.type == integer_number )
{
value = (this->number > right.integer);
}
else if(type == integer_number && right.type == float_number)
{
value = (this->integer > right.number);
}
result.truthy = value;
return result;
}
SenchaObject SenchaObject::operator>= (const SenchaObject& right) const
{
SenchaObject result;
bool value = false;
result.type = boolean;
if((*this == right).truthy || ((*this) > right).truthy)
{
value = true;
}
result.truthy = value;
return result;
}
SenchaObject SenchaObject::operator< (const SenchaObject& right) const
{
SenchaObject result;
bool value = false;
result.type = boolean;
if(!((*this) >= right).truthy)
{
value = true;
}
result.truthy = value;
return result;
}
SenchaObject SenchaObject::operator<= (const SenchaObject& right) const
{
SenchaObject result;
bool value = false;
result.type = boolean;
if(!((*this) > right).truthy)
{
value = true;
}
result.truthy = value;
return result;
}
//TODO change code above to something more generic

View File

@ -82,8 +82,11 @@ public:
SenchaObject(double number) { set_value(number); }
SenchaObject(std::string text) { set_value(text); }
//TODO overload operators as it should be done
virtual SenchaObject operator< (const SenchaObject& right)const;
virtual SenchaObject operator> (const SenchaObject& right)const;
virtual SenchaObject operator<= (const SenchaObject& right)const;
virtual SenchaObject operator>= (const SenchaObject& right)const;
virtual SenchaObject operator+(const SenchaObject& right)const;
virtual SenchaObject operator-(const SenchaObject& right)const;
virtual SenchaObject operator*(const SenchaObject& right)const;
@ -92,6 +95,7 @@ public:
virtual SenchaObject operator!=(const SenchaObject& right)const;
virtual ~SenchaObject();
};

View File

@ -289,6 +289,8 @@ void ASTInspector::visit(VariableExpression * variable)
visit_notes += "VariableExpression:\n";
visit_notes += "Name: " + variable->name + "\n";
visit_notes += "Currently has a value:\n";
visit_notes += variable->evaluate().repr();
write_report(visit_notes);
write_report("End of VariableExpression\n");