#ifndef PORYGONLANG_EVALUATOR_HPP #define PORYGONLANG_EVALUATOR_HPP #include #include "../Binder/BoundStatements/BoundStatement.hpp" #include "EvalValues/EvalValue.hpp" #include "EvalValues/NumericEvalValue.hpp" #include "EvalValues/StringEvalValue.hpp" #include "EvalValues/StringEvalValue.hpp" #include "EvalValues/ScriptFunctionEvalValue.hpp" #include "EvaluationScope/EvaluationScope.hpp" using namespace std; namespace Porygon::Evaluation{ class Evaluator { shared_ptr _returnValue; map>* _scriptVariables; bool _hasReturned; bool _hasBroken; shared_ptr _lastValue; //Porygon::Script* _scriptData; shared_ptr _evaluationScope; void EvaluateStatement(const BoundStatement* statement); void EvaluateBlockStatement(const BoundBlockStatement *statement); void EvaluateExpressionStatement(const BoundExpressionStatement* statement); void EvaluateAssignmentStatement(const BoundAssignmentStatement* statement); void EvaluateIndexAssignmentStatement(const BoundIndexAssignmentStatement* statement); void EvaluateFunctionDeclarationStatement(const BoundFunctionDeclarationStatement *statement); void EvaluateReturnStatement(const BoundReturnStatement *statement); void EvaluateConditionalStatement(const BoundConditionalStatement *statement); void EvaluateNumericalForStatement(const BoundNumericalForStatement *statement); void EvaluateGenericForStatement(const BoundGenericForStatement *statement); void EvaluateWhileStatement(const BoundWhileStatement *statement); shared_ptr EvaluateExpression(const BoundExpression *expression); shared_ptr EvaluateIntegerExpression(const BoundExpression *expression); shared_ptr EvaluateBoolExpression(const BoundExpression *expression); shared_ptr EvaluateStringExpression(const BoundExpression *expression); shared_ptr EvaluateFunctionExpression(const BoundExpression *expression); shared_ptr EvaluateNilExpression(const BoundExpression *expression); shared_ptr EvaluateTableExpression(const BoundExpression *expression); shared_ptr EvaluateIntegerBinary(const BoundBinaryExpression *expression); shared_ptr EvaluateBooleanBinary(const BoundBinaryExpression *expression); shared_ptr EvaluateStringBinary(const BoundBinaryExpression *expression); shared_ptr EvaluateIntegerUnary(const BoundUnaryExpression *expression); shared_ptr EvaluateBooleanUnary(const BoundUnaryExpression *expression); shared_ptr EvaluateFunctionCallExpression(const BoundExpression *expression); shared_ptr EvaluateIndexExpression(const BoundExpression *expression); shared_ptr EvaluatePeriodIndexExpression(const BoundExpression *expression); shared_ptr EvaluateNumericTableExpression(const BoundExpression *expression); shared_ptr EvaluateUserDataExpression(const BoundExpression *expression); shared_ptr EvaluateComplexTableExpression(const BoundExpression *expression); shared_ptr GetVariable(const BoundVariableExpression *expression); public: explicit Evaluator(map>* scriptVariables) : _scriptVariables(scriptVariables), _hasReturned(false), _hasBroken(false), _returnValue(nullptr), _evaluationScope(nullptr){ } const EvalValue* Evaluate(const BoundScriptStatement* statement); shared_ptr EvaluateFunction(const GenericFunctionEvalValue *function, const vector ¶meters); inline const EvalValue* GetLastValue(){ return _lastValue.get(); } }; } #endif //PORYGONLANG_EVALUATOR_HPP