Merge branch 'lab2-IRGen'
This commit is contained in:
@@ -1,7 +1,8 @@
|
|||||||
#include "IR.h"
|
// SysYIRGenerator.cpp
|
||||||
#include <any>
|
// TODO:类型转换及其检查
|
||||||
#include <memory>
|
// TODO:sysy库函数处理
|
||||||
using namespace std;
|
// TODO:数组处理
|
||||||
|
// TODO:对while、continue、break的测试
|
||||||
#include "SysYIRGenerator.h"
|
#include "SysYIRGenerator.h"
|
||||||
|
|
||||||
namespace sysy {
|
namespace sysy {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user