#include #include "Common/Common.h" #include "Common/Scope.h" #include "Common/TAC.h" #include "TCG/SymbolManager.h" // 西内 void test_init(Scope& scope, SymbolManager& symbol_manager) { TACBlock &block = scope.block; /* TAC 文件 */ block.emplace_back(1, TACOP::ADD, Operand("A"), Operand("B"), Operand("T"), std::shared_ptr(&scope)); block.emplace_back(2, TACOP::SUB, Operand("A"), Operand("C"), Operand("U"), std::shared_ptr(&scope)); block.emplace_back(3, TACOP::ADD, Operand("T"), Operand("U"), Operand("V"), std::shared_ptr(&scope)); block.emplace_back(4, TACOP::ADD, Operand("V"), Operand("U"), Operand("W"), std::shared_ptr(&scope)); std::cout << "TAC文件内容: " << std::endl; for (auto& line : block) { std::cout << line.to_string() << std::endl; } /* 建立符号表 */ scope.para_symbols.emplace("A", Symbol("A", &scope, Symbol::SymbolType::VAR, Symbol::Type::INT)); scope.para_symbols.emplace("B", Symbol("B", &scope, Symbol::SymbolType::VAR, Symbol::Type::INT)); scope.para_symbols.emplace("C", Symbol("C", &scope, Symbol::SymbolType::VAR, Symbol::Type::INT)); scope.para_symbols.emplace("T", Symbol("T", &scope, Symbol::SymbolType::VAR, Symbol::Type::INT)); scope.para_symbols.emplace("U", Symbol("U", &scope, Symbol::SymbolType::VAR, Symbol::Type::INT)); scope.para_symbols.emplace("V", Symbol("V", &scope, Symbol::SymbolType::VAR, Symbol::Type::INT)); scope.para_symbols.emplace("W", Symbol("W", &scope, Symbol::SymbolType::VAR, Symbol::Type::INT)); } void cal_use_info(Scope& scope, SymbolManager& symbol_manager) { TACBlock &block = scope.block; /* 计算待用信息和活跃信息 */ symbol_manager.set_use_info("W", {0, true}); symbol_manager.cal_use_info(); /* 打印结果 */ std::cout << "待用信息和活跃信息: " << std::endl; for (TACLine &line : block) { std::cout << line.to_string() << std::setw(8) << "(" << line.dst.use_info << ")" << std::setw(8) << "(" << line.src1.use_info << ")" << std::setw(8) << "(" << line.src2.use_info << ")" << std::endl; } } void get_reg(Scope& scope, SymbolManager& symbol_manager) { TACBlock &block = scope.block; symbol_manager.set_avalue_reg("A", REG::EAX); symbol_manager.set_avalue_reg("B", REG::EBX); symbol_manager.set_avalue_reg("C", REG::ECX); std::cout << "获取寄存器: " << std::endl; for (TACLine &line : block) { symbol_manager.get_reg(line); std::cout << line.to_string() << std::setw(8) << to_string(symbol_manager.avalue_reg(line.src1.value)) << std::setw(8) << to_string(symbol_manager.avalue_reg(line.src2.value)) << std::setw(8) << to_string(symbol_manager.avalue_reg(line.dst.value)) << std::endl; } } int main() { Scope scope; SymbolManager symbol_manager(scope); test_init(scope, symbol_manager); cal_use_info(scope, symbol_manager); get_reg(scope, symbol_manager); return 0; }