From df209f976e7532c2b1a9e62d61b107b8f9846f9d Mon Sep 17 00:00:00 2001 From: Lixuanwang Date: Fri, 30 May 2025 02:13:17 +0800 Subject: [PATCH] fixed bugs brought out by merging --- src/SysYIRGenerator.cpp | 4 ++++ src/SysYIRGenerator.h | 6 ++---- src/sysyc.cpp | 30 ++++++++++++++++++------------ 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/SysYIRGenerator.cpp b/src/SysYIRGenerator.cpp index b69a7a6..a2962c7 100644 --- a/src/SysYIRGenerator.cpp +++ b/src/SysYIRGenerator.cpp @@ -3,6 +3,10 @@ // TODO:sysy库函数处理 // TODO:数组处理 // TODO:对while、continue、break的测试 +#include "IR.h" +#include +#include +using namespace std; #include "SysYIRGenerator.h" namespace sysy { diff --git a/src/SysYIRGenerator.h b/src/SysYIRGenerator.h index 1964e37..3c89ce0 100644 --- a/src/SysYIRGenerator.h +++ b/src/SysYIRGenerator.h @@ -1,4 +1,6 @@ #pragma once +#include "IR.h" +#include "IRBuilder.h" #include "SysYBaseVisitor.h" #include "SysYParser.h" #include @@ -70,10 +72,6 @@ private: }; class SysYIRGenerator : public SysYBaseVisitor { -public: - std::string generateIR(SysYParser::CompUnitContext* unit); - std::string getIR() const { return irStream.str(); } - private: std::unique_ptr module; IRBuilder builder; diff --git a/src/sysyc.cpp b/src/sysyc.cpp index b111ffb..b509fab 100644 --- a/src/sysyc.cpp +++ b/src/sysyc.cpp @@ -52,14 +52,14 @@ void parseArgs(int argc, char **argv) { int main(int argc, char **argv) { parseArgs(argc, argv); - // 打开输入文件 + // open the input file ifstream fin(argInputFile); if (not fin) { cerr << "Failed to open file " << argv[1]; return EXIT_FAILURE; } - // 解析 SysY 源码为 AST + // parse sysy source to AST ANTLRInputStream input(fin); SysYLexer lexer(&input); CommonTokenStream tokens(&lexer); @@ -70,7 +70,7 @@ int main(int argc, char **argv) { return EXIT_SUCCESS; } - // 格式化输入文件 + // pretty format the input file if (argFormat) { ASTPrinter printer; printer.visitCompUnit(moduleAST); @@ -78,20 +78,26 @@ int main(int argc, char **argv) { } // visit AST to generate IR - SysYIRGenerator generator; - generator.visitCompUnit(moduleAST); - auto moduleIR = generator.get(); + if (argStopAfter == "ir") { + SysYIRGenerator generator; + generator.visitCompUnit(moduleAST); + auto moduleIR = generator.get(); moduleIR->print(cout); return EXIT_SUCCESS; + } else if (argStopAfter == "llvmir") { + LLVMIRGenerator llvmirGenerator; + llvmirGenerator.generateIR(moduleAST); // 使用公共接口生成 IR + cout << llvmirGenerator.getIR(); + return EXIT_SUCCESS; } - // generate assembly - CodeGen codegen(moduleIR); - string asmCode = codegen.code_gen(); - cout << asmCode << endl; - if (argStopAfter == "asm") - return EXIT_SUCCESS; + // // generate assembly + // CodeGen codegen(moduleIR); + // string asmCode = codegen.code_gen(); + // cout << asmCode << endl; + // if (argStopAfter == "asm") + // return EXIT_SUCCESS; return EXIT_SUCCESS; } \ No newline at end of file