PorygonLang/src/Script.cpp

60 lines
1.5 KiB
C++
Raw Normal View History

2019-05-21 10:59:15 +00:00
#include <utility>
2019-05-28 15:49:03 +00:00
#include <unordered_map>
2019-05-21 10:59:15 +00:00
#include "Script.hpp"
2019-05-21 11:56:08 +00:00
#include "Parser/Lexer.hpp"
#include "Parser/Parser.hpp"
#include "Binder/Binder.hpp"
2019-05-21 10:59:15 +00:00
2019-05-28 15:49:03 +00:00
Script* Script::Create(string script) {
auto s = new Script();
s -> Parse(std::move(script));
2019-05-21 10:59:15 +00:00
return s;
}
2019-05-23 16:50:09 +00:00
Script::Script() {
Diagnostics = new class Diagnostics();
_evaluator = new Evaluator(this);
_lastValue = nullptr;
BoundScript = nullptr;
_scriptVariables = new unordered_map<int, EvalValue*>(0);
2019-05-23 16:50:09 +00:00
}
void Script::Evaluate() {
_evaluator->Evaluate(BoundScript);
}
2019-05-21 12:15:39 +00:00
Script::~Script() {
delete this -> Diagnostics;
delete this -> BoundScript;
delete this -> _lastValue;
delete this -> _evaluator;
2019-05-29 13:00:41 +00:00
for (auto v : *this -> _scriptVariables){
delete v.second;
}
this->_scriptVariables->clear();
delete this->_scriptVariables;
2019-05-21 12:15:39 +00:00
}
2019-05-21 10:59:15 +00:00
void Script::Parse(string script) {
2019-05-21 11:56:08 +00:00
auto lexer = Lexer(std::move(script), this);
2019-05-21 10:59:15 +00:00
auto lexResult = lexer.Lex();
2019-05-21 12:00:14 +00:00
auto parser = Parser(lexResult, this);
2019-05-21 10:59:15 +00:00
auto parseResult = parser.Parse();
for (auto token : lexResult){
delete token;
}
lexResult.clear();
if (!Diagnostics->HasErrors()){
2019-05-28 15:49:03 +00:00
unordered_map<int, BoundVariable*> scriptScope;
auto bindScope = new BoundScope(&scriptScope);
this->BoundScript = Binder::Bind(this, parseResult, bindScope);
for (const auto& v : scriptScope){
this->_scriptVariables -> insert({v.first, nullptr});
2019-05-28 15:49:03 +00:00
delete v.second;
}
scriptScope.clear();
}
delete parseResult;
2019-05-21 10:59:15 +00:00
}
2019-05-21 12:15:39 +00:00