// 基于语法树的语义检查与名称绑定。
#pragma once

#include <unordered_map>

#include "SysYParser.h"

class SemanticContext {
 public:
  void BindVarUse(SysYParser::PrimaryContext* use,
                  SysYParser::VarDeclContext* decl) {
    var_uses_[use] = decl;
  }

  SysYParser::VarDeclContext* ResolveVarUse(
      const SysYParser::PrimaryContext* use) const {
    auto it = var_uses_.find(use);
    return it == var_uses_.end() ? nullptr : it->second;
  }

 private:
  std::unordered_map<const SysYParser::PrimaryContext*,
                     SysYParser::VarDeclContext*>
      var_uses_;
};

// 目前仅检查：
// - 变量先声明后使用
// - 局部变量不允许重复定义
SemanticContext RunSema(SysYParser::CompUnitContext& comp_unit);
