// ============================================================================ // saQut Compiler — CLI Argüman Ayrıştırıcı ve Kaynak Okuma // ============================================================================ // // DİZİN: src/cli/args.hpp // BAĞIMLI: Yok (sadece standart kütüphane) // // AMAÇ: // 1. POSIX tarzı argüman ayrıştırma // 2. Kaynak dosya okuma (tüm komutlar tarafından paylaşılır) // // DESTEKLENEN FORMATLAR: // saqut [dosya] [-o çıktı] [--format json] [--help] // saqut run file:source.sqt (eski sözdizimi) // saqut - (stdin — TODO) // // ============================================================================ #ifndef SAQUT_CLI_ARGS #define SAQUT_CLI_ARGS #include #include #include #include #include struct CliArgs { std::string command; std::vector positional; std::string outputFile; std::string format; bool showHelp = false; bool stdinMode = false; }; // ============================================================================ // parseArgs // ============================================================================ inline CliArgs parseArgs(int argc, char* argv[]) { CliArgs args; for (int i = 1; i < argc; i++) { std::string arg = argv[i]; if (arg == "-") { args.stdinMode = true; continue; } if (arg == "-h" || arg == "--help") { args.showHelp = true; continue; } if (arg.compare(0, 9, "--output=") == 0) { args.outputFile = arg.substr(9); continue; } if (arg.compare(0, 9, "--format=") == 0) { args.format = arg.substr(9); continue; } if (arg == "--output" || arg == "-o") { if (i + 1 < argc) args.outputFile = argv[++i]; continue; } if (arg == "--format") { if (i + 1 < argc) args.format = argv[++i]; continue; } if (arg.compare(0, 5, "file:") == 0) { args.positional.push_back(arg.substr(5)); continue; } if (arg.compare(0, 7, "output:") == 0) { args.outputFile = arg.substr(7); continue; } if (arg.compare(0, 4, "ast:") == 0) { args.outputFile = arg.substr(4); continue; } // İlk argüman komut mu? if (args.command.empty() && i == 1) { if (arg == "run" || arg == "tokens" || arg == "ast" || arg == "symbols" || arg == "compile" || arg == "parse" || arg == "transpile" || arg == "interpret") { args.command = arg; continue; } args.command = "run"; args.positional.push_back(arg); continue; } args.positional.push_back(arg); } if (args.command.empty()) args.command = "run"; if (args.positional.empty() && !args.stdinMode) args.positional.push_back("source.sqt"); return args; } // ============================================================================ // readSource: Dosyadan veya stdin'den kaynak kod oku (TODO: stdin) // ============================================================================ inline std::string readSource(const CliArgs& args) { if (args.stdinMode) { // TODO: std::cin'den EOF'a kadar oku std::cerr << "TODO: stdin modu henüz desteklenmiyor\n"; return ""; } if (args.positional.empty()) return ""; std::string path = args.positional[0]; std::ifstream file(path, std::ios::in | std::ios::binary); if (!file.is_open()) { std::cerr << "Hata: '" << path << "' dosyası açılamadı\n"; return ""; } std::stringstream buffer; buffer << file.rdbuf(); return buffer.str(); } #endif // SAQUT_CLI_ARGS