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
---
cli/main.cpp | 86 +++++++++++++++++++++++++++++-------------
1 files changed, 59 insertions(+), 27 deletions(-)
diff --git a/cli/main.cpp b/cli/main.cpp
index 65dca3a..f0daa59 100644
--- a/cli/main.cpp
+++ b/cli/main.cpp
@@ -5,9 +5,11 @@
#include "options.h"
#include "VoidScript.hpp"
+// Supported command-line parameters and descriptions
const std::unordered_map<std::string, std::string> params = {
- { "--help", "Print this help message" },
- { "--version", "Print the version of the program" },
+ { "--help", "Print this help message" },
+ { "--version", "Print the version of the program" },
+ { "--debug", "Enable debug output (all components or use --debug=lexer, parser, interpreter, symboltable)" },
};
int main(int argc, char * argv[]) {
@@ -15,38 +17,67 @@
for (const auto & [key, value] : params) {
usage.append(" [" + key + "]");
}
- if (argc < 2) {
- std::cerr << usage << "\n";
- return 1;
- }
+ // Parse arguments: allow --help, --version, --debug[=component], and a single file
+ bool debugLexer = false;
+ bool debugParser = false;
+ bool debugInterp = false;
+ bool debugSymbolTable = false;
std::string file;
-
- const std::string arg = std::string(argv[1]);
- if (arg.starts_with("-")) {
- auto it = params.find(arg);
- if (it != params.end()) {
- if (arg == "--help") {
- std::cout << usage << "\n";
- for (const auto & [key, value] : params) {
- std::cout << " " << key << ": " << value << "\n";
- }
- return 0;
- }
- if (arg == "--version") {
- std::cout << "Version: " << VERSION_MAJOR << "." << VERSION_MINOR << "." << VERSION_PATCH;
- std::cout << " (" << VERSION_GIT_HASH << ")\n";
- std::cout << "Architecture: " << VERSION_ARCH << "\n";
- std::cout << "System: " << VERSION_SYSTEM_NAME << "\n";
- return 0;
+ for (int i = 1; i < argc; ++i) {
+ std::string a = argv[i];
+ if (a == "--help") {
+ std::cout << usage << "\n";
+ for (const auto & [key, value] : params) {
+ std::cout << " " << key << ": " << value << "\n";
}
return 0;
+ } else if (a == "--version") {
+ std::cout << "Version: " << VERSION_MAJOR << "." << VERSION_MINOR << "." << VERSION_PATCH << " ("
+ << VERSION_GIT_HASH << ")\n";
+ std::cout << "Architecture: " << VERSION_ARCH << "\n";
+ std::cout << "System: " << VERSION_SYSTEM_NAME << "\n";
+ return 0;
+ } else if (a.rfind("--debug", 0) == 0) {
+ if (a == "--debug") {
+ debugLexer = debugParser = debugInterp = true;
+ } else if (a.rfind("--debug=", 0) == 0) {
+ std::string comp = a.substr(std::string("--debug=").size());
+ if (comp == "lexer") {
+ debugLexer = true;
+ } else if (comp == "parser") {
+ debugParser = true;
+ } else if (comp == "interpreter") {
+ debugInterp = true;
+ } else if (comp == "symboltable") {
+ debugSymbolTable = true;
+ } else {
+ std::cerr << "Error: Unknown debug component '" << comp << "'\n";
+ std::cerr << usage << "\n";
+ return 1;
+ }
+ } else {
+ std::cerr << "Error: Unknown option '" << a << "'\n";
+ std::cerr << usage << "\n";
+ return 1;
+ }
+ } else if (a.starts_with("-")) {
+ std::cerr << "Error: Unknown option '" << a << "'\n";
+ std::cerr << usage << "\n";
+ return 1;
+ } else if (file.empty()) {
+ file = a;
+ } else {
+ std::cerr << "Error: Multiple files specified\n";
+ std::cerr << usage << "\n";
+ return 1;
}
- std::cerr << "Error: Unknown option " << arg << "\n";
+ }
+ if (file.empty()) {
+ std::cerr << "Error: No input file specified\n";
std::cerr << usage << "\n";
return 1;
}
- file = arg;
if (!std::filesystem::exists(file)) {
std::cerr << "Error: File " << file << " does not exist.\n";
@@ -55,6 +86,7 @@
const std::string filename = std::filesystem::canonical(file).string();
- VoidScript voidscript(filename);
+ // Initialize and run with debug options
+ VoidScript voidscript(filename, debugLexer, debugParser, debugInterp, debugSymbolTable);
return voidscript.run();
}
--
Gitblit v1.9.3