PorygonLang/src/Evaluator/UnaryEvaluation.cpp

40 lines
1.3 KiB
C++

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