PorygonLang/src/Evaluator/UnaryEvaluation.cpp

37 lines
1.2 KiB
C++
Raw Normal View History

2019-05-25 12:59:12 +00:00
#include "EvalValues/NumericEvalValue.hpp"
#include "Evaluator.hpp"
#include "EvaluationException.hpp"
#include "../Script.hpp"
shared_ptr<NumericEvalValue> Evaluator::EvaluateIntegerUnary(BoundUnaryExpression *expression) {
2019-05-25 12:59:12 +00:00
switch (expression->GetOperation()){
case BoundUnaryOperation::Negation:
{
auto operandValue = EvaluateIntegerExpression(expression->GetOperand());
if (operandValue->IsFloat()){
double f = operandValue->EvaluateFloat();
return make_shared<FloatEvalValue>(-f);
2019-05-25 12:59:12 +00:00
} else{
long l = operandValue->EvaluateInteger();
return make_shared<IntegerEvalValue>(-l);
2019-05-25 12:59:12 +00:00
}
}
case BoundUnaryOperation::LogicalNegation:
throw;
}
}
shared_ptr<BooleanEvalValue> Evaluator::EvaluateBooleanUnary(BoundUnaryExpression *expression) {
2019-05-25 12:59:12 +00:00
switch (expression->GetOperation()){
case BoundUnaryOperation::LogicalNegation:
{
auto val = EvaluateBoolExpression(expression->GetOperand());
bool b = val->EvaluateBool();
return make_shared<BooleanEvalValue>(!b);
2019-05-25 12:59:12 +00:00
}
case BoundUnaryOperation::Negation:
throw;
}
}