Merge branch 'lab2-IRGen'

This commit is contained in:
Lixuanwang
2025-05-30 02:06:43 +08:00
3 changed files with 21 additions and 25 deletions

View File

@@ -1,7 +1,8 @@
#include "IR.h" // SysYIRGenerator.cpp
#include <any> // TODO类型转换及其检查
#include <memory> // TODOsysy库函数处理
using namespace std; // TODO数组处理
// TODO对while、continue、break的测试
#include "SysYIRGenerator.h" #include "SysYIRGenerator.h"
namespace sysy { namespace sysy {

View File

@@ -1,7 +1,4 @@
#pragma once #pragma once
#include "IR.h"
#include "IRBuilder.h"
#include "SysYBaseVisitor.h" #include "SysYBaseVisitor.h"
#include "SysYParser.h" #include "SysYParser.h"
#include <memory> #include <memory>
@@ -73,6 +70,10 @@ private:
}; };
class SysYIRGenerator : public SysYBaseVisitor { class SysYIRGenerator : public SysYBaseVisitor {
public:
std::string generateIR(SysYParser::CompUnitContext* unit);
std::string getIR() const { return irStream.str(); }
private: private:
std::unique_ptr<Module> module; std::unique_ptr<Module> module;
IRBuilder builder; IRBuilder builder;

View File

@@ -52,14 +52,14 @@ void parseArgs(int argc, char **argv) {
int main(int argc, char **argv) { int main(int argc, char **argv) {
parseArgs(argc, argv); parseArgs(argc, argv);
// open the input file // 打开输入文件
ifstream fin(argInputFile); ifstream fin(argInputFile);
if (not fin) { if (not fin) {
cerr << "Failed to open file " << argv[1]; cerr << "Failed to open file " << argv[1];
return EXIT_FAILURE; return EXIT_FAILURE;
} }
// parse sysy source to AST // 解析 SysY 源码为 AST
ANTLRInputStream input(fin); ANTLRInputStream input(fin);
SysYLexer lexer(&input); SysYLexer lexer(&input);
CommonTokenStream tokens(&lexer); CommonTokenStream tokens(&lexer);
@@ -70,7 +70,7 @@ int main(int argc, char **argv) {
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
// pretty format the input file // 格式化输入文件
if (argFormat) { if (argFormat) {
ASTPrinter printer; ASTPrinter printer;
printer.visitCompUnit(moduleAST); printer.visitCompUnit(moduleAST);
@@ -78,26 +78,20 @@ int main(int argc, char **argv) {
} }
// visit AST to generate IR // visit AST to generate IR
SysYIRGenerator generator;
generator.visitCompUnit(moduleAST);
auto moduleIR = generator.get();
if (argStopAfter == "ir") { if (argStopAfter == "ir") {
SysYIRGenerator generator;
generator.visitCompUnit(moduleAST);
auto moduleIR = generator.get();
moduleIR->print(cout); moduleIR->print(cout);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} else if (argStopAfter == "llvmir") {
LLVMIRGenerator llvmirGenerator;
llvmirGenerator.generateIR(moduleAST); // 使用公共接口生成 IR
cout << llvmirGenerator.getIR();
return EXIT_SUCCESS;
} }
// // generate assembly // generate assembly
// CodeGen codegen(moduleIR); CodeGen codegen(moduleIR);
// string asmCode = codegen.code_gen(); string asmCode = codegen.code_gen();
// cout << asmCode << endl; cout << asmCode << endl;
// if (argStopAfter == "asm") if (argStopAfter == "asm")
// return EXIT_SUCCESS; return EXIT_SUCCESS;
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }