diff --git a/src/SysYIRGenerator.cpp b/src/SysYIRGenerator.cpp index 7ddee8e..b69a7a6 100644 --- a/src/SysYIRGenerator.cpp +++ b/src/SysYIRGenerator.cpp @@ -1,7 +1,8 @@ -#include "IR.h" -#include -#include -using namespace std; +// SysYIRGenerator.cpp +// TODO:类型转换及其检查 +// TODO:sysy库函数处理 +// TODO:数组处理 +// TODO:对while、continue、break的测试 #include "SysYIRGenerator.h" namespace sysy { diff --git a/src/SysYIRGenerator.h b/src/SysYIRGenerator.h index 26969a3..1964e37 100644 --- a/src/SysYIRGenerator.h +++ b/src/SysYIRGenerator.h @@ -1,7 +1,4 @@ #pragma once - -#include "IR.h" -#include "IRBuilder.h" #include "SysYBaseVisitor.h" #include "SysYParser.h" #include @@ -73,6 +70,10 @@ 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 b509fab..b111ffb 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; } - // parse sysy source to AST + // 解析 SysY 源码为 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,26 +78,20 @@ 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