From ba9a9199d01b0fdd4bf9a54914f8058bf71f30c5 Mon Sep 17 00:00:00 2001
From: Ferenc Szontágh <szf@fsociety.hu>
Date: Thu, 17 Apr 2025 16:03:01 +0000
Subject: [PATCH] unary and binary operations
---
src/VoidScript.hpp | 82 +++++++++++++++++++----------------------
1 files changed, 38 insertions(+), 44 deletions(-)
diff --git a/src/VoidScript.hpp b/src/VoidScript.hpp
index d1188b5..4f0aed4 100644
--- a/src/VoidScript.hpp
+++ b/src/VoidScript.hpp
@@ -5,74 +5,68 @@
#include <fstream>
#include <string>
+#include "Interpreter/Interpreter.hpp"
#include "Lexer/Lexer.hpp"
#include "Parser/Parser.hpp"
class VoidScript {
private:
- std::string file;
+ std::vector<std::string> files;
std::shared_ptr<Lexer::Lexer> lexer = nullptr;
std::shared_ptr<Parser::Parser> parser = nullptr;
- std::string file_content;
- public:
- VoidScript(const std::string & file) : file(file) {
+ static std::string readFile(const std::string & file) {
if (!std::filesystem::exists(file)) {
throw std::runtime_error("File " + file + " does not exits");
}
- lexer = std::make_shared<Lexer::Lexer>();
- parser = std::make_shared<Parser::Parser>();
-
- 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);
+ return "";
}
- file_content = std::string((std::istreambuf_iterator<char>(input)), std::istreambuf_iterator<char>());
+ std::string content = std::string((std::istreambuf_iterator<char>(input)), std::istreambuf_iterator<char>());
input.close();
+ return content;
+ }
+
+ public:
+ VoidScript(const std::string & file) :
+
+ lexer(std::make_shared<Lexer::Lexer>()),
+ parser(std::make_shared<Parser::Parser>()) {
+ this->files.emplace(this->files.begin(), file);
+
+ lexer->setKeyWords(Parser::Parser::keywords);
}
int run() {
try {
- this->lexer->addNamespaceInput(this->file, this->file_content);
- const auto tokens = this->lexer->tokenizeNamespace(this->file);
+ while (!files.empty()) {
+ std::string file = files.back();
+ const std::string file_content = readFile(file);
+ files.pop_back();
- 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<Symbols::SymbolContainer> & symbol_container = parser->getSymbolContainer();
+ std::string _default_namespace_ = file;
+ std::replace(_default_namespace_.begin(), _default_namespace_.end(), '.', '_');
- 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<Symbols::VariableSymbol>(symbol_ptr)) {
- std::cout << var_symbol->toString() << '\n';
- }
- }
+ Symbols::SymbolContainer::instance()->create(_default_namespace_);
- std::cout << "\n--- Defined Functions ---" << '\n';
- for (const auto & symbol_ptr : symbol_container->listNamespace("functions")) {
- if (auto func_symbol = std::dynamic_pointer_cast<Symbols::FunctionSymbol>(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';
- }
- }
+
+ const std::string ns = Symbols::SymbolContainer::instance()->currentScopeName();
+
+ this->lexer->addNamespaceInput(ns, file_content);
+ const auto tokens = this->lexer->tokenizeNamespace(ns);
+
+ std::cout << Operations::Container::dump() << "\n";
+
+ parser->parseScript(tokens, file_content, file);
+
+ Interpreter::Interpreter interpreter;
+ interpreter.run();
+
+ std::cout << Symbols::SymbolContainer::dump() << "\n";
+ } // while (!files.empty())
return 0;
} catch (const Parser::SyntaxError & e) {
--
Gitblit v1.9.3