#ifndef VOIDSCRIPT_HPP #define VOIDSCRIPT_HPP #include #include #include #include "Lexer/Lexer.hpp" #include "Parser/Parser.hpp" class VoidScript { private: std::string file; std::shared_ptr lexer = nullptr; std::shared_ptr parser = nullptr; std::string file_content; public: VoidScript(const std::string & file) : file(file) { if (!std::filesystem::exists(file)) { throw std::runtime_error("File " + file + " does not exits"); } lexer = std::make_shared(); parser = std::make_shared(); lexer->setKeyWords(Parser::Parser::keywords); // read in the file std::ifstream input(file, std::ios::in); if (!input.is_open()) { throw std::runtime_error("Could not open file " + file); } file_content = std::string((std::istreambuf_iterator(input)), std::istreambuf_iterator()); input.close(); } int run() { try { this->lexer->addNamespaceInput(this->file, this->file_content); const auto tokens = this->lexer->tokenizeNamespace(this->file); std::cout << "--- Tokens ---" << '\n'; for (const auto & token : tokens) { if (token.type != Lexer::Tokens::Type::END_OF_FILE) { //token.print(); } } std::cout << "--------------" << '\n'; parser->parseProgram(tokens, this->file_content); const std::shared_ptr & symbol_container = parser->getSymbolContainer(); std::cout << "\n--- Defined Variables ---" << '\n'; for (const auto & symbol_ptr : symbol_container->listNamespace("variables")) { // Itt lehetne a szimbólumokat kiírni vagy tovább feldolgozni // Szükséges lehet dynamic_cast<> a konkrét típushoz (VariableSymbol) if (auto var_symbol = std::dynamic_pointer_cast(symbol_ptr)) { std::cout << var_symbol->toString() << '\n'; } } std::cout << "\n--- Defined Functions ---" << '\n'; for (const auto & symbol_ptr : symbol_container->listNamespace("functions")) { if (auto func_symbol = std::dynamic_pointer_cast(symbol_ptr)) { std::cout << "Func Name: " << func_symbol->name() << " return type: " << Symbols::Variables::TypeToString(func_symbol->returnType()) << '\n'; for (const auto & func_param : func_symbol->parameters()) { std::cout << " Param: " << func_param.name << " Type: " << Symbols::Variables::TypeToString(func_param.type) << '\n'; } std::cout << " Context name: " << func_symbol->context() << '\n'; std::cout << " Plain body: " << func_symbol->plainBody() << '\n'; } } return 0; } catch (const Parser::SyntaxError & e) { std::cerr << "Syntax Error during parsing: " << e.what() << '\n'; return 1; } catch (const std::exception & e) { std::cerr << "An error occurred: " << e.what() << '\n'; return 1; } return 1; } }; // class VoidScript #endif // VOIDSCRIPT_HPP