97 lines
2.3 KiB
C++
97 lines
2.3 KiB
C++
#include <cstdlib>
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include <unistd.h>
|
|
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;
|
|
} |