Files
mysysy/src/sysyc.cpp
2025-06-21 15:40:00 +08:00

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;
}