saqut-compiler/src/cli/commands/run.hpp

67 lines
2.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ============================================================================
// saQut CLI — run komutu (pipeline: token → AST → IR debug)
// ============================================================================
//
// TODO: İleride `saqut -` ile stdin'den okuyup anında çalıştıracak
// interpreter modu bu komutun altına gelecek.
//
// ============================================================================
#ifndef SAQUT_CLI_RUN
#define SAQUT_CLI_RUN
#include <iostream>
#include "cli/args.hpp"
#include "tokenizer/tokenizer.hpp"
#include "parser/parser.hpp"
#include "ir/ir.hpp"
inline int cmdRun(const CliArgs& args) {
std::string source = readSource(args);
if (source.empty()) return 1;
Tokenizer tokenizer;
auto tokens = tokenizer.scan(source, inputFilePath(args));
std::cout << "=== saQut Compiler ===\n";
std::cout << "Kaynak kod:\n" << source << "\n\n";
std::cout << "Tokenler (" << tokens.size() << " adet):\n";
for (auto* t : tokens) {
std::cout << " [" << t->gettype() << "] \"" << t->token << "\"\n";
}
std::cout << "\n";
Parser parser;
ASTNode* ast = parser.parse(tokens);
if (ast) {
std::cout << "AST:\n";
ast->log(0);
std::cout << "\n";
CodeGenerator cg;
cg.parse(ast);
std::cout << "IR (" << cg.IROpDatas.size() << " komut):\n";
for (size_t i = 0; i < cg.IROpDatas.size(); i++) {
auto& op = cg.IROpDatas[i];
std::cout << " [" << i << "] reg" << op.targetReg << " = ";
switch (op.op) {
case OPCode::mathadd: std::cout << "add"; break;
case OPCode::mathsub: std::cout << "sub"; break;
case OPCode::mathmul: std::cout << "mul"; break;
case OPCode::mathdiv: std::cout << "div"; break;
case OPCode::declare: std::cout << "literal"; break;
}
std::cout << " (" << op.arg1.value.index() << ")\n";
}
delete ast;
}
for (auto* t : tokens) delete t;
return 0;
}
#endif // SAQUT_CLI_RUN