#ifndef PORYGONLANG_SCRIPT_HPP #define PORYGONLANG_SCRIPT_HPP #include #include #include #include "Diagnostics/DiagnosticsHolder.hpp" #include "Binder/BoundStatements/BoundStatement.hpp" #include "Evaluator/Evaluator.hpp" #include "Evaluator/EvalValues/EvalValue.hpp" #include "Utilities/HashedString.hpp" #include "ScriptOptions.hpp" using namespace std; using namespace Porygon::Evaluation; namespace Porygon{ class Script { Evaluator* _evaluator; map* _scriptVariables; unordered_map>* _scriptTypes; shared_ptr _boundScript; shared_ptr _returnType = nullptr; ScriptOptions* _scriptOptions; public: shared_ptr Diagnostics; private: std::string _treeString; explicit Script(const u16string&, ScriptOptions*); Script(shared_ptr boundScript, shared_ptr diagnostics); void Parse(const u16string& script); public: static Script* Create(const u16string& script, ScriptOptions* = nullptr); static Script* Create(const string& script, ScriptOptions* = nullptr); static Script* Clone(const Script* script); ~Script(); inline shared_ptr GetReturnType(){ return _returnType; } inline void SetReturnType(const shared_ptr& t){ _returnType = t; } [[nodiscard]] inline const ScriptOptions* GetScriptOptions() const{ if (_scriptOptions == nullptr){ return ScriptOptions::GetDefaultScriptOptions(); } return _scriptOptions; } EvalValuePointer Evaluate(); const EvalValue* GetVariable(const u16string& key); bool HasVariable(const u16string& key); shared_ptr GetVariableType(const Utilities::HashedString& key){ return _scriptTypes->at(key); } const EvalValue* CallFunction(const u16string& key, const vector& variables); bool HasFunction(const u16string& key); const map* GetScriptVariables(){ return _scriptVariables; } std::string GetTreeString(); }; } #endif //PORYGONLANG_SCRIPT_HPP