#ifndef VOIDSCRIPT_HPP #define VOIDSCRIPT_HPP #include #include #include #include "Interpreter/Interpreter.hpp" #include "Lexer/Lexer.hpp" #include "Parser/Parser.hpp" #include "Modules/ModuleManager.hpp" #include "Modules/PrintModule.hpp" class VoidScript { private: std::vector files; std::shared_ptr lexer = nullptr; std::shared_ptr parser = nullptr; static std::string readFile(const std::string & file) { if (!std::filesystem::exists(file)) { throw std::runtime_error("File " + file + " does not exits"); } std::ifstream input(file, std::ios::in); if (!input.is_open()) { throw std::runtime_error("Could not open file " + file); return ""; } std::string content = std::string((std::istreambuf_iterator(input)), std::istreambuf_iterator()); input.close(); return content; } public: VoidScript(const std::string & file) : lexer(std::make_shared()), parser(std::make_shared()) { // Register built-in modules (print, etc.) Modules::ModuleManager::instance().addModule(std::make_unique()); this->files.emplace(this->files.begin(), file); lexer->setKeyWords(Parser::Parser::keywords); } int run() { try { // Register all built-in modules before execution Modules::ModuleManager::instance().registerAll(); while (!files.empty()) { std::string file = files.back(); const std::string file_content = readFile(file); files.pop_back(); std::string _default_namespace_ = file; std::replace(_default_namespace_.begin(), _default_namespace_.end(), '.', '_'); Symbols::SymbolContainer::instance()->create(_default_namespace_); const std::string ns = Symbols::SymbolContainer::instance()->currentScopeName(); this->lexer->addNamespaceInput(ns, file_content); const auto tokens = this->lexer->tokenizeNamespace(ns); parser->parseScript(tokens, file_content, file); Interpreter::Interpreter interpreter; interpreter.run(); std::cout << Symbols::SymbolContainer::dump() << "\n"; } // while (!files.empty()) return 0; } catch (const std::exception & e) { std::cerr << e.what() << '\n'; return 1; } return 1; } }; // class VoidScript #endif // VOIDSCRIPT_HPP