#include "irgen/IRGen.h"

#include <stdexcept>

#include "SysYParser.h"
#include "ir/IR.h"
#include "utils/Log.h"

// 语句生成当前只实现了最小子集。
// 目前支持：
// - return <exp>;
//
// 还未支持：
// - 赋值语句
// - if / while 等控制流
// - 空语句、块语句嵌套分发之外的更多语句形态

std::any IRGenImpl::visitStmt(SysYParser::StmtContext* ctx) {
  if (!ctx) {
    throw std::runtime_error(FormatError("irgen", "缺少语句"));
  }
  if (ctx->returnStmt()) {
    return ctx->returnStmt()->accept(this);
  }
  throw std::runtime_error(FormatError("irgen", "暂不支持的语句类型"));
}


std::any IRGenImpl::visitReturnStmt(SysYParser::ReturnStmtContext* ctx) {
  if (!ctx) {
    throw std::runtime_error(FormatError("irgen", "缺少 return 语句"));
  }
  if (!ctx->exp()) {
    throw std::runtime_error(FormatError("irgen", "return 缺少表达式"));
  }
  ir::Value* v = EvalExpr(*ctx->exp());
  builder_.CreateRet(v);
  return BlockFlow::Terminated;
}
