From c91e935c62b8e254b9daadf37b915c983518bff4 Mon Sep 17 00:00:00 2001
From: Ferenc Szontágh <szf@fsociety.hu>
Date: Fri, 18 Apr 2025 16:25:35 +0000
Subject: [PATCH] add dynamic module load, more escape seq
---
src/VoidScript.hpp | 50 ++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 42 insertions(+), 8 deletions(-)
diff --git a/src/VoidScript.hpp b/src/VoidScript.hpp
index 5fa3ef0..6ed0e02 100644
--- a/src/VoidScript.hpp
+++ b/src/VoidScript.hpp
@@ -6,12 +6,18 @@
#include "Interpreter/Interpreter.hpp"
#include "Lexer/Lexer.hpp"
-#include "Parser/Parser.hpp"
#include "Modules/ModuleManager.hpp"
+#include "Modules/PrintNlModule.hpp"
#include "Modules/PrintModule.hpp"
+#include "Parser/Parser.hpp"
class VoidScript {
private:
+ // Debug flags for various components
+ bool debugLexer_ = false;
+ bool debugParser_ = false;
+ bool debugInterpreter_ = false;
+ bool debugSymbolTable_ = false;
std::vector<std::string> files;
std::shared_ptr<Lexer::Lexer> lexer = nullptr;
std::shared_ptr<Parser::Parser> parser = nullptr;
@@ -31,12 +37,23 @@
}
public:
- VoidScript(const std::string & file) :
-
+ /**
+ * @param file initial script file
+ * @param debugLexer enable lexer debug output
+ * @param debugParser enable parser debug output
+ * @param debugInterpreter enable interpreter debug output
+ */
+ VoidScript(const std::string & file, bool debugLexer = false, bool debugParser = false,
+ bool debugInterpreter = false, bool debugSymbolTable = false) :
+ debugLexer_(debugLexer),
+ debugParser_(debugParser),
+ debugInterpreter_(debugInterpreter),
+ debugSymbolTable_(debugSymbolTable),
lexer(std::make_shared<Lexer::Lexer>()),
parser(std::make_shared<Parser::Parser>()) {
// Register built-in modules (print, etc.)
Modules::ModuleManager::instance().addModule(std::make_unique<Modules::PrintModule>());
+ Modules::ModuleManager::instance().addModule(std::make_unique<Modules::PrintNlModule>());
this->files.emplace(this->files.begin(), file);
lexer->setKeyWords(Parser::Parser::keywords);
@@ -44,7 +61,10 @@
int run() {
try {
- // Register all built-in modules before execution
+ // Load plugin modules from 'modules' directory (case-insensitive)
+ Modules::ModuleManager::instance().loadPlugins("modules");
+ Modules::ModuleManager::instance().loadPlugins("Modules");
+ // Register all built-in and plugin modules before execution
Modules::ModuleManager::instance().registerAll();
while (!files.empty()) {
std::string file = files.back();
@@ -60,18 +80,32 @@
this->lexer->addNamespaceInput(ns, file_content);
const auto tokens = this->lexer->tokenizeNamespace(ns);
+ if (debugLexer_) {
+ std::cerr << "[Debug][Lexer] Tokens for namespace '" << ns << "':\n";
+ for (const auto & tok : tokens) {
+ std::cerr << tok.dump();
+ }
+ }
parser->parseScript(tokens, file_content, file);
+ if (debugParser_) {
+ std::cerr << "[Debug][Parser] Operations for namespace '" << ns << "':\n";
+ for (const auto & op : Operations::Container::instance()->getAll(ns)) {
+ std::cerr << op->toString() << "\n";
+ }
+ }
- Interpreter::Interpreter interpreter;
+ // Execute interpreter with optional debug output
+ Interpreter::Interpreter interpreter(debugInterpreter_);
interpreter.run();
-
- std::cout << Symbols::SymbolContainer::dump() << "\n";
+ if (debugSymbolTable_) {
+ std::cout << Symbols::SymbolContainer::dump() << "\n";
+ }
} // while (!files.empty())
return 0;
} catch (const std::exception & e) {
- std::cerr << e.what() << '\n';
+ std::cerr << e.what() << '\n';
return 1;
}
return 1;
--
Gitblit v1.9.3