compiler-go/test/TCG/SymbolManager.cpp

75 lines
2.9 KiB
C++

#include <iomanip>
#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>(&scope));
block.emplace_back(2, TACOP::SUB, Operand("A"), Operand("C"), Operand("U"), std::shared_ptr<Scope>(&scope));
block.emplace_back(3, TACOP::ADD, Operand("T"), Operand("U"), Operand("V"), std::shared_ptr<Scope>(&scope));
block.emplace_back(4, TACOP::ADD, Operand("V"), Operand("U"), Operand("W"), std::shared_ptr<Scope>(&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;
}