#include #include #include #include using namespace std; #include "SysYLexer.h" #include "SysYParser.h" using namespace antlr4; #include "ASTPrinter.h" #include "Backend.h" #include "SysYIRGenerator.h" #include "LLVMIRGenerator.h" using namespace sysy; static string argStopAfter; static string argInputFile; static bool argFormat = false; void usage(int code = EXIT_FAILURE) { const char *msg = "Usage: sysyc [options] inputfile\n\n" "Supported options:\n" " -h \tprint help message and exit\n"; " -f \tpretty-format the input file\n"; " -s {ast,ir,asm,llvmir}\tstop after generating AST/IR/Assembly\n"; cerr << msg; exit(code); } void parseArgs(int argc, char **argv) { const char *optstr = "hfs:"; int opt = 0; while ((opt = getopt(argc, argv, optstr)) != -1) { switch (opt) { case 'h': usage(EXIT_SUCCESS); break; case 'f': argFormat = true; break; case 's': argStopAfter = optarg; break; default: /* '?' */ usage(); } } if (optind >= argc) usage(); argInputFile = argv[optind]; } 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 ANTLRInputStream input(fin); SysYLexer lexer(&input); CommonTokenStream tokens(&lexer); SysYParser parser(&tokens); auto moduleAST = parser.compUnit(); if (argStopAfter == "ast") { cout << moduleAST->toStringTree(true) << '\n'; return EXIT_SUCCESS; } // visit AST to generate IR 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; return EXIT_SUCCESS; }