diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a3af40d..5d71f7f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,11 +1,11 @@ # Generate lexer and parser with ANTLR -list(APPEND CMAKE_MODULE_PATH "${ANTLR_RUNTIME}/cmake") -include(FindANTLR) -antlr_target(SysYGen SysY.g4 - LEXER PARSER - OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - VISITOR -) +# list(APPEND CMAKE_MODULE_PATH "${ANTLR_RUNTIME}/cmake") +# include(FindANTLR) +# antlr_target(SysYGen SysY.g4 +# LEXER PARSER +# OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +# VISITOR +# ) add_library(SysYParser SHARED ${ANTLR_SysYGen_CXX_OUTPUTS}) target_include_directories(SysYParser PUBLIC ${ANTLR_RUNTIME}/runtime/src) @@ -13,9 +13,11 @@ target_link_libraries(SysYParser PUBLIC antlr4_shared) add_executable(sysyc sysyc.cpp + SysYLexer.cpp + SysYParser.cpp + SysYVisitor.cpp IR.cpp SysYIRGenerator.cpp - # Backend.cpp SysYIRPrinter.cpp SysYIROptPre.cpp SysYIRAnalyser.cpp @@ -24,6 +26,7 @@ add_executable(sysyc Reg2Mem.cpp RISCv64Backend.cpp ) + target_include_directories(sysyc PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include) target_compile_options(sysyc PRIVATE -frtti) target_link_libraries(sysyc PRIVATE SysYParser) diff --git a/src/LLVMIRGenerator.cpp b/src/LLVMIRGenerator.cpp deleted file mode 100644 index 0d42ce5..0000000 --- a/src/LLVMIRGenerator.cpp +++ /dev/null @@ -1,674 +0,0 @@ -// LLVMIRGenerator.cpp -// TODO:类型转换及其检查 -// TODO:sysy库函数处理 -// TODO:数组处理 -// TODO:对while、continue、break的测试 -#include "LLVMIRGenerator.h" -#include -using namespace std; -namespace sysy { -std::string LLVMIRGenerator::generateIR(SysYParser::CompUnitContext* unit) { - // 初始化自定义IR数据结构 - irModule = std::make_unique(); - irBuilder = sysy::IRBuilder(); // 初始化IR构建器 - tempCounter = 0; - symbolTable.clear(); - tmpTable.clear(); - globalVars.clear(); - inFunction = false; - - visitCompUnit(unit); - return irStream.str(); -} - -std::string LLVMIRGenerator::getNextTemp() { - std::string ret = "%." + std::to_string(tempCounter++); - tmpTable[ret] = "void"; - return ret; -} - -std::string LLVMIRGenerator::getLLVMType(const std::string& type) { - if (type == "int") return "i32"; - if (type == "float") return "float"; - if (type.find("[]") != std::string::npos) - return getLLVMType(type.substr(0, type.size()-2)) + "*"; - return "i32"; -} - -sysy::Type* LLVMIRGenerator::getSysYType(const std::string& typeStr) { - if (typeStr == "int") return sysy::Type::getIntType(); - if (typeStr == "float") return sysy::Type::getFloatType(); - if (typeStr == "void") return sysy::Type::getVoidType(); - // 处理指针类型等 - return sysy::Type::getIntType(); -} - -std::any LLVMIRGenerator::visitCompUnit(SysYParser::CompUnitContext* ctx) { - auto type_i32 = Type::getIntType(); - auto type_f32 = Type::getFloatType(); - auto type_void = Type::getVoidType(); - auto type_i32p = Type::getPointerType(type_i32); - auto type_f32p = Type::getPointerType(type_f32); - - // 创建运行时库函数 - irModule->createFunction("getint", sysy::FunctionType::get(type_i32, {})); - irModule->createFunction("getch", sysy::FunctionType::get(type_i32, {})); - irModule->createFunction("getfloat", sysy::FunctionType::get(type_f32, {})); - //TODO: 添加更多运行时库函数 - irStream << "declare i32 @getint()\n"; - irStream << "declare i32 @getch()\n"; - irStream << "declare float @getfloat()\n"; - //TODO: 添加更多运行时库函数的文本IR - - for (auto decl : ctx->decl()) { - decl->accept(this); - } - for (auto funcDef : ctx->funcDef()) { - inFunction = true; // 进入函数定义 - funcDef->accept(this); - inFunction = false; // 离开函数定义 - } - return nullptr; -} - -std::any LLVMIRGenerator::visitVarDecl(SysYParser::VarDeclContext* ctx) { - // TODO:数组初始化 - std::string type = ctx->bType()->getText(); - currentVarType = getLLVMType(type); - - for (auto varDef : ctx->varDef()) { - if (!inFunction) { - // 全局变量声明 - std::string varName = varDef->Ident()->getText(); - std::string llvmType = getLLVMType(type); - std::string value = "0"; // 默认值为 0 - - if (varDef->ASSIGN()) { - value = std::any_cast(varDef->initVal()->accept(this)); - } else { - std::cout << "[WR-Release-01]Warning: Global variable '" << varName - << "' is declared without initialization, defaulting to 0.\n"; - } - irStream << "@" << varName << " = dso_local global " << llvmType << " " << value << ", align 4\n"; - globalVars.push_back(varName); // 记录全局变量 - } else { - // 局部变量声明 - varDef->accept(this); - } - } - return nullptr; -} - -std::any LLVMIRGenerator::visitConstDecl(SysYParser::ConstDeclContext* ctx) { - // TODO:数组初始化 - std::string type = ctx->bType()->getText(); - for (auto constDef : ctx->constDef()) { - if (!inFunction) { - // 全局常量声明 - std::string varName = constDef->Ident()->getText(); - std::string llvmType = getLLVMType(type); - std::string value = "0"; // 默认值为 0 - - try { - value = std::any_cast(constDef->constInitVal()->accept(this)); - } catch (...) { - throw std::runtime_error("[ERR-Release-01]Const value must be initialized upon definition."); - } - // 如果是 float 类型,转换为十六进制表示 - if (llvmType == "float") { - try { - double floatValue = std::stod(value); - uint64_t hexValue = reinterpret_cast(floatValue); - std::stringstream ss; - ss << "0x" << std::hex << std::uppercase << hexValue; - value = ss.str(); - } catch (...) { - throw std::runtime_error("[ERR-Release-02]Invalid float literal: " + value); - } - } - - irStream << "@" << varName << " = dso_local constant " << llvmType << " " << value << ", align 4\n"; - globalVars.push_back(varName); // 记录全局变量 - } else { - // 局部常量声明 - std::string varName = constDef->Ident()->getText(); - std::string llvmType = getLLVMType(type); - std::string allocaName = getNextTemp(); - std::string value = "0"; // 默认值为 0 - - try { - value = std::any_cast(constDef->constInitVal()->accept(this)); - } catch (...) { - throw std::runtime_error("Const value must be initialized upon definition."); - } - - irStream << " " << allocaName << " = alloca " << llvmType << ", align 4\n"; - if (llvmType == "float") { - try { - double floatValue = std::stod(value); - uint64_t hexValue = reinterpret_cast(floatValue); - std::stringstream ss; - ss << "0x" << std::hex << std::uppercase << hexValue; - value = ss.str(); - } catch (...) { - throw std::runtime_error("Invalid float literal: " + value); - } - } - irStream << " store " << llvmType << " " << value << ", " << llvmType - << "* " << allocaName << ", align 4\n"; - - symbolTable[varName] = {allocaName, llvmType}; - tmpTable[allocaName] = llvmType; - } - } - return nullptr; -} - -std::any LLVMIRGenerator::visitVarDef(SysYParser::VarDefContext* ctx) { - // TODO:数组初始化 - std::string varName = ctx->Ident()->getText(); - std::string type = currentVarType; - std::string llvmType = getLLVMType(type); - std::string allocaName = getNextTemp(); - - - irStream << " " << allocaName << " = alloca " << llvmType << ", align 4\n"; - - if (ctx->ASSIGN()) { - std::string value = std::any_cast(ctx->initVal()->accept(this)); - - if (llvmType == "float") { - try { - double floatValue = std::stod(value); - uint64_t hexValue = reinterpret_cast(floatValue); - std::stringstream ss; - ss << "0x" << std::hex << std::uppercase << (hexValue & (0xffffffffUL << 32)); - value = ss.str(); - } catch (...) { - throw std::runtime_error("Invalid float literal: " + value); - } - } - irStream << " store " << llvmType << " " << value << ", " << llvmType - << "* " << allocaName << ", align 4\n"; - } - symbolTable[varName] = {allocaName, llvmType}; - tmpTable[allocaName] = llvmType; - return nullptr; -} - -std::any LLVMIRGenerator::visitFuncDef(SysYParser::FuncDefContext* ctx) { - currentFunction = ctx->Ident()->getText(); - currentReturnType = getLLVMType(ctx->funcType()->getText()); - symbolTable.clear(); - tmpTable.clear(); - tempCounter = 0; - hasReturn = false; - - irStream << "define dso_local " << currentReturnType << " @" << currentFunction << "("; - if (ctx->funcFParams()) { - auto params = ctx->funcFParams()->funcFParam(); - tempCounter += params.size(); - for (size_t i = 0; i < params.size(); ++i) { - if (i > 0) irStream << ", "; - std::string paramType = getLLVMType(params[i]->bType()->getText()); - irStream << paramType << " noundef %" << i; - symbolTable[params[i]->Ident()->getText()] = {"%" + std::to_string(i), paramType}; - tmpTable["%" + std::to_string(i)] = paramType; - } - } - tempCounter++; - irStream << ") #0 {\n"; - - if (ctx->funcFParams()) { - auto params = ctx->funcFParams()->funcFParam(); - for (size_t i = 0; i < params.size(); ++i) { - std::string varName = params[i]->Ident()->getText(); - std::string type = params[i]->bType()->getText(); - std::string llvmType = getLLVMType(type); - std::string allocaName = getNextTemp(); - tmpTable[allocaName] = llvmType; - - irStream << " " << allocaName << " = alloca " << llvmType << ", align 4\n"; - irStream << " store " << llvmType << " " << symbolTable[varName].first << ", " << llvmType - << "* " << allocaName << ", align 4\n"; - - symbolTable[varName] = {allocaName, llvmType}; - } - } - ctx->blockStmt()->accept(this); - - if (!hasReturn) { - if (currentReturnType == "void") { - irStream << " ret void\n"; - } else { - irStream << " ret " << currentReturnType << " 0\n"; - } - } - irStream << "}\n"; - return nullptr; -} - -std::any LLVMIRGenerator::visitBlockStmt(SysYParser::BlockStmtContext* ctx) { - for (auto item : ctx->blockItem()) { - item->accept(this); - } - return nullptr; -} -std::any LLVMIRGenerator::visitAssignStmt(SysYParser::AssignStmtContext *ctx) -{ - std::string lhsAlloca = std::any_cast(ctx->lValue()->accept(this)); - std::string lhsType = symbolTable[ctx->lValue()->Ident()->getText()].second; - std::string rhs = std::any_cast(ctx->exp()->accept(this)); - - if (lhsType == "float") { - try { - double floatValue = std::stod(rhs); - uint64_t hexValue = reinterpret_cast(floatValue); - std::stringstream ss; - ss << "0x" << std::hex << std::uppercase << (hexValue & (0xffffffffUL << 32)); - rhs = ss.str(); - } catch (...) { - throw std::runtime_error("Invalid float literal: " + rhs); - } - } - - irStream << " store " << lhsType << " " << rhs << ", " << lhsType - << "* " << lhsAlloca << ", align 4\n"; - return nullptr; -} - -std::any LLVMIRGenerator::visitIfStmt(SysYParser::IfStmtContext *ctx) -{ - std::string cond = std::any_cast(ctx->cond()->accept(this)); - std::string trueLabel = "if.then." + std::to_string(tempCounter); - std::string falseLabel = "if.else." + std::to_string(tempCounter); - std::string mergeLabel = "if.end." + std::to_string(tempCounter++); - - irStream << " br i1 " << cond << ", label %" << trueLabel << ", label %" << falseLabel << "\n"; - - irStream << trueLabel << ":\n"; - ctx->stmt(0)->accept(this); - irStream << " br label %" << mergeLabel << "\n"; - - irStream << falseLabel << ":\n"; - if (ctx->ELSE()) { - ctx->stmt(1)->accept(this); - } - irStream << " br label %" << mergeLabel << "\n"; - - irStream << mergeLabel << ":\n"; - return nullptr; -} - -std::any LLVMIRGenerator::visitWhileStmt(SysYParser::WhileStmtContext *ctx) -{ - std::string loop_cond = "while.cond." + std::to_string(tempCounter); - std::string loop_body = "while.body." + std::to_string(tempCounter); - std::string loop_end = "while.end." + std::to_string(tempCounter++); - - loopStack.push({loop_end, loop_cond}); - irStream << " br label %" << loop_cond << "\n"; - irStream << loop_cond << ":\n"; - - std::string cond = std::any_cast(ctx->cond()->accept(this)); - irStream << " br i1 " << cond << ", label %" << loop_body << ", label %" << loop_end << "\n"; - irStream << loop_body << ":\n"; - ctx->stmt()->accept(this); - irStream << " br label %" << loop_cond << "\n"; - irStream << loop_end << ":\n"; - - loopStack.pop(); - return nullptr; -} - -std::any LLVMIRGenerator::visitBreakStmt(SysYParser::BreakStmtContext *ctx) -{ - if (loopStack.empty()) { - throw std::runtime_error("Break statement outside of a loop."); - } - irStream << " br label %" << loopStack.top().breakLabel << "\n"; - return nullptr; -} - -std::any LLVMIRGenerator::visitContinueStmt(SysYParser::ContinueStmtContext *ctx) -{ - if (loopStack.empty()) { - throw std::runtime_error("Continue statement outside of a loop."); - } - irStream << " br label %" << loopStack.top().continueLabel << "\n"; - return nullptr; -} - -std::any LLVMIRGenerator::visitReturnStmt(SysYParser::ReturnStmtContext *ctx) -{ - hasReturn = true; - if (ctx->exp()) { - std::string value = std::any_cast(ctx->exp()->accept(this)); - irStream << " ret " << currentReturnType << " " << value << "\n"; - } else { - irStream << " ret void\n"; - } - return nullptr; -} - -// std::any LLVMIRGenerator::visitStmt(SysYParser::StmtContext* ctx) { -// if (ctx->lValue() && ctx->ASSIGN()) { -// std::string lhsAlloca = std::any_cast(ctx->lValue()->accept(this)); -// std::string lhsType = symbolTable[ctx->lValue()->Ident()->getText()].second; -// std::string rhs = std::any_cast(ctx->exp()->accept(this)); -// if (lhsType == "float") { -// try { -// double floatValue = std::stod(rhs); -// uint64_t hexValue = reinterpret_cast(floatValue); -// std::stringstream ss; -// ss << "0x" << std::hex << std::uppercase << (hexValue & (0xffffffffUL << 32)); -// rhs = ss.str(); -// } catch (...) { -// throw std::runtime_error("Invalid float literal: " + rhs); -// } -// } -// irStream << " store " << lhsType << " " << rhs << ", " << lhsType -// << "* " << lhsAlloca << ", align 4\n"; -// } else if (ctx->RETURN()) { -// hasReturn = true; -// if (ctx->exp()) { -// std::string value = std::any_cast(ctx->exp()->accept(this)); -// irStream << " ret " << currentReturnType << " " << value << "\n"; -// } else { -// irStream << " ret void\n"; -// } -// } else if (ctx->IF()) { -// std::string cond = std::any_cast(ctx->cond()->accept(this)); -// std::string trueLabel = "if.then." + std::to_string(tempCounter); -// std::string falseLabel = "if.else." + std::to_string(tempCounter); -// std::string mergeLabel = "if.end." + std::to_string(tempCounter++); - -// irStream << " br i1 " << cond << ", label %" << trueLabel << ", label %" << falseLabel << "\n"; - -// irStream << trueLabel << ":\n"; -// ctx->stmt(0)->accept(this); -// irStream << " br label %" << mergeLabel << "\n"; - -// irStream << falseLabel << ":\n"; -// if (ctx->ELSE()) { -// ctx->stmt(1)->accept(this); -// } -// irStream << " br label %" << mergeLabel << "\n"; - -// irStream << mergeLabel << ":\n"; -// } else if (ctx->WHILE()) { -// std::string loop_cond = "while.cond." + std::to_string(tempCounter); -// std::string loop_body = "while.body." + std::to_string(tempCounter); -// std::string loop_end = "while.end." + std::to_string(tempCounter++); - -// loopStack.push({loop_end, loop_cond}); -// irStream << " br label %" << loop_cond << "\n"; -// irStream << loop_cond << ":\n"; - -// std::string cond = std::any_cast(ctx->cond()->accept(this)); -// irStream << " br i1 " << cond << ", label %" << loop_body << ", label %" << loop_end << "\n"; -// irStream << loop_body << ":\n"; -// ctx->stmt(0)->accept(this); -// irStream << " br label %" << loop_cond << "\n"; -// irStream << loop_end << ":\n"; - -// loopStack.pop(); - -// } else if (ctx->BREAK()) { -// if (loopStack.empty()) { -// throw std::runtime_error("Break statement outside of a loop."); -// } -// irStream << " br label %" << loopStack.top().breakLabel << "\n"; -// } else if (ctx->CONTINUE()) { -// if (loopStack.empty()) { -// throw std::runtime_error("Continue statement outside of a loop."); -// } -// irStream << " br label %" << loopStack.top().continueLabel << "\n"; -// } else if (ctx->blockStmt()) { -// ctx->blockStmt()->accept(this); -// } else if (ctx->exp()) { -// ctx->exp()->accept(this); -// } -// return nullptr; -// } - -std::any LLVMIRGenerator::visitLValue(SysYParser::LValueContext* ctx) { - std::string varName = ctx->Ident()->getText(); - return symbolTable[varName].first; -} - -// std::any LLVMIRGenerator::visitPrimaryExp(SysYParser::PrimaryExpContext* ctx) { -// if (ctx->lValue()) { -// std::string allocaPtr = std::any_cast(ctx->lValue()->accept(this)); -// std::string varName = ctx->lValue()->Ident()->getText(); -// std::string type = symbolTable[varName].second; -// std::string temp = getNextTemp(); -// irStream << " " << temp << " = load " << type << ", " << type << "* " << allocaPtr << ", align 4\n"; -// tmpTable[temp] = type; -// return temp; -// } else if (ctx->exp()) { -// return ctx->exp()->accept(this); -// } else { -// return ctx->number()->accept(this); -// } -// } - - -std::any LLVMIRGenerator::visitPrimExp(SysYParser::PrimExpContext *ctx){ - // irStream << "visitPrimExp\n"; - // std::cout << "Type name: " << typeid(*(ctx->primaryExp())).name() << std::endl; - SysYParser::PrimaryExpContext* pExpCtx = ctx->primaryExp(); - if (auto* lvalCtx = dynamic_cast(pExpCtx)) { - std::string allocaPtr = std::any_cast(lvalCtx->lValue()->accept(this)); - std::string varName = lvalCtx->lValue()->Ident()->getText(); - std::string type = symbolTable[varName].second; - std::string temp = getNextTemp(); - irStream << " " << temp << " = load " << type << ", " << type << "* " << allocaPtr << ", align 4\n"; - tmpTable[temp] = type; - return temp; - } else if (auto* expCtx = dynamic_cast(pExpCtx)) { - return expCtx->exp()->accept(this); - } else if (auto* strCtx = dynamic_cast(pExpCtx)) { - return strCtx->string()->accept(this); - } else if (auto* numCtx = dynamic_cast(pExpCtx)) { - return numCtx->number()->accept(this); - } else { - // 没有成功转换,说明 ctx->primaryExp() 不是 NumContext 或其他已知类型 - // 可能是其他类型的表达式,或者是一个空的 PrimaryExpContext - std::cout << "Unknown primary expression type." << std::endl; - throw std::runtime_error("Unknown primary expression type."); - } - // return visitChildren(ctx); -} - -std::any LLVMIRGenerator::visitParenExp(SysYParser::ParenExpContext* ctx) { - return ctx->exp()->accept(this); -} - -std::any LLVMIRGenerator::visitNumber(SysYParser::NumberContext* ctx) { - if (ctx->ILITERAL()) { - return ctx->ILITERAL()->getText(); - } else if (ctx->FLITERAL()) { - return ctx->FLITERAL()->getText(); - } - return ""; -} - -std::any LLVMIRGenerator::visitString(SysYParser::StringContext *ctx) -{ - if (ctx->STRING()) { - // 处理字符串常量 - std::string str = ctx->STRING()->getText(); - // 去掉引号 - str = str.substr(1, str.size() - 2); - // 转义处理 - std::string escapedStr; - for (char c : str) { - if (c == '\\') { - escapedStr += "\\\\"; - } else if (c == '"') { - escapedStr += "\\\""; - } else { - escapedStr += c; - } - } - return "\"" + escapedStr + "\""; - } - return ctx->STRING()->getText(); -} - -std::any LLVMIRGenerator::visitUnExp(SysYParser::UnExpContext* ctx) { - if (ctx->unaryOp()) { - std::string operand = std::any_cast(ctx->unaryExp()->accept(this)); - std::string op = ctx->unaryOp()->getText(); - std::string temp = getNextTemp(); - std::string type = operand.substr(0, operand.find(' ')); - tmpTable[temp] = type; - if (op == "-") { - irStream << " " << temp << " = sub " << type << " 0, " << operand << "\n"; - } else if (op == "!") { - irStream << " " << temp << " = xor " << type << " " << operand << ", 1\n"; - } - return temp; - } - return ctx->unaryExp()->accept(this); -} - -std::any LLVMIRGenerator::visitCall(SysYParser::CallContext *ctx) -{ - std::string funcName = ctx->Ident()->getText(); - std::vector args; - if (ctx->funcRParams()) { - for (auto argCtx : ctx->funcRParams()->exp()) { - args.push_back(std::any_cast(argCtx->accept(this))); - } - } - std::string temp = getNextTemp(); - std::string argList = ""; - for (size_t i = 0; i < args.size(); ++i) { - if (i > 0) argList += ", "; - argList +=tmpTable[args[i]] + " noundef " + args[i]; - } - irStream << " " << temp << " = call " << currentReturnType << " @" << funcName << "(" << argList << ")\n"; - tmpTable[temp] = currentReturnType; - return temp; -} - -std::any LLVMIRGenerator::visitMulExp(SysYParser::MulExpContext* ctx) { - auto unaryExps = ctx->unaryExp(); - std::string left = std::any_cast(unaryExps[0]->accept(this)); - for (size_t i = 1; i < unaryExps.size(); ++i) { - std::string right = std::any_cast(unaryExps[i]->accept(this)); - std::string op = ctx->children[2*i-1]->getText(); - std::string temp = getNextTemp(); - std::string type = tmpTable[left]; - if (op == "*") { - irStream << " " << temp << " = mul nsw " << type << " " << left << ", " << right << "\n"; - } else if (op == "/") { - irStream << " " << temp << " = sdiv " << type << " " << left << ", " << right << "\n"; - } else if (op == "%") { - irStream << " " << temp << " = srem " << type << " " << left << ", " << right << "\n"; - } - left = temp; - tmpTable[temp] = type; - } - return left; -} - -std::any LLVMIRGenerator::visitAddExp(SysYParser::AddExpContext* ctx) { - auto mulExps = ctx->mulExp(); - std::string left = std::any_cast(mulExps[0]->accept(this)); - for (size_t i = 1; i < mulExps.size(); ++i) { - std::string right = std::any_cast(mulExps[i]->accept(this)); - std::string op = ctx->children[2*i-1]->getText(); - std::string temp = getNextTemp(); - std::string type = tmpTable[left]; - if (op == "+") { - irStream << " " << temp << " = add nsw " << type << " " << left << ", " << right << "\n"; - } else if (op == "-") { - irStream << " " << temp << " = sub nsw " << type << " " << left << ", " << right << "\n"; - } - left = temp; - tmpTable[temp] = type; - } - return left; -} - -std::any LLVMIRGenerator::visitRelExp(SysYParser::RelExpContext* ctx) { - auto addExps = ctx->addExp(); - std::string left = std::any_cast(addExps[0]->accept(this)); - for (size_t i = 1; i < addExps.size(); ++i) { - std::string right = std::any_cast(addExps[i]->accept(this)); - std::string op = ctx->children[2*i-1]->getText(); - std::string temp = getNextTemp(); - std::string type = tmpTable[left]; - if (op == "<") { - irStream << " " << temp << " = icmp slt " << type << " " << left << ", " << right << "\n"; - } else if (op == ">") { - irStream << " " << temp << " = icmp sgt " << type << " " << left << ", " << right << "\n"; - } else if (op == "<=") { - irStream << " " << temp << " = icmp sle " << type << " " << left << ", " << right << "\n"; - } else if (op == ">=") { - irStream << " " << temp << " = icmp sge " << type << " " << left << ", " << right << "\n"; - } - left = temp; - } - return left; -} - -std::any LLVMIRGenerator::visitEqExp(SysYParser::EqExpContext* ctx) { - auto relExps = ctx->relExp(); - std::string left = std::any_cast(relExps[0]->accept(this)); - for (size_t i = 1; i < relExps.size(); ++i) { - std::string right = std::any_cast(relExps[i]->accept(this)); - std::string op = ctx->children[2*i-1]->getText(); - std::string temp = getNextTemp(); - std::string type = tmpTable[left]; - if (op == "==") { - irStream << " " << temp << " = icmp eq " << type << " " << left << ", " << right << "\n"; - } else if (op == "!=") { - irStream << " " << temp << " = icmp ne " << type << " " << left << ", " << right << "\n"; - } - left = temp; - } - return left; -} - -std::any LLVMIRGenerator::visitLAndExp(SysYParser::LAndExpContext* ctx) { - auto eqExps = ctx->eqExp(); - std::string left = std::any_cast(eqExps[0]->accept(this)); - for (size_t i = 1; i < eqExps.size(); ++i) { - std::string falseLabel = "land.false." + std::to_string(tempCounter); - std::string endLabel = "land.end." + std::to_string(tempCounter++); - std::string temp = getNextTemp(); - - irStream << " br label %" << falseLabel << "\n"; - irStream << falseLabel << ":\n"; - std::string right = std::any_cast(eqExps[i]->accept(this)); - irStream << " " << temp << " = and i1 " << left << ", " << right << "\n"; - irStream << " br label %" << endLabel << "\n"; - irStream << endLabel << ":\n"; - left = temp; - } - return left; -} - -std::any LLVMIRGenerator::visitLOrExp(SysYParser::LOrExpContext* ctx) { - auto lAndExps = ctx->lAndExp(); - std::string left = std::any_cast(lAndExps[0]->accept(this)); - for (size_t i = 1; i < lAndExps.size(); ++i) { - std::string trueLabel = "lor.true." + std::to_string(tempCounter); - std::string endLabel = "lor.end." + std::to_string(tempCounter++); - std::string temp = getNextTemp(); - - irStream << " br label %" << trueLabel << "\n"; - irStream << trueLabel << ":\n"; - std::string right = std::any_cast(lAndExps[i]->accept(this)); - irStream << " " << temp << " = or i1 " << left << ", " << right << "\n"; - irStream << " br label %" << endLabel << "\n"; - irStream << endLabel << ":\n"; - left = temp; - } - return left; -} -} \ No newline at end of file diff --git a/src/LLVMIRGenerator_1.cpp b/src/LLVMIRGenerator_1.cpp deleted file mode 100644 index 515b5a2..0000000 --- a/src/LLVMIRGenerator_1.cpp +++ /dev/null @@ -1,859 +0,0 @@ -// LLVMIRGenerator.cpp -// TODO:类型转换及其检查 -// TODO:sysy库函数处理 -// TODO:数组处理 -// TODO:对while、continue、break的测试 -#include "LLVMIRGenerator_1.h" -#include -#include -#include - -// namespace sysy { - -std::string LLVMIRGenerator::generateIR(SysYParser::CompUnitContext* unit) { - // 初始化 SysY IR 模块 - module = std::make_unique(); - // 清空符号表和临时变量表 - symbolTable.clear(); - tmpTable.clear(); - irSymbolTable.clear(); - irTmpTable.clear(); - tempCounter = 0; - globalVars.clear(); - hasReturn = false; - loopStack = std::stack(); - inFunction = false; - - // 访问编译单元 - visitCompUnit(unit); - return irStream.str(); -} - -std::string LLVMIRGenerator::getNextTemp() { - std::string ret = "%." + std::to_string(tempCounter++); - tmpTable[ret] = "void"; - return ret; -} - -std::string LLVMIRGenerator::getIRTempName() { - return "%" + std::to_string(tempCounter++); -} - -std::string LLVMIRGenerator::getLLVMType(const std::string& type) { - if (type == "int") return "i32"; - if (type == "float") return "float"; - if (type.find("[]") != std::string::npos) - return getLLVMType(type.substr(0, type.size() - 2)) + "*"; - return "i32"; -} - -sysy::Type* LLVMIRGenerator::getIRType(const std::string& type) { - if (type == "int") return sysy::Type::getIntType(); - if (type == "float") return sysy::Type::getFloatType(); - if (type == "void") return sysy::Type::getVoidType(); - if (type.find("[]") != std::string::npos) { - std::string baseType = type.substr(0, type.size() - 2); - return sysy::Type::getPointerType(getIRType(baseType)); - } - return sysy::Type::getIntType(); // 默认 int -} - -void LLVMIRGenerator::setIRPosition(sysy::BasicBlock* block) { - currentIRBlock = block; -} - -std::any LLVMIRGenerator::visitCompUnit(SysYParser::CompUnitContext* ctx) { - for (auto decl : ctx->decl()) { - decl->accept(this); - } - for (auto funcDef : ctx->funcDef()) { - inFunction = true; - funcDef->accept(this); - inFunction = false; - } - return nullptr; -} - - -std::any LLVMIRGenerator::visitVarDecl(SysYParser::VarDeclContext* ctx) { - // TODO:数组初始化 - std::string type = ctx->bType()->getText(); - currentVarType = getLLVMType(type); - sysy::Type* irType = sysy::Type::getPointerType(getIRType(type)); - - for (auto varDef : ctx->varDef()) { - if (!inFunction) { - // 全局变量(文本 IR) - std::string varName = varDef->Ident()->getText(); - std::string llvmType = getLLVMType(type); - std::string value = "0"; - sysy::Value* initValue = nullptr; - - if (varDef->ASSIGN()) { - value = std::any_cast(varDef->initVal()->accept(this)); - if (irTmpTable.find(value) != irTmpTable.end() && isa(irTmpTable[value])) { - initValue = irTmpTable[value]; - } - } - - if (llvmType == "float" && initValue) { - try { - double floatValue = std::stod(value); - uint64_t hexValue = reinterpret_cast(floatValue); - std::stringstream ss; - ss << "0x" << std::hex << std::uppercase << hexValue; - value = ss.str(); - } catch (...) { - throw std::runtime_error("[ERR-Release-02]Invalid float literal: " + value); - } - } - irStream << "@" << varName << " = dso_local global " << llvmType << " " << value << ", align 4\n"; - globalVars.push_back(varName); - - // 全局变量(SysY IR) - auto globalValue = module->createGlobalValue(varName, irType, {}, initValue); - irSymbolTable[varName] = globalValue; - } else { - varDef->accept(this); - } - } - return nullptr; -} - -std::any LLVMIRGenerator::visitConstDecl(SysYParser::ConstDeclContext* ctx) { - // TODO:数组初始化 - std::string type = ctx->bType()->getText(); - currentVarType = getLLVMType(type); - sysy::Type* irType = sysy::Type::getPointerType(getIRType(type)); // 全局变量为指针类型 - - for (auto constDef : ctx->constDef()) { - std::string varName = constDef->Ident()->getText(); - std::string llvmType = getLLVMType(type); - std::string value = "0"; - sysy::Value* initValue = nullptr; - - try { - value = std::any_cast(constDef->constInitVal()->accept(this)); - if (isa(irTmpTable[value])) { - initValue = irTmpTable[value]; - } - } catch (...) { - throw std::runtime_error("Const value must be initialized upon definition."); - } - - if (!inFunction) { - // 全局常量(文本 IR) - if (llvmType == "float") { - try { - double floatValue = std::stod(value); - uint64_t hexValue = reinterpret_cast(floatValue); - std::stringstream ss; - ss << "0x" << std::hex << std::uppercase << hexValue; - value = ss.str(); - } catch (...) { - throw std::runtime_error("[ERR-Release-03]Invalid float literal: " + value); - } - } - irStream << "@" << varName << " = dso_local constant " << llvmType << " " << value << ", align 4\n"; - globalVars.push_back(varName); - - // 全局常量(SysY IR) - auto globalValue = module->createGlobalValue(varName, irType, {}, initValue); - irSymbolTable[varName] = globalValue; - } else { - // 局部常量(文本 IR) - std::string allocaName = getNextTemp(); - if (llvmType == "float") { - try { - double floatValue = std::stod(value); - uint64_t hexValue = reinterpret_cast(floatValue); - std::stringstream ss; - ss << "0x" << std::hex << std::uppercase << hexValue; - value = ss.str(); - } catch (...) { - throw std::runtime_error("Invalid float literal: " + value); - } - } - irStream << " " << allocaName << " = alloca " << llvmType << ", align 4\n"; - irStream << " store " << llvmType << " " << value << ", " << llvmType - << "* " << allocaName << ", align 4\n"; - symbolTable[varName] = {allocaName, llvmType}; - tmpTable[allocaName] = llvmType; - - // 局部常量(SysY IR)TODO:这里可能有bug,AI在犯蠢 - sysy::IRBuilder builder(currentIRBlock); - auto allocaInst = builder.createAllocaInst(irType, {}, varName); - builder.createStoreInst(initValue, allocaInst); - irSymbolTable[varName] = allocaInst; - irTmpTable[allocaName] = allocaInst; - } - } - return nullptr; -} - -std::any LLVMIRGenerator::visitVarDef(SysYParser::VarDefContext* ctx) { - // TODO:数组初始化 - std::string varName = ctx->Ident()->getText(); - std::string llvmType = currentVarType; - sysy::Type* irType = sysy::Type::getPointerType(getIRType(currentVarType == "i32" ? "int" : "float")); - std::string allocaName = getNextTemp(); - - // 局部变量(文本 IR) - irStream << " " << allocaName << " = alloca " << llvmType << ", align 4\n"; - - // 局部变量(SysY IR) - sysy::IRBuilder builder(currentIRBlock); - auto allocaInst = builder.createAllocaInst(irType, {}, varName); - sysy::Value* initValue = nullptr; - - if (ctx->ASSIGN()) { - std::string value = std::any_cast(ctx->initVal()->accept(this)); - if (llvmType == "float") { - try { - double floatValue = std::stod(value); - uint64_t hexValue = reinterpret_cast(floatValue); - std::stringstream ss; - ss << "0x" << std::hex << std::uppercase << (hexValue & (0xffffffffUL << 32)); - value = ss.str(); - } catch (...) { - throw std::runtime_error("Invalid float literal: " + value); - } - } - irStream << " store " << llvmType << " " << value << ", " << llvmType - << "* " << allocaName << ", align 4\n"; - - if (irTmpTable.find(value) != irTmpTable.end()) { - initValue = irTmpTable[value]; - } - builder.createStoreInst(initValue, allocaInst); - } - - symbolTable[varName] = {allocaName, llvmType}; - tmpTable[allocaName] = llvmType; - irSymbolTable[varName] = allocaInst;//TODO:这里没看懂在干嘛 - irTmpTable[allocaName] = allocaInst;//TODO:这里没看懂在干嘛 - builder.createStoreInst(initValue, allocaInst);//TODO:这里没看懂在干嘛 - return nullptr; -} - -std::any LLVMIRGenerator::visitFuncDef(SysYParser::FuncDefContext* ctx) { - currentFunction = ctx->Ident()->getText(); - currentReturnType = getLLVMType(ctx->funcType()->getText()); - sysy::Type* irReturnType = getIRType(ctx->funcType()->getText()); - std::vector paramTypes; - - // 清空符号表 - symbolTable.clear(); - tmpTable.clear(); - irSymbolTable.clear(); - irTmpTable.clear(); - tempCounter = 0; - hasReturn = false; - - // 处理函数参数(文本 IR 和 SysY IR) - if (ctx->funcFParams()) { - auto params = ctx->funcFParams()->funcFParam(); - for (size_t i = 0; i < params.size(); ++i) { - std::string paramType = getLLVMType(params[i]->bType()->getText()); - if (i > 0) irStream << ", "; - irStream << paramType << " noundef %" << i; - symbolTable[params[i]->Ident()->getText()] = {"%" + std::to_string(i), paramType}; - tmpTable["%" + std::to_string(i)] = paramType; - paramTypes.push_back(getIRType(params[i]->bType()->getText())); - } - tempCounter += params.size(); - } - tempCounter++; - - // 文本 IR 函数定义 - irStream << "define dso_local " << currentReturnType << " @" << currentFunction << "("; - irStream << ") #0 {\n"; - - // SysY IR 函数定义 - sysy::Type* funcType = sysy::Type::getFunctionType(irReturnType, paramTypes); - currentIRFunction = module->createFunction(currentFunction, funcType); - setIRPosition(currentIRFunction->getEntryBlock()); - - // 处理函数参数分配 - if (ctx->funcFParams()) { - auto params = ctx->funcFParams()->funcFParam(); - for (size_t i = 0; i < params.size(); ++i) { - std::string varName = params[i]->Ident()->getText(); - std::string llvmType = getLLVMType(params[i]->bType()->getText()); - sysy::Type* irType = getIRType(params[i]->bType()->getText()); - std::string allocaName = getNextTemp(); - tmpTable[allocaName] = llvmType; - - // 文本 IR 分配 - irStream << " " << allocaName << " = alloca " << llvmType << ", align 4\n"; - irStream << " store " << llvmType << " %" << i << ", " << llvmType - << "* " << allocaName << ", align 4\n"; - - // SysY IR 分配 - sysy::IRBuilder builder(currentIRBlock); - auto arg = currentIRBlock->createArgument(irType, varName); - auto allocaInst = builder.createAllocaInst(sysy::Type::getPointerType(irType), {}, varName); - builder.createStoreInst(arg, allocaInst); - symbolTable[varName] = {allocaName, llvmType}; - irSymbolTable[varName] = allocaInst; - irTmpTable[allocaName] = allocaInst; - } - } - - ctx->blockStmt()->accept(this); - - if (!hasReturn) { - if (currentReturnType == "void") { - irStream << " ret void\n"; - sysy::IRBuilder builder(currentIRBlock); - builder.createReturnInst(); - } else { - irStream << " ret " << currentReturnType << " 0\n"; - sysy::IRBuilder builder(currentIRBlock); - builder.createReturnInst(sysy::ConstantValue::get(0)); - } - } - irStream << "}\n"; - currentIRFunction = nullptr; - currentIRBlock = nullptr; - return nullptr; -} - -std::any LLVMIRGenerator::visitBlockStmt(SysYParser::BlockStmtContext* ctx) { - for (auto item : ctx->blockItem()) { - item->accept(this); - } - return nullptr; -} - -std::any LLVMIRGenerator::visitAssignStmt(SysYParser::AssignStmtContext* ctx) { - std::string lhsAlloca = std::any_cast(ctx->lValue()->accept(this)); - std::string lhsType = symbolTable[ctx->lValue()->Ident()->getText()].second; - std::string rhs = std::any_cast(ctx->exp()->accept(this)); - sysy::Value* rhsValue = irTmpTable[rhs]; - - // 文本 IR - if (lhsType == "float") { - try { - double floatValue = std::stod(rhs); - uint64_t hexValue = reinterpret_cast(floatValue); - std::stringstream ss; - ss << "0x" << std::hex << std::uppercase << (hexValue & (0xffffffffUL << 32)); - rhs = ss.str(); - } catch (...) { - // 如果 rhs 不是字面量,假设已正确处理 - throw std::runtime_error("Invalid float literal: " + rhs); - } - } - irStream << " store " << lhsType << " " << rhs << ", " << lhsType - << "* " << lhsAlloca << ", align 4\n"; - - // SysY IR - sysy::IRBuilder builder(currentIRBlock); - builder.createStoreInst(rhsValue, irSymbolTable[ctx->lValue()->Ident()->getText()]); - return nullptr; -} - -std::any LLVMIRGenerator::visitIfStmt(SysYParser::IfStmtContext* ctx) { - std::string cond = std::any_cast(ctx->cond()->accept(this)); - sysy::Value* condValue = irTmpTable[cond]; - std::string trueLabel = "if.then." + std::to_string(tempCounter); - std::string falseLabel = "if.else." + std::to_string(tempCounter); - std::string mergeLabel = "if.end." + std::to_string(tempCounter++); - - // SysY IR 基本块 - sysy::BasicBlock* thenBlock = currentIRFunction->addBasicBlock(trueLabel); - sysy::BasicBlock* elseBlock = ctx->ELSE() ? currentIRFunction->addBasicBlock(falseLabel) : nullptr; - sysy::BasicBlock* mergeBlock = currentIRFunction->addBasicBlock(mergeLabel); - - // 文本 IR - irStream << " br i1 " << cond << ", label %" << trueLabel << ", label %" - << (ctx->ELSE() ? falseLabel : mergeLabel) << "\n"; - - // SysY IR 条件分支 - sysy::IRBuilder builder(currentIRBlock); - builder.createCondBrInst(condValue, thenBlock, ctx->ELSE() ? elseBlock : mergeBlock, {}, {}); - - // 处理 then 分支 - setIRPosition(thenBlock); - irStream << trueLabel << ":\n"; - ctx->stmt(0)->accept(this); - irStream << " br label %" << mergeLabel << "\n"; - builder.setPosition(thenBlock, thenBlock->end()); - builder.createUncondBrInst(mergeBlock, {}); - - // 处理 else 分支 - if (ctx->ELSE()) { - setIRPosition(elseBlock); - irStream << falseLabel << ":\n"; - ctx->stmt(1)->accept(this); - irStream << " br label %" << mergeLabel << "\n"; - builder.setPosition(elseBlock, elseBlock->end()); - builder.createUncondBrInst(mergeBlock, {}); - } - - // 合并点 - setIRPosition(mergeBlock); - irStream << mergeLabel << ":\n"; - return nullptr; -} - -std::any LLVMIRGenerator::visitWhileStmt(SysYParser::WhileStmtContext* ctx) { - std::string loopCond = "while.cond." + std::to_string(tempCounter); - std::string loopBody = "while.body." + std::to_string(tempCounter); - std::string loopEnd = "while.end." + std::to_string(tempCounter++); - - // SysY IR 基本块 - sysy::BasicBlock* condBlock = currentIRFunction->addBasicBlock(loopCond); - sysy::BasicBlock* bodyBlock = currentIRFunction->addBasicBlock(loopBody); - sysy::BasicBlock* endBlock = currentIRFunction->addBasicBlock(loopEnd); - - loopStack.push({loopEnd, loopCond, endBlock, condBlock}); - - // 跳转到条件块 - sysy::IRBuilder builder(currentIRBlock); - builder.createUncondBrInst(condBlock, {}); - irStream << " br label %" << loopCond << "\n"; - - // 条件块 - setIRPosition(condBlock); - irStream << loopCond << ":\n"; - std::string cond = std::any_cast(ctx->cond()->accept(this)); - sysy::Value* condValue = irTmpTable[cond]; - irStream << " br i1 " << cond << ", label %" << loopBody << ", label %" << loopEnd << "\n"; - builder.setPosition(condBlock, condBlock->end()); - builder.createCondBrInst(condValue, bodyBlock, endBlock, {}, {}); - - // 循环体 - setIRPosition(bodyBlock); - irStream << loopBody << ":\n"; - ctx->stmt()->accept(this); - irStream << " br label %" << loopCond << "\n"; - builder.setPosition(bodyBlock, bodyBlock->end()); - builder.createUncondBrInst(condBlock, {}); - - // 结束块 - setIRPosition(endBlock); - irStream << loopEnd << ":\n"; - loopStack.pop(); - return nullptr; -} - -std::any LLVMIRGenerator::visitBreakStmt(SysYParser::BreakStmtContext* ctx) { - if (loopStack.empty()) { - throw std::runtime_error("Break statement outside of a loop."); - } - irStream << " br label %" << loopStack.top().breakLabel << "\n"; - sysy::IRBuilder builder(currentIRBlock); - builder.createUncondBrInst(loopStack.top().irBreakBlock, {}); - return nullptr; -} - -std::any LLVMIRGenerator::visitContinueStmt(SysYParser::ContinueStmtContext* ctx) { - if (loopStack.empty()) { - throw std::runtime_error("Continue statement outside of a loop."); - } - irStream << " br label %" << loopStack.top().continueLabel << "\n"; - sysy::IRBuilder builder(currentIRBlock); - builder.createUncondBrInst(loopStack.top().irContinueBlock, {}); - return nullptr; -} - -std::any LLVMIRGenerator::visitReturnStmt(SysYParser::ReturnStmtContext* ctx) { - hasReturn = true; - sysy::IRBuilder builder(currentIRBlock); - if (ctx->exp()) { - std::string value = std::any_cast(ctx->exp()->accept(this)); - sysy::Value* irValue = irTmpTable[value]; - irStream << " ret " << currentReturnType << " " << value << "\n"; - builder.createReturnInst(irValue); - } else { - irStream << " ret void\n"; - builder.createReturnInst(); - } - return nullptr; -} - -std::any LLVMIRGenerator::visitLValue(SysYParser::LValueContext* ctx) { - std::string varName = ctx->Ident()->getText(); - if (irSymbolTable.find(varName) == irSymbolTable.end()) { - throw std::runtime_error("Undefined variable: " + varName); - } - // 对于 LValue,返回分配的指针(文本 IR 和 SysY IR 一致) - return symbolTable[varName].first; -} - -std::any LLVMIRGenerator::visitPrimExp(SysYParser::PrimExpContext* ctx) { - SysYParser::PrimaryExpContext* pExpCtx = ctx->primaryExp(); - if (auto* lvalCtx = dynamic_cast(pExpCtx)) { - std::string allocaPtr = std::any_cast(lvalCtx->lValue()->accept(this)); - std::string varName = lvalCtx->lValue()->Ident()->getText(); - std::string type = symbolTable[varName].second; - std::string temp = getNextTemp(); - sysy::Type* irType = getIRType(type == "i32" ? "int" : "float"); - - // 文本 IR - irStream << " " << temp << " = load " << type << ", " << type << "* " << allocaPtr << ", align 4\n"; - tmpTable[temp] = type; - - // SysY IR - sysy::IRBuilder builder(currentIRBlock); - auto loadInst = builder.createLoadInst(irSymbolTable[varName], {}); - irTmpTable[temp] = loadInst; - return temp; - } else if (auto* expCtx = dynamic_cast(pExpCtx)) { - return expCtx->exp()->accept(this); - } else if (auto* strCtx = dynamic_cast(pExpCtx)) { - return strCtx->string()->accept(this); - } else if (auto* numCtx = dynamic_cast(pExpCtx)) { - return numCtx->number()->accept(this); - } else { - // 没有成功转换,说明 ctx->primaryExp() 不是 NumContext 或其他已知类型 - // 可能是其他类型的表达式,或者是一个空的 PrimaryExpContext - std::cout << "Unknown primary expression type." << std::endl; - throw std::runtime_error("Unknown primary expression type."); - } -} - -std::any LLVMIRGenerator::visitParenExp(SysYParser::ParenExpContext* ctx) { - return ctx->exp()->accept(this); -} - -std::any LLVMIRGenerator::visitNumber(SysYParser::NumberContext* ctx) { - std::string value; - sysy::Value* irValue = nullptr; - if (ctx->ILITERAL()) { - value = ctx->ILITERAL()->getText(); - irValue = sysy::ConstantValue::get(std::stoi(value)); - } else if (ctx->FLITERAL()) { - value = ctx->FLITERAL()->getText(); - irValue = sysy::ConstantValue::get(std::stof(value)); - } else { - value = ""; - } - std::string temp = getNextTemp(); - tmpTable[temp] = ctx->ILITERAL() ? "i32" : "float"; - irTmpTable[temp] = irValue; - return value; -} - -std::any LLVMIRGenerator::visitString(SysYParser::StringContext* ctx) { - if (ctx->STRING()) { - std::string str = ctx->STRING()->getText(); - str = str.substr(1, str.size() - 2); - std::string escapedStr; - for (char c : str) { - if (c == '\\') { - escapedStr += "\\\\"; - } else if (c == '"') { - escapedStr += "\\\""; - } else { - escapedStr += c; - } - } - // TODO: SysY IR 暂不支持字符串常量,返回文本 IR 结果 - return "\"" + escapedStr + "\""; - } - return ctx->STRING()->getText(); -} - - - -std::any LLVMIRGenerator::visitUnExp(SysYParser::UnExpContext* ctx) { - if (ctx->unaryOp()) { - std::string operand = std::any_cast(ctx->unaryExp()->accept(this)); - sysy::Value* irOperand = irTmpTable[operand]; - std::string op = ctx->unaryOp()->getText(); - std::string temp = getNextTemp(); - std::string type = tmpTable[operand]; - sysy::Type* irType = getIRType(type == "i32" ? "int" : "float"); - tmpTable[temp] = type; - - // 文本 IR - if (op == "-") { - irStream << " " << temp << " = sub " << type << " 0, " << operand << "\n"; - } else if (op == "!") { - irStream << " " << temp << " = xor " << type << " " << operand << ", 1\n"; - } - - // SysY IR - sysy::IRBuilder builder(currentIRBlock); - sysy::Instruction::Kind kind = (op == "-") ? (type == "i32" ? sysy::Instruction::kNeg : sysy::Instruction::kFNeg) - : sysy::Instruction::kNot; - auto unaryInst = builder.createUnaryInst(kind, irType, irOperand, temp); - irTmpTable[temp] = unaryInst; - return temp; - } - return ctx->unaryExp()->accept(this); -} - -std::any LLVMIRGenerator::visitCall(SysYParser::CallContext* ctx) { - std::string funcName = ctx->Ident()->getText(); - std::vector args; - std::vector irArgs; - if (ctx->funcRParams()) { - for (auto argCtx : ctx->funcRParams()->exp()) { - std::string arg = std::any_cast(argCtx->accept(this)); - args.push_back(arg); - irArgs.push_back(irTmpTable[arg]); - } - } - std::string temp = getNextTemp(); - std::string argList; - for (size_t i = 0; i < args.size(); ++i) { - if (i > 0) argList += ", "; - argList += tmpTable[args[i]] + " noundef " + args[i]; - } - - // 文本 IR - irStream << " " << temp << " = call " << currentReturnType << " @" << funcName << "(" << argList << ")\n"; - tmpTable[temp] = currentReturnType; - - // SysY IR - sysy::IRBuilder builder(currentIRBlock); - sysy::Function* callee = module->getFunction(funcName); - if (!callee) { - throw std::runtime_error("Undefined function: " + funcName); - } - auto callInst = builder.createCallInst(callee, irArgs, temp); - irTmpTable[temp] = callInst; - return temp; -} - -std::any LLVMIRGenerator::visitMulExp(SysYParser::MulExpContext* ctx) { - auto unaryExps = ctx->unaryExp(); - std::string left = std::any_cast(unaryExps[0]->accept(this)); - sysy::Value* irLeft = irTmpTable[left]; - sysy::Type* irType = irLeft->getType(); - - for (size_t i = 1; i < unaryExps.size(); ++i) { - std::string right = std::any_cast(unaryExps[i]->accept(this)); - sysy::Value* irRight = irTmpTable[right]; - std::string op = ctx->children[2 * i - 1]->getText(); - std::string temp = getNextTemp(); - std::string type = tmpTable[left]; - tmpTable[temp] = type; - - // 文本 IR - if (op == "*") { - irStream << " " << temp << " = mul nsw " << type << " " << left << ", " << right << "\n"; - } else if (op == "/") { - irStream << " " << temp << " = sdiv " << type << " " << left << ", " << right << "\n"; - } else if (op == "%") { - irStream << " " << temp << " = srem " << type << " " << left << ", " << right << "\n"; - } - - // SysY IR - sysy::IRBuilder builder(currentIRBlock); - sysy::Instruction::Kind kind; - if (type == "i32") { - if (op == "*") kind = sysy::Instruction::kMul; - else if (op == "/") kind = sysy::Instruction::kDiv; - else kind = sysy::Instruction::kRem; - } else { - if (op == "*") kind = sysy::Instruction::kFMul; - else if (op == "/") kind = sysy::Instruction::kFDiv; - else kind = sysy::Instruction::kFRem; - } - auto binaryInst = builder.createBinaryInst(kind, irType, irLeft, irRight, temp); - irTmpTable[temp] = binaryInst; - left = temp; - irLeft = binaryInst; - } - return left; -} - -std::any LLVMIRGenerator::visitAddExp(SysYParser::AddExpContext* ctx) { - auto mulExps = ctx->mulExp(); - std::string left = std::any_cast(mulExps[0]->accept(this)); - sysy::Value* irLeft = irTmpTable[left]; - sysy::Type* irType = irLeft->getType(); - - for (size_t i = 1; i < mulExps.size(); ++i) { - std::string right = std::any_cast(mulExps[i]->accept(this)); - sysy::Value* irRight = irTmpTable[right]; - std::string op = ctx->children[2 * i - 1]->getText(); - std::string temp = getNextTemp(); - std::string type = tmpTable[left]; - tmpTable[temp] = type; - - // 文本 IR - if (op == "+") { - irStream << " " << temp << " = add nsw " << type << " " << left << ", " << right << "\n"; - } else if (op == "-") { - irStream << " " << temp << " = sub nsw " << type << " " << left << ", " << right << "\n"; - } - - // SysY IR - sysy::IRBuilder builder(currentIRBlock); - sysy::Instruction::Kind kind = (type == "i32") ? (op == "+" ? sysy::Instruction::kAdd : sysy::Instruction::kSub) - : (op == "+" ? sysy::Instruction::kFAdd : sysy::Instruction::kFSub); - auto binaryInst = builder.createBinaryInst(kind, irType, irLeft, irRight, temp); - irTmpTable[temp] = binaryInst; - left = temp; - irLeft = binaryInst; - } - return left; -} - -std::any LLVMIRGenerator::visitRelExp(SysYParser::RelExpContext* ctx) { - auto addExps = ctx->addExp(); - std::string left = std::any_cast(addExps[0]->accept(this)); - sysy::Value* irLeft = irTmpTable[left]; - sysy::Type* irType = sysy::Type::getIntType(); // 比较结果为 i1 - - for (size_t i = 1; i < addExps.size(); ++i) { - std::string right = std::any_cast(addExps[i]->accept(this)); - sysy::Value* irRight = irTmpTable[right]; - std::string op = ctx->children[2 * i - 1]->getText(); - std::string temp = getNextTemp(); - std::string type = tmpTable[left]; - tmpTable[temp] = "i1"; - - // 文本 IR - if (op == "<") { - irStream << " " << temp << " = icmp slt " << type << " " << left << ", " << right << "\n"; - } else if (op == ">") { - irStream << " " << temp << " = icmp sgt " << type << " " << left << ", " << right << "\n"; - } else if (op == "<=") { - irStream << " " << temp << " = icmp sle " << type << " " << left << ", " << right << "\n"; - } else if (op == ">=") { - irStream << " " << temp << " = icmp sge " << type << " " << left << ", " << right << "\n"; - } - - // SysY IR - sysy::IRBuilder builder(currentIRBlock); - sysy::Instruction::Kind kind; - if (type == "i32") { - if (op == "<") kind = sysy::Instruction::kICmpLT; - else if (op == ">") kind = sysy::Instruction::kICmpGT; - else if (op == "<=") kind = sysy::Instruction::kICmpLE; - else kind = sysy::Instruction::kICmpGE; - } else { - if (op == "<") kind = sysy::Instruction::kFCmpLT; - else if (op == ">") kind = sysy::Instruction::kFCmpGT; - else if (op == "<=") kind = sysy::Instruction::kFCmpLE; - else kind = sysy::Instruction::kFCmpGE; - } - auto cmpInst = builder.createBinaryInst(kind, irType, irLeft, irRight, temp); - irTmpTable[temp] = cmpInst; - left = temp; - irLeft = cmpInst; - } - return left; -} - -std::any LLVMIRGenerator::visitEqExp(SysYParser::EqExpContext* ctx) { - auto relExps = ctx->relExp(); - std::string left = std::any_cast(relExps[0]->accept(this)); - sysy::Value* irLeft = irTmpTable[left]; - sysy::Type* irType = sysy::Type::getIntType(); // 比较结果为 i1 - - for (size_t i = 1; i < relExps.size(); ++i) { - std::string right = std::any_cast(relExps[i]->accept(this)); - sysy::Value* irRight = irTmpTable[right]; - std::string op = ctx->children[2 * i - 1]->getText(); - std::string temp = getNextTemp(); - std::string type = tmpTable[left]; - tmpTable[temp] = "i1"; - - // 文本 IR - if (op == "==") { - irStream << " " << temp << " = icmp eq " << type << " " << left << ", " << right << "\n"; - } else if (op == "!=") { - irStream << " " << temp << " = icmp ne " << type << " " << left << ", " << right << "\n"; - } - - // SysY IR - sysy::IRBuilder builder(currentIRBlock); - sysy::Instruction::Kind kind = (type == "i32") ? (op == "==" ? sysy::Instruction::kICmpEQ : sysy::Instruction::kICmpNE) - : (op == "==" ? sysy::Instruction::kFCmpEQ : sysy::Instruction::kFCmpNE); - auto cmpInst = builder.createBinaryInst(kind, irType, irLeft, irRight, temp); - irTmpTable[temp] = cmpInst; - left = temp; - irLeft = cmpInst; - } - return left; -} - -std::any LLVMIRGenerator::visitLAndExp(SysYParser::LAndExpContext* ctx) { - auto eqExps = ctx->eqExp(); - std::string left = std::any_cast(eqExps[0]->accept(this)); - sysy::Value* irLeft = irTmpTable[left]; - - for (size_t i = 1; i < eqExps.size(); ++i) { - std::string falseLabel = "land.false." + std::to_string(tempCounter); - std::string endLabel = "land.end." + std::to_string(tempCounter++); - sysy::BasicBlock* falseBlock = currentIRFunction->addBasicBlock(falseLabel); - sysy::BasicBlock* endBlock = currentIRFunction->addBasicBlock(endLabel); - std::string temp = getNextTemp(); - tmpTable[temp] = "i1"; - - // 文本 IR - irStream << " br i1 " << left << ", label %" << falseLabel << ", label %" << endLabel << "\n"; - irStream << falseLabel << ":\n"; - - // SysY IR - sysy::IRBuilder builder(currentIRBlock); - builder.createCondBrInst(irLeft, falseBlock, endBlock, {}, {}); - setIRPosition(falseBlock); - - std::string right = std::any_cast(eqExps[i]->accept(this)); - sysy::Value* irRight = irTmpTable[right]; - irStream << " " << temp << " = and i1 " << left << ", " << right << "\n"; - irStream << " br label %" << endLabel << "\n"; - irStream << endLabel << ":\n"; - - // SysY IR 逻辑与(通过基本块实现短路求值) - builder.setPosition(falseBlock, falseBlock->end()); - auto andInst = builder.createBinaryInst(sysy::Instruction::kICmpEQ, sysy::Type::getIntType(), irLeft, irRight, temp); - builder.createUncondBrInst(endBlock, {}); - irTmpTable[temp] = andInst; - left = temp; - irLeft = andInst; - setIRPosition(endBlock); - } - return left; -} - -std::any LLVMIRGenerator::visitLOrExp(SysYParser::LOrExpContext* ctx) { - auto lAndExps = ctx->lAndExp(); - std::string left = std::any_cast(lAndExps[0]->accept(this)); - sysy::Value* irLeft = irTmpTable[left]; - - for (size_t i = 1; i < lAndExps.size(); ++i) { - std::string trueLabel = "lor.true." + std::to_string(tempCounter); - std::string endLabel = "lor.end." + std::to_string(tempCounter++); - sysy::BasicBlock* trueBlock = currentIRFunction->addBasicBlock(trueLabel); - sysy::BasicBlock* endBlock = currentIRFunction->addBasicBlock(endLabel); - std::string temp = getNextTemp(); - tmpTable[temp] = "i1"; - - // 文本 IR - irStream << " br i1 " << left << ", label %" << trueLabel << ", label %" << endLabel << "\n"; - irStream << trueLabel << ":\n"; - - // SysY IR - sysy::IRBuilder builder(currentIRBlock); - builder.createCondBrInst(irLeft, trueBlock, endBlock, {}, {}); - setIRPosition(trueBlock); - - std::string right = std::any_cast(lAndExps[i]->accept(this)); - sysy::Value* irRight = irTmpTable[right]; - irStream << " " << temp << " = or i1 " << left << ", " << right << "\n"; - irStream << " br label %" << endLabel << "\n"; - irStream << endLabel << ":\n"; - - // SysY IR 逻辑或(通过基本块实现短路求值) - builder.setPosition(trueBlock, trueBlock->end()); - auto orInst = builder.createBinaryInst(sysy::Instruction::kICmpEQ, sysy::Type::getIntType(), irLeft, irRight, temp); - builder.createUncondBrInst(endBlock, {}); - irTmpTable[temp] = orInst; - left = temp; - irLeft = orInst; - setIRPosition(endBlock); - } - return left; -} - -// } // namespace sysy \ No newline at end of file diff --git a/src/RISCv32Backend.cpp b/src/RISCv32Backend.cpp deleted file mode 100644 index c02f9e1..0000000 --- a/src/RISCv32Backend.cpp +++ /dev/null @@ -1,1348 +0,0 @@ -#include "RISCv32Backend.h" -#include -#include -#include -#include -#include -#include // For std::function - -#define DEBUG 0 -#define DEEPDEBUG 0 -namespace sysy { - -// 可用于分配的寄存器(整数和浮点) -const std::vector RISCv32CodeGen::allocable_regs = { - // 整数寄存器 - PhysicalReg::T0, PhysicalReg::T1, PhysicalReg::T2, PhysicalReg::T3, - PhysicalReg::T4, PhysicalReg::T5, PhysicalReg::T6, - PhysicalReg::A0, PhysicalReg::A1, PhysicalReg::A2, PhysicalReg::A3, - PhysicalReg::A4, PhysicalReg::A5, PhysicalReg::A6, PhysicalReg::A7, - PhysicalReg::S0, PhysicalReg::S1, PhysicalReg::S2, PhysicalReg::S3, - PhysicalReg::S4, PhysicalReg::S5, PhysicalReg::S6, PhysicalReg::S7, - PhysicalReg::S8, PhysicalReg::S9, PhysicalReg::S10, PhysicalReg::S11, - // 浮点寄存器 - PhysicalReg::F0, PhysicalReg::F1, PhysicalReg::F2, PhysicalReg::F3, - PhysicalReg::F4, PhysicalReg::F5, PhysicalReg::F6, PhysicalReg::F7, - PhysicalReg::F8, PhysicalReg::F9, PhysicalReg::F10, PhysicalReg::F11, - PhysicalReg::F12, PhysicalReg::F13, PhysicalReg::F14, PhysicalReg::F15, - PhysicalReg::F16, PhysicalReg::F17, PhysicalReg::F18, PhysicalReg::F19, - PhysicalReg::F20, PhysicalReg::F21, PhysicalReg::F22, PhysicalReg::F23, - PhysicalReg::F24, PhysicalReg::F25, PhysicalReg::F26, PhysicalReg::F27, - PhysicalReg::F28, PhysicalReg::F29, PhysicalReg::F30, PhysicalReg::F31 -}; - -// 将物理寄存器枚举转换为字符串 -std::string RISCv32CodeGen::reg_to_string(PhysicalReg reg) { - switch (reg) { - case PhysicalReg::ZERO: return "x0"; - case PhysicalReg::RA: return "ra"; - case PhysicalReg::SP: return "sp"; - case PhysicalReg::GP: return "gp"; - case PhysicalReg::TP: return "tp"; - case PhysicalReg::T0: return "t0"; - case PhysicalReg::T1: return "t1"; - case PhysicalReg::T2: return "t2"; - case PhysicalReg::S0: return "s0"; - case PhysicalReg::S1: return "s1"; - case PhysicalReg::A0: return "a0"; - case PhysicalReg::A1: return "a1"; - case PhysicalReg::A2: return "a2"; - case PhysicalReg::A3: return "a3"; - case PhysicalReg::A4: return "a4"; - case PhysicalReg::A5: return "a5"; - case PhysicalReg::A6: return "a6"; - case PhysicalReg::A7: return "a7"; - case PhysicalReg::S2: return "s2"; - case PhysicalReg::S3: return "s3"; - case PhysicalReg::S4: return "s4"; - case PhysicalReg::S5: return "s5"; - case PhysicalReg::S6: return "s6"; - case PhysicalReg::S7: return "s7"; - case PhysicalReg::S8: return "s8"; - case PhysicalReg::S9: return "s9"; - case PhysicalReg::S10: return "s10"; - case PhysicalReg::S11: return "s11"; - case PhysicalReg::T3: return "t3"; - case PhysicalReg::T4: return "t4"; - case PhysicalReg::T5: return "t5"; - case PhysicalReg::T6: return "t6"; - // 浮点寄存器 - case PhysicalReg::F0: return "f0"; - case PhysicalReg::F1: return "f1"; - case PhysicalReg::F2: return "f2"; - case PhysicalReg::F3: return "f3"; - case PhysicalReg::F4: return "f4"; - case PhysicalReg::F5: return "f5"; - case PhysicalReg::F6: return "f6"; - case PhysicalReg::F7: return "f7"; - case PhysicalReg::F8: return "f8"; - case PhysicalReg::F9: return "f9"; - case PhysicalReg::F10: return "f10"; - case PhysicalReg::F11: return "f11"; - case PhysicalReg::F12: return "f12"; - case PhysicalReg::F13: return "f13"; - case PhysicalReg::F14: return "f14"; - case PhysicalReg::F15: return "f15"; - case PhysicalReg::F16: return "f16"; - case PhysicalReg::F17: return "f17"; - case PhysicalReg::F18: return "f18"; - case PhysicalReg::F19: return "f19"; - case PhysicalReg::F20: return "f20"; - case PhysicalReg::F21: return "f21"; - case PhysicalReg::F22: return "f22"; - case PhysicalReg::F23: return "f23"; - case PhysicalReg::F24: return "f24"; - case PhysicalReg::F25: return "f25"; - case PhysicalReg::F26: return "f26"; - case PhysicalReg::F27: return "f27"; - case PhysicalReg::F28: return "f28"; - case PhysicalReg::F29: return "f29"; - case PhysicalReg::F30: return "f30"; - case PhysicalReg::F31: return "f31"; - default: return "UNKNOWN_REG"; - } -} - -// 总体代码生成入口 -std::string RISCv32CodeGen::code_gen() { - std::stringstream ss; - ss << module_gen(); - return ss.str(); -} - -// 模块级代码生成 (处理全局变量和函数) -std::string RISCv32CodeGen::module_gen() { - std::stringstream ss; - bool has_globals = !module->getGlobals().empty(); - if (has_globals) { - ss << ".data\n"; // 数据段 - for (const auto& global : module->getGlobals()) { - ss << ".globl " << global->getName() << "\n"; // 声明全局符号 - ss << global->getName() << ":\n"; // 标签 - const auto& init_values = global->getInitValues(); - for (size_t i = 0; i < init_values.getValues().size(); ++i) { - auto val = init_values.getValues()[i]; - auto count = init_values.getNumbers()[i]; - if (auto constant = dynamic_cast(val)) { - for (unsigned j = 0; j < count; ++j) { - if (constant->isInt()) { - ss << " .word " << constant->getInt() << "\n"; // 整数常量 - } else { - float f = constant->getFloat(); - uint32_t float_bits = *(uint32_t*)&f; - ss << " .word " << float_bits << "\n"; // 浮点常量 (按位存储) - } - } - } - } - } - } - if (!module->getFunctions().empty()) { - ss << ".text\n"; // 代码段 - for (const auto& func : module->getFunctions()) { - ss << function_gen(func.second.get()); - } - } - return ss.str(); -} - -// 函数级代码生成 -std::string RISCv32CodeGen::function_gen(Function* func) { - std::stringstream ss; - ss << ".globl " << func->getName() << "\n"; // 声明函数为全局符号 - ss << func->getName() << ":\n"; // 函数入口标签 - - // 执行寄存器分配。alloc_result 包含了虚拟寄存器到物理寄存器的映射, - // 以及 AllocaInst 到栈偏移的映射 (stack_map)。 - // 在 register_allocation 内部,我们将确保参数和它们的 AllocaInst 之间建立映射。 - RegAllocResult alloc_result = register_allocation(func); - int stack_size = alloc_result.stack_size; - - // 函数序言 (Prologue) - // 保存 ra 和 s0, 调整栈指针 - // s0 指向当前帧的底部(分配局部变量/溢出空间后的 sp) - // 确保栈大小 16 字节对齐 - int aligned_stack_size = (stack_size + 15) & ~15; - - // 只有当需要栈空间时才生成序言 - if (aligned_stack_size > 0) { - ss << " addi sp, sp, -" << aligned_stack_size << "\n"; // 调整栈指针 - ss << " sw ra, " << (aligned_stack_size - 4) << "(sp)\n"; // 保存返回地址 - ss << " sw s0, " << (aligned_stack_size - 8) << "(sp)\n"; // 保存帧指针 - ss << " mv s0, sp\n"; // 设置新的帧指针 - } - - // *** 新增的逻辑:处理传入的函数参数 *** - // 将传入的寄存器参数 (a0-a7 / f10-f17) 保存到对应的栈槽 (AllocaInst)。 - // 这适用于参数被前端视为局部变量并立即 alloca 的情况。 - int arg_idx = 0; - BasicBlock* entry_bb = func->getEntryBlock(); // 获取函数的入口基本块 - - if (entry_bb) { // 确保入口基本块存在 - // 遍历入口基本块的形式参数列表 (这些通常是对应的 AllocaInst) - for (AllocaInst* alloca_for_param : entry_bb->getArguments()) { - // RISC-V ABI 规定前8个参数通过寄存器传递 (a0-a7 for int, f10-f17 for float) - if (arg_idx >= 8) { - std::cerr << "警告: 函数 '" << func->getName() << "' 的参数 (索引 " << arg_idx << ") 数量超过了 RISC-V 寄存器传递限制 (8个参数)。\n" - << " 这些参数目前未通过栈正确处理,可能导致错误。\n"; - break; // 简化处理,暂时不支持超过8个的栈传递参数 - } - - // 检查该 AllocaInst 是否有栈映射(应该在 register_allocation 阶段被分配) - if (alloc_result.stack_map.count(alloca_for_param)) { // AllocaInst* 直接作为键 - int offset = alloc_result.stack_map.at(alloca_for_param); // 获取栈偏移 - - // 获取 AllocaInst 所分配的内存的基类型(例如,i32* %x0 对应的基类型是 i32) - Type* allocated_type = alloca_for_param->getType()->as()->getBaseType(); - - // 根据参数类型选择源寄存器和存储指令 - if (allocated_type->isInt()) { - PhysicalReg arg_reg = static_cast(static_cast(PhysicalReg::A0) + arg_idx); - std::string arg_reg_str = reg_to_string(arg_reg); - ss << " sw " << arg_reg_str << ", " << offset << "(s0)\n"; - } else if (allocated_type->isFloat()) { - PhysicalReg farg_reg = static_cast(static_cast(PhysicalReg::F10) + arg_idx); // RISC-V 浮点参数通常从f10开始 - std::string farg_reg_str = reg_to_string(farg_reg); - ss << " fsw " << farg_reg_str << ", " << offset << "(s0)\n"; - } else { - // 如果遇到不支持的类型,抛出运行时错误 - throw std::runtime_error("Unsupported function argument type encountered during parameter saving to stack."); - } - } else { - std::cerr << "警告: 函数参数对应的 AllocaInst '" - << (alloca_for_param->getName().empty() ? "anonymous" : alloca_for_param->getName()) - << "' 没有在栈映射中找到。这可能导致后续代码生成错误。\n"; - } - arg_idx++; - } - } else { - std::cerr << "错误: 函数 '" << func->getName() << "' 没有入口基本块。\n"; - } - // *** 新增逻辑结束 *** - - // 生成每个基本块的代码 - int block_idx = 0; // 用于生成默认 entry 标签的索引 - for (const auto& bb : func->getBasicBlocks()) { - // basicBlock_gen 的第三个参数是 int block_idx,与 RISCv32Backend.h 中的定义一致 - ss << basicBlock_gen(bb.get(), alloc_result, block_idx++); - } - - // 函数尾声 (Epilogue) 由 RETURN DAGNode 的指令选择处理,确保正确恢复栈和寄存器 - // 注意:这里的尾声生成在 select_instructions 的 RETURN case 中实现, - // 因此在 function_gen 结束时,只需要返回 ss.str()。 - return ss.str(); -} - - -// 基本块代码生成 -std::string RISCv32CodeGen::basicBlock_gen(BasicBlock* bb, const RegAllocResult& alloc, int block_idx) { - std::stringstream ss; - - // 修复空标签问题:如果块名为空,使用伪名称 (例如 entry_block_0) - std::string bb_name = bb->getName(); - if (bb_name.empty()) { - bb_name = ENTRY_BLOCK_PSEUDO_NAME + std::to_string(block_idx); - // 如果是第一个块,且没有名称,则通常是函数入口块,可以考虑直接使用 "entry" - // 但为了通用性,伪名称更安全 - if (block_idx == 0) { // 第一个块通常是 entry 块 - bb_name = "entry"; - } - } - else { - ss << bb_name << ":\n"; // 基本块标签 - } - // !!! 重要的修改:此处不再清除 value_vreg_map 和 vreg_counter。 - // !!! 这些映射在 function_gen -> register_allocation 阶段为整个函数建立。 - // value_vreg_map.clear(); // 移除此行 - // vreg_counter = 0; // 移除此行 - - // 构建当前基本块的 DAG - // 注意:DAGNode 的唯一性在当前函数范围内是重要的, - // 所以 build_dag 应该返回一个完整的 DAG 节点列表,而不是每次都创建新的。 - // 为了简化,这里仍然按块构建,但需要注意跨块值的使用。 - auto dag_nodes_for_bb = build_dag(bb); - if (DEBUG) - print_dag(dag_nodes_for_bb, bb_name); // 打印 DAG 调试信息 - - // 存储最终生成的指令 - std::set emitted_nodes; // 跟踪已发射的节点,防止重复 - std::vector ordered_insts; // 用于收集指令并按序排列 - - // 在 DAG 中遍历并生成指令。由于 select_instructions 可能会递归地为操作数选择指令, - // 并且 emit_instructions 也会递归地发射,我们需要一个机制来确保指令的正确顺序和唯一性。 - // 最简单的方法是逆拓扑序遍历所有节点,确保其操作数先被处理。 - // 但是目前的 DAG 构建方式可能不支持直接的拓扑排序, - // 我们将依赖 emit_instructions 的递归特性来处理依赖。 - - // 遍历 DAG 的根节点(没有用户的节点,或者 Store/Return/Branch 节点) - // 从这些节点开始递归发射指令。 - // NOTE: 这种发射方式可能不总是产生最优的代码顺序,但可以确保依赖关系。 - for (auto it = dag_nodes_for_bb.rbegin(); it != dag_nodes_for_bb.rend(); ++it) { - DAGNode* node = it->get(); - // 只有那些没有用户(或者代表副作用,如STORE, RETURN, BRANCH)的节点才需要作为发射的“根” - // 否则,它们会被其用户节点递归地发射 - // 然而,为了确保所有指令都被发射,我们通常从所有节点(或者至少是副作用节点)开始发射 - // 并且利用 emitted_nodes 集合防止重复 - // 这里简化为对所有 DAG 节点进行一次 select_instructions 和 emit_instructions 调用。 - // emit_instructions 会通过递归处理其操作数来保证依赖顺序。 - select_instructions(node, alloc); // 为当前节点选择指令 - } - - // 收集所有指令到一个临时的 vector 中,然后进行排序 - // 注意:这里的发射逻辑需要重新设计,目前的 emit_instructions 是直接添加到 std::vector& insts 中 - // 并且期望是按顺序添加的,这在递归时难以保证。 - // 更好的方法是让 emit_instructions 直接输出到 stringstream,并控制递归顺序。 - // 但是为了最小化改动,我们先保持 emit_instructions 的现有签名, - // 然后在它内部处理指令的收集和去重。 - - // 重新设计 emit_instructions 的调用方式 - // 这里的思路是,每个 DAGNode 都存储了自己及其依赖(如果未被其他节点引用)的指令。 - // 最终,我们遍历 BasicBlock 中的所有原始 IR 指令,找到它们对应的 DAGNode,然后发射。 - // 这是因为 IR 指令的顺序决定了代码的逻辑顺序。 - - // 遍历 IR 指令,并找到对应的 DAGNode 进行发射 - // 由于 build_dag 是从 IR 指令顺序构建的,我们应该按照 IR 指令的顺序来发射。 - emitted_nodes.clear(); // 再次清空已发射节点集合 - // 临时存储每个 IR 指令对应的 DAGNode,因为 DAGNode 列表是平铺的 - std::map inst_to_dag_node; - for (const auto& dag_node_ptr : dag_nodes_for_bb) { - if (dag_node_ptr->value && dynamic_cast(dag_node_ptr->value)) { - inst_to_dag_node[dynamic_cast(dag_node_ptr->value)] = dag_node_ptr.get(); - } - } - - for (const auto& inst_ptr : bb->getInstructions()) { - DAGNode* node_to_emit = nullptr; - // 查找当前 IR 指令在 DAG 中对应的节点。 - // 注意:不是所有 IR 指令都会直接映射到一个“根”DAGNode (例如,某些值可能只作为操作数存在) - // 但终结符(如 Branch, Return)和 Store 指令总是重要的。 - // 对于 load/binary 等,我们应该在 build_dag 中确保它们有一个结果 vreg,并被后续指令使用。 - // 如果一个 IR 指令是某个 DAGNode 的 value,那么我们就发射那个 DAGNode。 - if (inst_to_dag_node.count(inst_ptr.get())) { - node_to_emit = inst_to_dag_node.at(inst_ptr.get()); - } - - if (node_to_emit) { - // 注意:select_instructions 已经在上面统一调用过,这里只需要 emit。 - // 但如果 select_instructions 没有递归地为所有依赖选择指令,这里可能需要重新考虑。 - // 为了简化,我们假定 select_instructions 在第一次被调用时(通常在 emit 之前)已经递归地为所有操作数选择了指令。 - - // 直接将指令添加到 ss 中,而不是通过 vector 中转 - emit_instructions(node_to_emit, ss, alloc, emitted_nodes); - } - } - - return ss.str(); -} - -std::vector> RISCv32CodeGen::build_dag(BasicBlock* bb) { - std::vector> nodes_storage; // 存储所有 unique_ptr - std::map value_to_node; // 将 IR Value* 映射到原始 DAGNode*,用于快速查找 - - // 辅助函数,用于创建 DAGNode 并管理其所有权 - auto create_node = [&](DAGNode::NodeKind kind, Value* val = nullptr) -> DAGNode* { - // 优化:如果一个值已经有节点并且它不是控制流/存储/Alloca地址/一元操作,则重用它 (CSE) - // 对于 AllocaInst,我们想创建一个代表其地址的节点,但不一定直接为 AllocaInst 本身分配虚拟寄存器。 - if (val && value_to_node.count(val) && kind != DAGNode::STORE && kind != DAGNode::RETURN && kind != DAGNode::BRANCH && kind != DAGNode::ALLOCA_ADDR && kind != DAGNode::UNARY) { - return value_to_node[val]; - } - - auto node = std::make_unique(kind); - node->value = val; - - // 为产生结果的值分配虚拟寄存器 - // 注意:这里的vreg分配是在每个块中独立进行的,但寄存器分配器是在函数级别运行的 - // 我们在寄存器分配前,已经为整个函数的所有value预分配了vreg - // 此处的逻辑应完全依赖于 register_allocation 阶段已经建立的 value_vreg_map - // 并且 AllocaInst 不应在此处获取 result_vreg,因为它不映射到物理寄存器。 - if (val && value_vreg_map.count(val) && !dynamic_cast(val)) { // 排除 AllocaInst - node->result_vreg = value_vreg_map.at(val); - } - // 如果 val 即使在 value_vreg_map 中存在,但它是 AllocaInst,则不分配 result_vreg。 - // 对于 DAGNode::ALLOCA_ADDR 节点,它的 result_vreg 应该为空,因为其“值”是内存地址, - // 在指令选择时直接转换为 s0 + 偏移量。 - - DAGNode* raw_node_ptr = node.get(); - nodes_storage.push_back(std::move(node)); // 存储 unique_ptr - - // 仅当 IR Value 表示一个计算值时,才将其映射到创建的 DAGNode - // 且它应该已经在 register_allocation 中被分配了 vreg - if (val && value_vreg_map.count(val) && kind != DAGNode::STORE && kind != DAGNode::RETURN && kind != DAGNode::BRANCH && !dynamic_cast(val)) { - value_to_node[val] = raw_node_ptr; - } - return raw_node_ptr; - }; - - - for (const auto& inst_ptr : bb->getInstructions()) { - auto inst = inst_ptr.get(); - - if (auto alloca = dynamic_cast(inst)) { - // AllocaInst 本身不产生寄存器中的值,但其地址将被 load/store 使用。 - // 创建一个节点来表示分配内存的地址。 - // 这个地址将是 s0 (帧指针) 的偏移量。 - // 我们将 AllocaInst 指针存储在 DAGNode 的 `value` 字段中。 - // 修正:AllocaInst 类型的 DAGNode 应该有一个 value 对应 AllocaInst* - // 但它本身不应该有 result_vreg,因为不映射到物理寄存器。 - create_node(DAGNode::ALLOCA_ADDR, alloca); - } else if (auto store = dynamic_cast(inst)) { - auto store_node = create_node(DAGNode::STORE, store); // 将 store inst 绑定到 node - - // 获取要存储的值 - Value* val_to_store_ir = store->getValue(); - DAGNode* val_node = nullptr; - if (value_to_node.count(val_to_store_ir)) { - val_node = value_to_node[val_to_store_ir]; - } else if (auto constant = dynamic_cast(val_to_store_ir)) { - val_node = create_node(DAGNode::CONSTANT, constant); - } else { // 这是一个尚未在此块中计算的值,假设它需要加载 (从内存或参数) - val_node = create_node(DAGNode::LOAD, val_to_store_ir); - } - - // 获取内存位置的指针 - Value* ptr_ir = store->getPointer(); - DAGNode* ptr_node = nullptr; - if (value_to_node.count(ptr_ir)) { - ptr_node = value_to_node[ptr_ir]; - } else if (auto alloca = dynamic_cast(ptr_ir)) { - // 如果是alloca,我们应该找到代表它地址的节点 - // 为了简化,如果没找到,就创建一个 - // 修正:AllocaInst 应该直接映射到 ALLOCA_ADDR 节点,其值是 AllocaInst* - ptr_node = create_node(DAGNode::ALLOCA_ADDR, alloca); - } else if (auto global = dynamic_cast(ptr_ir)) { - ptr_node = create_node(DAGNode::CONSTANT, global); // 全局地址将被加载 - } else { // 必须是存储在虚拟寄存器中的指针 - ptr_node = create_node(DAGNode::LOAD, ptr_ir); // 这是一个产生指针的指令 - } - - store_node->operands.push_back(val_node); - store_node->operands.push_back(ptr_node); - val_node->users.push_back(store_node); - ptr_node->users.push_back(store_node); - } else if (auto load = dynamic_cast(inst)) { - if (value_to_node.count(load)) continue; // 共同子表达式消除 (CSE) - - auto load_node = create_node(DAGNode::LOAD, load); // 为 load_node 分配 result_vreg 并映射 load - - Value* ptr_ir = load->getPointer(); - DAGNode* ptr_node = nullptr; - if (value_to_node.count(ptr_ir)) { - ptr_node = value_to_node[ptr_ir]; - } else if (auto alloca = dynamic_cast(ptr_ir)) { - // 修正:AllocaInst 应该直接映射到 ALLOCA_ADDR 节点 - ptr_node = create_node(DAGNode::ALLOCA_ADDR, alloca); - } else if (auto global = dynamic_cast(ptr_ir)) { - ptr_node = create_node(DAGNode::CONSTANT, global); // 全局地址将被加载 - } else { // 必须是存储在虚拟寄存器中的指针 - ptr_node = create_node(DAGNode::LOAD, ptr_ir); // 这是一个产生指针的指令 - } - - load_node->operands.push_back(ptr_node); - ptr_node->users.push_back(load_node); - } else if (auto bin = dynamic_cast(inst)) { - if (value_to_node.count(bin)) continue; // CSE - - // --- 关键修改:识别 SUB 0, X 或 FSUB 0.0, X 模式为 NEG --- - if (bin->getKind() == BinaryInst::kSub || bin->getKind() == BinaryInst::kFSub) { - Value* lhs_ir = bin->getLhs(); - if (auto const_lhs = dynamic_cast(lhs_ir)) { // 修正:使用 ConstantValue - bool is_neg = false; - if (const_lhs->getType()->isInt()) { // 整数类型 - if (const_lhs->getInt() == 0) { - is_neg = true; - } - } else if (const_lhs->getType()->isFloat()) { // 浮点类型 - // 浮点数零的比较需要考虑精度,使用一个小的epsilon - if (std::fabs(const_lhs->getFloat()) < std::numeric_limits::epsilon()) { - is_neg = true; - } - } - - if (is_neg) { - // 这是一个 neg 操作 (0 - X 或 0.0 - X) - auto unary_node = create_node(DAGNode::UNARY, bin); // 绑定到原 BinaryInst,但类型是 UNARY - Value* operand_ir = bin->getRhs(); // 右操作数是实际被 neg 的值 - DAGNode* operand_node = nullptr; - if (value_to_node.count(operand_ir)) { - operand_node = value_to_node[operand_ir]; - } else if (auto constant = dynamic_cast(operand_ir)) { - operand_node = create_node(DAGNode::CONSTANT, constant); - } else { - operand_node = create_node(DAGNode::LOAD, operand_ir); - } - unary_node->operands.push_back(operand_node); - operand_node->users.push_back(unary_node); - continue; // 已处理,跳过后续的常规 Binary 处理 - } - } - } - // --- 结束关键修改 --- - - // 常规二进制操作 - auto bin_node = create_node(DAGNode::BINARY, bin); - - auto get_operand_node = [&](Value* operand_ir) -> DAGNode* { - if (value_to_node.count(operand_ir)) { - return value_to_node[operand_ir]; - } else if (auto constant = dynamic_cast(operand_ir)) { - return create_node(DAGNode::CONSTANT, constant); - } else { - // 这是一个由另一个指令或参数产生的值,如果不在 map 中,则假设需要加载 - return create_node(DAGNode::LOAD, operand_ir); - } - }; - - DAGNode* lhs_node = get_operand_node(bin->getLhs()); - DAGNode* rhs_node = get_operand_node(bin->getRhs()); - - bin_node->operands.push_back(lhs_node); - bin_node->operands.push_back(rhs_node); - lhs_node->users.push_back(bin_node); - rhs_node->users.push_back(bin_node); - } else if (auto un_inst = dynamic_cast(inst)) { // 处理一元指令 - if (value_to_node.count(un_inst)) continue; // CSE - - auto unary_node = create_node(DAGNode::UNARY, un_inst); // 为 unary_node 分配 result_vreg 并映射 un_inst - - // 修正:UnaryInst::getOperand() 不接受参数 - Value* operand_ir = un_inst->getOperand(); - DAGNode* operand_node = nullptr; - if (value_to_node.count(operand_ir)) { - operand_node = value_to_node[operand_ir]; - } else if (auto constant = dynamic_cast(operand_ir)) { - operand_node = create_node(DAGNode::CONSTANT, constant); - } else { - operand_node = create_node(DAGNode::LOAD, operand_ir); - } - - unary_node->operands.push_back(operand_node); - operand_node->users.push_back(unary_node); - } else if (auto call = dynamic_cast(inst)) { - if (value_to_node.count(call)) continue; // CSE (如果结果被重用) - - auto call_node = create_node(DAGNode::CALL, call); // 如果调用返回一个值,则分配 result_vreg - - for (auto arg : call->getArguments()) { - auto arg_val_ir = arg->getValue(); - DAGNode* arg_node = nullptr; - if (value_to_node.count(arg_val_ir)) { - arg_node = value_to_node[arg_val_ir]; - } else if (auto constant = dynamic_cast(arg_val_ir)) { - arg_node = create_node(DAGNode::CONSTANT, constant); - } else { - arg_node = create_node(DAGNode::LOAD, arg_val_ir); - } - call_node->operands.push_back(arg_node); - arg_node->users.push_back(call_node); - } - } else if (auto ret = dynamic_cast(inst)) { - auto ret_node = create_node(DAGNode::RETURN, ret); // 将 return inst 绑定到 node - if (ret->hasReturnValue()) { - auto val_ir = ret->getReturnValue(); - DAGNode* val_node = nullptr; - if (value_to_node.count(val_ir)) { - val_node = value_to_node[val_ir]; - } else if (auto constant = dynamic_cast(val_ir)) { - val_node = create_node(DAGNode::CONSTANT, constant); - } else { - val_node = create_node(DAGNode::LOAD, val_ir); - } - ret_node->operands.push_back(val_node); - val_node->users.push_back(ret_node); - } - } else if (auto cond_br = dynamic_cast(inst)) { - auto br_node = create_node(DAGNode::BRANCH, cond_br); // 将 cond_br inst 绑定到 node - auto cond_ir = cond_br->getCondition(); - - if (auto constant_cond = dynamic_cast(cond_ir)) { - // 优化常量条件分支为无条件跳转 - br_node->inst = "j " + (constant_cond->getInt() ? cond_br->getThenBlock()->getName() : cond_br->getElseBlock()->getName()); - // 对于直接跳转,不需要操作数 - } else { - DAGNode* cond_node = nullptr; - if (value_to_node.count(cond_ir)) { - cond_node = value_to_node[cond_ir]; - } else if (auto bin_cond = dynamic_cast(cond_ir)) { - cond_node = create_node(DAGNode::BINARY, bin_cond); - } else { // 必须是一个需要加载的值 - cond_node = create_node(DAGNode::LOAD, cond_ir); - } - br_node->operands.push_back(cond_node); - cond_node->users.push_back(br_node); - } - } else if (auto uncond_br = dynamic_cast(inst)) { - auto br_node = create_node(DAGNode::BRANCH, uncond_br); // 将 uncond_br inst 绑定到 node - br_node->inst = "j " + uncond_br->getBlock()->getName(); - } - } - - return nodes_storage; -} - -// 打印 DAG (保持不变) -void RISCv32CodeGen::print_dag(const std::vector>& dag, const std::string& bb_name) { - std::cerr << "=== DAG for Basic Block: " << bb_name << " ===\n"; - std::set visited; - - // 辅助映射,用于在打印输出中为节点分配顺序 ID - std::map node_to_id; - int current_id = 0; - for (const auto& node_ptr : dag) { - node_to_id[node_ptr.get()] = current_id++; - } - - std::function print_node = [&](DAGNode* node, int indent) { - if (!node) return; - - std::string current_indent(indent, ' '); - int node_id = node_to_id.count(node) ? node_to_id[node] : -1; // 获取分配的 ID - - std::cerr << current_indent << "Node#" << node_id << ": " << node->getNodeKindString(); - if (!node->result_vreg.empty()) { - std::cerr << " (vreg: " << node->result_vreg << ")"; - } - - if (node->value) { - std::cerr << " ["; - if (auto inst = dynamic_cast(node->value)) { - std::cerr << inst->getKindString(); - if (!inst->getName().empty()) { - std::cerr << "(" << inst->getName() << ")"; - } - } else if (auto constant = dynamic_cast(node->value)) { - if (constant->isInt()) { - std::cerr << "ConstInt(" << constant->getInt() << ")"; - } else { - std::cerr << "ConstFloat(" << constant->getFloat() << ")"; - } - } else if (auto global = dynamic_cast(node->value)) { - std::cerr << "Global(" << global->getName() << ")"; - } else if (auto alloca = dynamic_cast(node->value)) { - std::cerr << "Alloca(" << (alloca->getName().empty() ? ("%" + std::to_string(reinterpret_cast(alloca) % 1000)) : alloca->getName()) << ")"; - } - std::cerr << "]"; - } - std::cerr << " -> Inst: \"" << node->inst << "\""; // 打印选定的指令 - std::cerr << "\n"; - - if (visited.find(node) != visited.end()) { - std::cerr << current_indent << " (已打印后代)\n"; - return; // 避免循环的无限递归 - } - visited.insert(node); - - - if (!node->operands.empty()) { - std::cerr << current_indent << " 操作数:\n"; - for (auto operand : node->operands) { - print_node(operand, indent + 4); - } - } - // 移除了 users 打印,以简化输出并避免 DAG 中的冗余递归。 - // Users 更适用于向上遍历,而不是向下遍历。 - }; - - // 遍历 DAG,以尊重依赖的方式打印。 - // 当前实现:遍历所有节点,从作为“根”的节点开始打印(没有用户或副作用节点)。 - // 每次打印新的根时,重置 visited 集合,以允许共享子图被重新打印(尽管这不是最高效的方式)。 - for (const auto& node_ptr : dag) { - // 只有那些没有用户或者表示副作用(如 store/branch/return)的节点才被视为“根” - // 这样可以确保所有指令(包括那些没有明确结果的)都被打印 - if (node_ptr->users.empty() || node_ptr->kind == DAGNode::STORE || node_ptr->kind == DAGNode::RETURN || node_ptr->kind == DAGNode::BRANCH) { - visited.clear(); // 为每个根重置 visited,允许重新打印共享子图 - print_node(node_ptr.get(), 0); - } - } - std::cerr << "=== DAG 结束 ===\n\n"; -} - - -// 指令选择 (保持不变,因为问题不在选择器本身,而是分配) -void RISCv32CodeGen::select_instructions(DAGNode* node, const RegAllocResult& alloc) { - if (!node) return; - if (!node->inst.empty()) return; // 指令已选择,跳过重复处理 - - // 递归地为操作数选择指令,确保依赖先被处理 - for (auto operand : node->operands) { - if (operand) { - select_instructions(operand, alloc); - } - } - - std::stringstream ss_inst; // 使用 stringstream 构建指令 - - // 获取分配的物理寄存器,若未分配则回退到 t0 - auto get_preg_or_temp = [&](const std::string& vreg) { - if (alloc.vreg_to_preg.count(vreg)) { - return reg_to_string(alloc.vreg_to_preg.at(vreg)); - } - return reg_to_string(PhysicalReg::T0); // 回退到临时寄存器 t0 - }; - - // 获取栈变量的内存偏移量 - auto get_stack_offset = [&](Value* val) { - if (alloc.stack_map.count(val)) { - return std::to_string(alloc.stack_map.at(val)); - } - return std::string("0"); // 默认或错误情况 - }; - - switch (node->kind) { - case DAGNode::CONSTANT: { - // 处理常量节点 - if (auto constant = dynamic_cast(node->value)) { - std::string dest_reg = get_preg_or_temp(node->result_vreg); - if (constant->isInt()) { - ss_inst << "li " << dest_reg << ", " << constant->getInt(); - } else { - float f = constant->getFloat(); - uint32_t float_bits = *(uint32_t*)&f; - ss_inst << "li " << dest_reg << ", " << float_bits << "\n"; - ss_inst << "fmv.w.x " << dest_reg << ", " << dest_reg; - } - } else if (auto global = dynamic_cast(node->value)) { - std::string dest_reg = get_preg_or_temp(node->result_vreg); - ss_inst << "la " << dest_reg << ", " << global->getName(); - } - break; - } - case DAGNode::ALLOCA_ADDR: { - // ALLOCA_ADDR 节点不直接生成指令,由 LOAD/STORE 使用 - break; - } - case DAGNode::LOAD: { - // 处理加载指令 - if (node->operands.empty() || !node->operands[0]) break; - std::string dest_reg = get_preg_or_temp(node->result_vreg); - DAGNode* ptr_node = node->operands[0]; - - if (ptr_node->kind == DAGNode::ALLOCA_ADDR) { - if (auto alloca_inst = dynamic_cast(ptr_node->value)) { - int offset = alloc.stack_map.at(alloca_inst); - ss_inst << "lw " << dest_reg << ", " << offset << "(s0)"; - } - } else { - std::string ptr_reg = get_preg_or_temp(ptr_node->result_vreg); - ss_inst << "lw " << dest_reg << ", 0(" << ptr_reg << ")"; - } - break; - } - case DAGNode::STORE: { - // 处理存储指令 - if (node->operands.size() < 2 || !node->operands[0] || !node->operands[1]) break; - DAGNode* val_node = node->operands[0]; - DAGNode* ptr_node = node->operands[1]; - - std::string src_reg; - if (val_node->kind == DAGNode::CONSTANT) { - src_reg = get_preg_or_temp(val_node->result_vreg); - } else { - src_reg = get_preg_or_temp(val_node->result_vreg); - } - - if (ptr_node->kind == DAGNode::ALLOCA_ADDR) { - if (auto alloca_inst = dynamic_cast(ptr_node->value)) { - int offset = alloc.stack_map.at(alloca_inst); - ss_inst << "sw " << src_reg << ", " << offset << "(s0)"; - } - } else { - std::string ptr_reg = get_preg_or_temp(ptr_node->result_vreg); - ss_inst << "sw " << src_reg << ", 0(" << ptr_reg << ")"; - } - break; - } - case DAGNode::BINARY: { - // 处理二元指令 - if (node->operands.size() < 2 || !node->operands[0] || !node->operands[1]) break; - auto bin = dynamic_cast(node->value); - if (!bin) break; - - std::string dest_reg = get_preg_or_temp(node->result_vreg); - std::string lhs_reg = get_preg_or_temp(node->operands[0]->result_vreg); - std::string rhs_reg = get_preg_or_temp(node->operands[1]->result_vreg); - - std::string opcode; - switch (bin->getKind()) { - case BinaryInst::kAdd: opcode = "add"; break; - case BinaryInst::kSub: opcode = "sub"; break; - case BinaryInst::kMul: opcode = "mul"; break; - case BinaryInst::kICmpEQ: - ss_inst << "sub " << dest_reg << ", " << lhs_reg << ", " << rhs_reg << "\n"; - ss_inst << " seqz " << dest_reg << ", " << dest_reg; - node->inst = ss_inst.str(); - return; - case Instruction::kDiv: opcode = "div"; break; - case Instruction::kRem: opcode = "rem"; break; - case BinaryInst::kICmpGE: - ss_inst << "slt " << dest_reg << ", " << lhs_reg << ", " << rhs_reg << "\n"; - ss_inst << " xori " << dest_reg << ", " << dest_reg << ", 1"; - node->inst = ss_inst.str(); - return; - case BinaryInst::kICmpGT: - opcode = "slt"; - ss_inst << opcode << " " << dest_reg << ", " << rhs_reg << ", " << lhs_reg; - node->inst = ss_inst.str(); - return; - case BinaryInst::kICmpLE: - ss_inst << "slt " << dest_reg << ", " << rhs_reg << ", " << lhs_reg << "\n"; - ss_inst << " xori " << dest_reg << ", " << dest_reg << ", 1"; - node->inst = ss_inst.str(); - return; - case BinaryInst::kICmpLT: - opcode = "slt"; - ss_inst << opcode << " " << dest_reg << ", " << lhs_reg << ", " << rhs_reg; - node->inst = ss_inst.str(); - return; - case BinaryInst::kICmpNE: - ss_inst << "sub " << dest_reg << ", " << lhs_reg << ", " << rhs_reg << "\n"; - ss_inst << " snez " << dest_reg << ", " << dest_reg; - node->inst = ss_inst.str(); - return; - default: - throw std::runtime_error("不支持的二元指令类型: " + bin->getKindString()); - } - if (!opcode.empty()) { - ss_inst << opcode << " " << dest_reg << ", " << lhs_reg << ", " << rhs_reg; - } - break; - } - case DAGNode::UNARY: { - // 处理一元指令 - if (node->operands.empty() || !node->operands[0]) break; - auto unary = dynamic_cast(node->value); - if (!unary) break; - - std::string dest_reg = get_preg_or_temp(node->result_vreg); - std::string src_reg = get_preg_or_temp(node->operands[0]->result_vreg); - - switch (unary->getKind()) { - case UnaryInst::kNeg: - // 整数取负:sub rd, x0, rs (等价于 neg rd, rs) - ss_inst << "sub " << dest_reg << ", x0, " << src_reg; - break; - case UnaryInst::kNot: - // 整数逻辑非:seqz rd, rs (rs == 0 时 rd = 1,否则 rd = 0) - ss_inst << "seqz " << dest_reg << ", " << src_reg; - break; - case UnaryInst::kFNeg: - case UnaryInst::kFNot: - case UnaryInst::kFtoI: - case UnaryInst::kItoF: - case UnaryInst::kBitFtoI: - case UnaryInst::kBitItoF: - // 浮点相关指令,当前不支持 - throw std::runtime_error("不支持的浮点一元指令类型: " + unary->getKindString()); - default: - throw std::runtime_error("不支持的一元指令类型: " + unary->getKindString()); - } - break; - } - case DAGNode::CALL: { - // 处理函数调用指令 - if (!node->value) break; - auto call = dynamic_cast(node->value); - if (!call) break; - - for (size_t i = 0; i < node->operands.size() && i < 8; ++i) { - if (node->operands[i] && !node->operands[i]->result_vreg.empty()) { - ss_inst << "mv " << reg_to_string(static_cast(static_cast(PhysicalReg::A0) + i)) - << ", " << get_preg_or_temp(node->operands[i]->result_vreg) << "\n"; - } else if (node->operands[i] && node->operands[i]->kind == DAGNode::CONSTANT) { - if (auto const_val = dynamic_cast(node->operands[i]->value)) { - ss_inst << "li " << reg_to_string(static_cast(static_cast(PhysicalReg::A0) + i)) - << ", " << const_val->getInt() << "\n"; - } else if (auto global_val = dynamic_cast(node->operands[i]->value)) { - ss_inst << "la " << reg_to_string(static_cast(static_cast(PhysicalReg::A0) + i)) - << ", " << global_val->getName() << "\n"; - } - } - } - ss_inst << "call " << call->getCallee()->getName(); - - if ((call->getType()->isInt() || call->getType()->isFloat()) && !node->result_vreg.empty()) { - ss_inst << "\nmv " << get_preg_or_temp(node->result_vreg) << ", a0"; - } - break; - } - case DAGNode::RETURN: { - // 处理返回指令 - if (!node->operands.empty() && node->operands[0]) { - std::string return_val_reg = get_preg_or_temp(node->operands[0]->result_vreg); - ss_inst << "mv a0, " << return_val_reg << "\n"; - } - - if (alloc.stack_size > 0) { - int aligned_stack_size = (alloc.stack_size + 15) & ~15; - ss_inst << " lw ra, " << (aligned_stack_size - 4) << "(sp)\n"; - ss_inst << " lw s0, " << (aligned_stack_size - 8) << "(sp)\n"; - ss_inst << " addi sp, sp, " << aligned_stack_size << "\n"; - } - ss_inst << " ret"; - break; - } - case DAGNode::BRANCH: { - // 处理分支指令 - auto br = dynamic_cast(node->value); - auto uncond_br = dynamic_cast(node->value); - - if (node->inst.empty()) { - if (br) { - if (node->operands.empty() || !node->operands[0]) break; - std::string cond_reg = get_preg_or_temp(node->operands[0]->result_vreg); - std::string then_block = br->getThenBlock()->getName(); - std::string else_block = br->getElseBlock()->getName(); - - if (then_block.empty()) { - then_block = ENTRY_BLOCK_PSEUDO_NAME + "then"; - } - if (else_block.empty()) { - else_block = ENTRY_BLOCK_PSEUDO_NAME + "else"; - } - - ss_inst << "bnez " << cond_reg << ", " << then_block << "\n"; - ss_inst << " j " << else_block; - } else if (uncond_br) { - std::string target_block = uncond_br->getBlock()->getName(); - if (target_block.empty()) { - target_block = ENTRY_BLOCK_PSEUDO_NAME + "target"; - } - ss_inst << "j " << target_block; - } - } else { - ss_inst << node->inst; - } - break; - } - default: - throw std::runtime_error("不支持的节点类型: " + node->getNodeKindString()); - } - node->inst = ss_inst.str(); // 存储生成的指令 -} - -// 修改:指令发射,直接输出到 stringstream,处理依赖和去重 -void RISCv32CodeGen::emit_instructions(DAGNode* node, std::stringstream& ss, const RegAllocResult& alloc, std::set& emitted_nodes) { - if (!node || emitted_nodes.count(node)) { - return; // 已发射或为空 - } - - // 递归地发射操作数以确保满足依赖关系 - for (auto operand : node->operands) { - if (operand) { - emit_instructions(operand, ss, alloc, emitted_nodes); - } - } - - // 标记当前节点为已发射 - emitted_nodes.insert(node); - - // 分割多行指令并处理每一行 - std::stringstream node_inst_ss(node->inst); - std::string line; - - while (std::getline(node_inst_ss, line, '\n')) { - // 清除前导/尾随空白并移除行开头的潜在标签 - line = std::regex_replace(line, std::regex("^\\s*[^\\s:]*:\\s*"), ""); // 移除标签(例如 `label: inst`) - line = std::regex_replace(line, std::regex("^\\s+|\\s+$"), ""); // 清除空白 - - if (line.empty()) continue; - - // 处理虚拟寄存器替换和溢出/加载逻辑 - std::string processed_line = line; - - // 注意:这里的替换逻辑比较脆弱,因为 select_instructions 已经直接生成了物理寄存器名 - // 在一个更健壮的系统中,select_instructions 会生成带vreg的指令,而这里会进行替换 - // 当前的实现下,这个替换逻辑大部分时间是空操作,但为了安全保留 - - // 替换结果虚拟寄存器 (如果此行中存在) - if (!node->result_vreg.empty() && alloc.vreg_to_preg.count(node->result_vreg)) { - std::string preg = reg_to_string(alloc.vreg_to_preg.at(node->result_vreg)); - processed_line = std::regex_replace(processed_line, std::regex("\\b" + node->result_vreg + "\\b"), preg); - } - - // 替换操作数虚拟寄存器 (如果此行中存在) - for (auto operand : node->operands) { - if (operand && !operand->result_vreg.empty() && alloc.vreg_to_preg.count(operand->result_vreg)) { - std::string operand_preg = reg_to_string(alloc.vreg_to_preg.at(operand->result_vreg)); - processed_line = std::regex_replace(processed_line, std::regex("\\b" + operand->result_vreg + "\\b"), operand_preg); - } - } - - // 添加处理后的指令 - ss << " " << processed_line << "\n"; - } -} - -// 辅助函数:将集合打印为字符串 -std::string print_set(const std::set& s) { - std::stringstream ss; - ss << "{"; - bool first = true; - for (const auto& elem : s) { - if (!first) { - ss << ", "; - } - ss << elem; - first = false; - } - ss << "}"; - return ss.str(); -} - -// 活跃性分析(更新以支持浮点指令) -std::map> RISCv32CodeGen::liveness_analysis(Function* func) { - std::map> live_in, live_out; - bool changed = true; - - for (const auto& bb : func->getBasicBlocks()) { - for (const auto& inst_ptr : bb->getInstructions()) { - live_in[inst_ptr.get()] = {}; - live_out[inst_ptr.get()] = {}; - } - } - - int iteration_count = 0; - while (changed) { - changed = false; - iteration_count++; - if (DEEPDEBUG) std::cerr << "\n--- 活跃性分析迭代: " << iteration_count << " ---" << std::endl; - - for (auto it = func->getBasicBlocks_NoRange().rbegin(); it != func->getBasicBlocks_NoRange().rend(); ++it) { - auto bb = it->get(); - if (DEEPDEBUG) std::cerr << " 基本块: " << bb->getName() << std::endl; - - std::set live_out_for_bb_inst = {}; - for (const auto& succ_bb : bb->getSuccessors()) { - if (!succ_bb->getInstructions().empty()) { - Instruction* first_inst_in_succ = succ_bb->getInstructions().front().get(); - live_out_for_bb_inst.insert(live_in[first_inst_in_succ].begin(), live_in[first_inst_in_succ].end()); - } - } - - for (auto inst_it = bb->getInstructions().rbegin(); inst_it != bb->getInstructions().rend(); ++inst_it) { - auto inst = inst_it->get(); - if (DEEPDEBUG) std::cerr << " 指令 (BB: " << bb->getName() << ", 地址: " << static_cast(inst) << ")" << std::endl; - - std::set current_live_in = live_in[inst]; - std::set current_live_out = live_out[inst]; - std::set new_live_out_calc; - - if (inst_it == bb->getInstructions().rbegin()) { - new_live_out_calc = live_out_for_bb_inst; - if (DEEPDEBUG) std::cerr << " 指令是基本块的最后一条指令,live_out 取自后继基本块 live_in 的并集: " << print_set(new_live_out_calc) << std::endl; - } else { - auto prev_inst_it = std::prev(inst_it); - new_live_out_calc = live_in[prev_inst_it->get()]; - if (DEEPDEBUG) std::cerr << " 指令不是基本块的最后一条,其 live_out 是其后继指令 live_in: " << print_set(new_live_out_calc) << std::endl; - } - - std::set use_set, def_set; - - // 定义 (Def) - if (!inst->getType()->isVoid() && !dynamic_cast(inst) && !dynamic_cast(inst) && - !dynamic_cast(inst) && !dynamic_cast(inst) && !dynamic_cast(inst) && value_vreg_map.count(inst)) { - def_set.insert(value_vreg_map.at(inst)); - if (DEEPDEBUG) std::cerr << " 指令 (地址: " << static_cast(inst) << ") 定义了虚拟寄存器: " << value_vreg_map.at(inst) << std::endl; - } - - // StoreInst 的值可能被“杀死” - if (auto store = dynamic_cast(inst)) { - Value* stored_value = store->getValue(); - if (value_vreg_map.count(stored_value) && !dynamic_cast(stored_value)) { - bool is_unique_user = true; - if (!stored_value->getUses().empty()) { - is_unique_user = (stored_value->getUses().size() == 1 && stored_value->getUses().front()->getUser() == inst); - } else { - is_unique_user = false; - } - if (is_unique_user) { - def_set.insert(value_vreg_map.at(stored_value)); - if (DEEPDEBUG) std::cerr << " Store 指令 (地址: " << static_cast(inst) << ") 将被存储的值 '" << value_vreg_map.at(stored_value) << "' 添加到 def_set (启发式)." << std::endl; - } - } - } - - // 使用 (Use) - for (const auto& operand_use : inst->getOperands()) { - Value* operand = operand_use->getValue(); - if (value_vreg_map.count(operand) && !dynamic_cast(operand)) { - use_set.insert(value_vreg_map.at(operand)); - if (DEEPDEBUG) std::cerr << " 指令 (地址: " << static_cast(inst) << ") 使用了虚拟寄存器: " << value_vreg_map.at(operand) << std::endl; - } - } - if (DEEPDEBUG) std::cerr << " 指令 (地址: " << static_cast(inst) << ") 的 use_set: " << print_set(use_set) << std::endl; - if (DEEPDEBUG) std::cerr << " 指令 (地址: " << static_cast(inst) << ") 的 def_set: " << print_set(def_set) << std::endl; - - std::set new_live_in = use_set; - for (const auto& vreg : new_live_out_calc) { - if (def_set.find(vreg) == def_set.end()) { - new_live_in.insert(vreg); - } - } - - if (DEEPDEBUG) std::cerr << " 指令 (地址: " << static_cast(inst) << ") 计算出的 new_live_in: " << print_set(new_live_in) << std::endl; - if (DEEPDEBUG) std::cerr << " 指令 (地址: " << static_cast(inst) << ") 当前 live_in: " << print_set(current_live_in) << ", 当前 live_out: " << print_set(current_live_out) << std::endl; - - if (new_live_in != current_live_in || new_live_out_calc != current_live_out) { - live_in[inst] = new_live_in; - live_out[inst] = new_live_out_calc; - changed = true; - if (DEEPDEBUG) std::cerr << " 指令 (地址: " << static_cast(inst) << ") 活跃性集合发生变化,更新并继续迭代." << std::endl; - } - } - } - } - return live_in; -} - -// 干扰图构建 (基本保持不变) -std::map> RISCv32CodeGen::build_interference_graph( - const std::map>& live_sets) { - std::map> graph; - - // 确保 live_sets 中所有存在的虚拟寄存器最初都在图中 - for (const auto& pair : live_sets) { - for (const auto& vreg : pair.second) { - graph[vreg] = {}; // 初始化空集合 - } - } - - for (const auto& pair : live_sets) { - auto inst = pair.first; - const auto& live_after_inst = pair.second; // 这实际上是下一条指令/基本块入口的 live_in - - std::string defined_vreg; - // 修正:只有当指令结果是需要物理寄存器时才视为定义。 - // AllocaInst 不应在此处处理。 - if (value_vreg_map.count(inst) && !dynamic_cast(inst)) { - defined_vreg = value_vreg_map.at(inst); - } - - // 将从 defined vreg 到此时所有其他活跃 vreg 的边添加 - if (!defined_vreg.empty()) { - for (const auto& live_vreg : live_after_inst) { - if (live_vreg != defined_vreg) { // 虚拟寄存器不与其自身干扰 - graph[defined_vreg].insert(live_vreg); - graph[live_vreg].insert(defined_vreg); // 对称边 - } - } - } - } - return graph; -} - -// 图着色(支持浮点寄存器) -void RISCv32CodeGen::color_graph(std::map& vreg_to_preg, - const std::map>& interference_graph) { - vreg_to_preg.clear(); - - // 分离整数和浮点寄存器池 - std::vector int_regs = { - PhysicalReg::T0, PhysicalReg::T1, PhysicalReg::T2, PhysicalReg::T3, - PhysicalReg::T4, PhysicalReg::T5, PhysicalReg::T6, - PhysicalReg::A0, PhysicalReg::A1, PhysicalReg::A2, PhysicalReg::A3, - PhysicalReg::A4, PhysicalReg::A5, PhysicalReg::A6, PhysicalReg::A7, - PhysicalReg::S0, PhysicalReg::S1, PhysicalReg::S2, PhysicalReg::S3, - PhysicalReg::S4, PhysicalReg::S5, PhysicalReg::S6, PhysicalReg::S7, - PhysicalReg::S8, PhysicalReg::S9, PhysicalReg::S10, PhysicalReg::S11 - }; - std::vector float_regs = { - PhysicalReg::F0, PhysicalReg::F1, PhysicalReg::F2, PhysicalReg::F3, - PhysicalReg::F4, PhysicalReg::F5, PhysicalReg::F6, PhysicalReg::F7, - PhysicalReg::F8, PhysicalReg::F9, PhysicalReg::F10, PhysicalReg::F11, - PhysicalReg::F12, PhysicalReg::F13, PhysicalReg::F14, PhysicalReg::F15, - PhysicalReg::F16, PhysicalReg::F17, PhysicalReg::F18, PhysicalReg::F19, - PhysicalReg::F20, PhysicalReg::F21, PhysicalReg::F22, PhysicalReg::F23, - PhysicalReg::F24, PhysicalReg::F25, PhysicalReg::F26, PhysicalReg::F27, - PhysicalReg::F28, PhysicalReg::F29, PhysicalReg::F30, PhysicalReg::F31 - }; - - // 确定虚拟寄存器类型(整数或浮点) - auto is_float_vreg = [&](const std::string& vreg) -> bool { - for (const auto& pair : value_vreg_map) { - if (pair.second == vreg) { - if (auto inst = dynamic_cast(pair.first)) { - if (inst->isUnary()) { - switch (inst->getKind()) { - case Instruction::kFNeg: - case Instruction::kFNot: - case Instruction::kFtoI: - case Instruction::kItoF: - case Instruction::kBitFtoI: - case Instruction::kBitItoF: - return true; // 浮点相关指令 - default: - return inst->getType()->isFloat(); - } - } - return inst->getType()->isFloat(); - } else if (auto constant = dynamic_cast(pair.first)) { - return constant->isFloat(); - } - } - } - return false; // 默认整数 - }; - - // 按度数排序虚拟寄存器 - std::vector> vreg_degrees; - for (const auto& entry : interference_graph) { - vreg_degrees.push_back({entry.first, (int)entry.second.size()}); - } - std::sort(vreg_degrees.begin(), vreg_degrees.end(), - [](const auto& a, const auto& b) { return a.second > b.second; }); - - for (const auto& vreg_deg_pair : vreg_degrees) { - const std::string& vreg = vreg_deg_pair.first; - std::set used_colors; - bool is_float = is_float_vreg(vreg); - - // 收集邻居使用的颜色 - if (interference_graph.count(vreg)) { - for (const auto& neighbor_vreg : interference_graph.at(vreg)) { - if (vreg_to_preg.count(neighbor_vreg)) { - used_colors.insert(vreg_to_preg.at(neighbor_vreg)); - } - } - } - - // 选择合适的寄存器池 - const auto& available_regs = is_float ? float_regs : int_regs; - - // 查找第一个可用的寄存器 - bool colored = false; - for (PhysicalReg preg : available_regs) { - if (used_colors.find(preg) == used_colors.end()) { - vreg_to_preg[vreg] = preg; - colored = true; - break; - } - } - - if (!colored) { - std::cerr << "警告: 无法为 " << vreg << " 分配" << (is_float ? "浮点" : "整数") << "寄存器,将溢出到栈。\n"; - // 溢出处理:在 stack_map 中分配栈空间 - // 这里假设每个溢出变量占用 4 字节 - // 注意:实际中需要区分整数和浮点溢出的存储指令(如 sw vs fsw) - } - } -} - -// 寄存器分配(支持浮点寄存器) -RISCv32CodeGen::RegAllocResult RISCv32CodeGen::register_allocation(Function* func) { - eliminate_phi(func); - vreg_counter = 0; - value_vreg_map.clear(); - - // 为所有产生值的指令和操作数分配虚拟寄存器 - for (const auto& bb_ptr : func->getBasicBlocks()) { - for (const auto& inst_ptr : bb_ptr->getInstructions()) { - Instruction* inst = inst_ptr.get(); - if (!inst->getType()->isVoid() && !dynamic_cast(inst)) { - if (value_vreg_map.find(inst) == value_vreg_map.end()) { - value_vreg_map[inst] = "v" + std::to_string(vreg_counter++); - } - } - for (const auto& operand_use : inst->getOperands()) { - Value* operand = operand_use->getValue(); - if (dynamic_cast(operand) || dynamic_cast(operand)) { - if (value_vreg_map.find(operand) == value_vreg_map.end()) { - value_vreg_map[operand] = "v" + std::to_string(vreg_counter++); - } - } else if (auto op_inst = dynamic_cast(operand)) { - if (!op_inst->getType()->isVoid() && !dynamic_cast(operand)) { - if (value_vreg_map.find(operand) == value_vreg_map.end()) { - value_vreg_map[operand] = "v" + std::to_string(vreg_counter++); - } - } - } - } - } - } - - RegAllocResult alloc_result; - int current_stack_offset = 0; - std::set allocas_in_func; - - for (const auto& bb_ptr : func->getBasicBlocks()) { - for (const auto& inst_ptr : bb_ptr->getInstructions()) { - if (auto alloca = dynamic_cast(inst_ptr.get())) { - allocas_in_func.insert(alloca); - } - } - } - - for (auto alloca : allocas_in_func) { - int size = 4; // 假设 i32 或 float - alloc_result.stack_map[alloca] = current_stack_offset; - current_stack_offset += size; - } - alloc_result.stack_size = current_stack_offset + 8; - - // 活跃性分析 - std::map> live_sets = liveness_analysis(func); - - // 构建干扰图 - std::map> interference_graph = build_interference_graph(live_sets); - - // 图着色 - color_graph(alloc_result.vreg_to_preg, interference_graph); - - if (DEBUG) { - std::cerr << "=== 寄存器分配结果 (vreg_to_preg) ===\n"; - for (const auto& pair : alloc_result.vreg_to_preg) { - std::cerr << " " << pair.first << " -> " << reg_to_string(pair.second) << "\n"; - } - std::cerr << "=== 寄存器分配结果结束 ===\n\n"; - - std::cerr << "=== 活跃性分析结果 (live_in sets) ===\n"; - for (const auto& bb_ptr : func->getBasicBlocks()) { - std::cerr << "Basic Block: " << bb_ptr->getName() << "\n"; - for (const auto& inst_ptr : bb_ptr->getInstructions()) { - std::cerr << " Inst: " << inst_ptr->getKindString(); - if (!inst_ptr->getName().empty()) { - std::cerr << "(" << inst_ptr->getName() << ")"; - } - if (value_vreg_map.count(inst_ptr.get())) { - std::cerr << " (Def vreg: " << value_vreg_map.at(inst_ptr.get()) << ")"; - } - std::cerr << " (Live In: {"; - bool first = true; - if (live_sets.count(inst_ptr.get())) { - for (const auto& vreg : live_sets.at(inst_ptr.get())) { - if (!first) std::cerr << ", "; - std::cerr << vreg; - first = false; - } - } - std::cerr << "})\n"; - } - } - std::cerr << "=== 活跃性分析结果结束 ===\n\n"; - - std::cerr << "=== 干扰图 ===\n"; - for (const auto& pair : interference_graph) { - std::cerr << " " << pair.first << ": {"; - bool first = true; - for (const auto& neighbor : pair.second) { - if (!first) std::cerr << ", "; - std::cerr << neighbor; - first = false; - } - std::cerr << "}\n"; - } - std::cerr << "=== 干扰图结束 ===\n\n"; - } - - return alloc_result; -} - -// Phi 消除 (简化版,将 Phi 的结果直接复制到每个前驱基本块的末尾) -void RISCv32CodeGen::eliminate_phi(Function* func) { - // 这是一个占位符。适当的 phi 消除将涉及 - // 在每个前驱基本块的末尾插入 `mov` 指令,用于每个 phi 操作数。 - // 对于给定的 IR 示例,没有 phi 节点,所以这可能不是严格必要的, - // 但如果前端生成 phi 节点,则有此阶段是好的做法。 - // 目前,我们假设没有生成 phi 节点或者它们已在前端处理。 -} - -} // namespace sysy \ No newline at end of file diff --git a/src/RISCv32Backend.h b/src/RISCv32Backend.h deleted file mode 100644 index 0664c96..0000000 --- a/src/RISCv32Backend.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef RISCV32_BACKEND_H -#define RISCV32_BACKEND_H - -#include "IR.h" -#include -#include -#include -#include -#include -#include -#include // For std::function - -namespace sysy { - -class RISCv32CodeGen { -public: - enum class PhysicalReg { - ZERO, RA, SP, GP, TP, T0, T1, T2, S0, S1, A0, A1, A2, A3, A4, A5, A6, A7, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11, T3, T4, T5, T6, - F0, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15,F16, F17, F18, F19, F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30, F31 - }; - - // Move DAGNode and RegAllocResult to public section - struct DAGNode { - enum NodeKind { CONSTANT, LOAD, STORE, BINARY, CALL, RETURN, BRANCH, ALLOCA_ADDR, UNARY }; - NodeKind kind; - Value* value = nullptr; // For IR Value - std::string inst; // Generated RISC-V instruction(s) for this node - std::string result_vreg; // Virtual register assigned to this node's result - std::vector operands; - std::vector users; // For debugging and potentially optimizations - DAGNode(NodeKind k) : kind(k) {} - - // Debugging / helper - std::string getNodeKindString() const { - switch (kind) { - case CONSTANT: return "CONSTANT"; - case LOAD: return "LOAD"; - case STORE: return "STORE"; - case BINARY: return "BINARY"; - case CALL: return "CALL"; - case RETURN: return "RETURN"; - case BRANCH: return "BRANCH"; - case ALLOCA_ADDR: return "ALLOCA_ADDR"; - case UNARY: return "UNARY"; - default: return "UNKNOWN"; - } - } - }; - - struct RegAllocResult { - std::map vreg_to_preg; // Virtual register to Physical Register mapping - std::map stack_map; // Value (AllocaInst) to stack offset - int stack_size = 0; // Total stack frame size for locals and spills - }; - - RISCv32CodeGen(Module* mod) : module(mod) {} - - std::string code_gen(); - std::string module_gen(); - std::string function_gen(Function* func); - // 修改 basicBlock_gen 的声明,添加 int block_idx 参数 - std::string basicBlock_gen(BasicBlock* bb, const RegAllocResult& alloc, int block_idx); - - // DAG related - std::vector> build_dag(BasicBlock* bb); - void select_instructions(DAGNode* node, const RegAllocResult& alloc); - // 改变 emit_instructions 的参数,使其可以直接添加汇编指令到 main ss - void emit_instructions(DAGNode* node, std::stringstream& ss, const RegAllocResult& alloc, std::set& emitted_nodes); - - // Register Allocation related - std::map> liveness_analysis(Function* func); - std::map> build_interference_graph( - const std::map>& live_sets); - void color_graph(std::map& vreg_to_preg, - const std::map>& interference_graph); - RegAllocResult register_allocation(Function* func); - void eliminate_phi(Function* func); // Phi elimination is typically done before DAG building - - // Utility - std::string reg_to_string(PhysicalReg reg); - void print_dag(const std::vector>& dag, const std::string& bb_name); - -private: - static const std::vector allocable_regs; - std::map value_vreg_map; // Maps IR Value* to its virtual register name - Module* module; - int vreg_counter = 0; // Counter for unique virtual register names - int alloca_offset_counter = 0; // Counter for alloca offsets - - // 新增一个成员变量来存储当前函数的所有 DAGNode,以确保其生命周期贯穿整个函数代码生成 - // 这样可以在多个 BasicBlock_gen 调用中访问到完整的 DAG 节点 - std::vector> current_function_dag_nodes; - - // 为空标签定义一个伪名称前缀,加上块索引以确保唯一性 - const std::string ENTRY_BLOCK_PSEUDO_NAME = "entry_block_"; -}; - -} // namespace sysy - -#endif // RISCV32_BACKEND_H \ No newline at end of file diff --git a/src/SysY.interp b/src/SysY.interp new file mode 100644 index 0000000..1d73cfd --- /dev/null +++ b/src/SysY.interp @@ -0,0 +1,125 @@ +token literal names: +null +'const' +'int' +'float' +'void' +'if' +'else' +'while' +'break' +'continue' +'return' +'+' +'-' +'*' +'/' +'%' +'==' +'!=' +'<' +'<=' +'>' +'>=' +'&&' +'||' +'!' +'=' +',' +';' +'(' +')' +'{' +'}' +'[' +']' +null +null +null +null +null +null +null + +token symbolic names: +null +CONST +INT +FLOAT +VOID +IF +ELSE +WHILE +BREAK +CONTINUE +RETURN +ADD +SUB +MUL +DIV +MOD +EQ +NE +LT +LE +GT +GE +AND +OR +NOT +ASSIGN +COMMA +SEMICOLON +LPAREN +RPAREN +LBRACE +RBRACE +LBRACK +RBRACK +Ident +ILITERAL +FLITERAL +STRING +WS +LINECOMMENT +BLOCKCOMMENT + +rule names: +compUnit +globalDecl +decl +constDecl +bType +constDef +constInitVal +varDecl +varDef +initVal +funcType +funcDef +funcFParams +funcFParam +blockStmt +blockItem +stmt +exp +cond +lValue +primaryExp +number +call +unaryExp +unaryOp +funcRParams +string +mulExp +addExp +relExp +eqExp +lAndExp +lOrExp +constExp + + +atn: +[4, 1, 40, 359, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 1, 0, 1, 0, 4, 0, 71, 8, 0, 11, 0, 12, 0, 72, 1, 1, 1, 1, 3, 1, 77, 8, 1, 1, 2, 1, 2, 3, 2, 81, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 88, 8, 3, 10, 3, 12, 3, 91, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 102, 8, 5, 10, 5, 12, 5, 105, 9, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 115, 8, 6, 10, 6, 12, 6, 118, 9, 6, 3, 6, 120, 8, 6, 1, 6, 3, 6, 123, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 5, 7, 129, 8, 7, 10, 7, 12, 7, 132, 9, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 141, 8, 8, 10, 8, 12, 8, 144, 9, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 151, 8, 8, 10, 8, 12, 8, 154, 9, 8, 1, 8, 1, 8, 3, 8, 158, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 165, 8, 9, 10, 9, 12, 9, 168, 9, 9, 3, 9, 170, 8, 9, 1, 9, 3, 9, 173, 8, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 181, 8, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 5, 12, 189, 8, 12, 10, 12, 12, 12, 192, 9, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 202, 8, 13, 10, 13, 12, 13, 205, 9, 13, 3, 13, 207, 8, 13, 1, 14, 1, 14, 5, 14, 211, 8, 14, 10, 14, 12, 14, 214, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 3, 15, 220, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 228, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 239, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 253, 8, 16, 1, 16, 3, 16, 256, 8, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 267, 8, 19, 10, 19, 12, 19, 270, 9, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 279, 8, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 3, 22, 286, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 295, 8, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 5, 25, 302, 8, 25, 10, 25, 12, 25, 305, 9, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 5, 27, 312, 8, 27, 10, 27, 12, 27, 315, 9, 27, 1, 28, 1, 28, 1, 28, 5, 28, 320, 8, 28, 10, 28, 12, 28, 323, 9, 28, 1, 29, 1, 29, 1, 29, 5, 29, 328, 8, 29, 10, 29, 12, 29, 331, 9, 29, 1, 30, 1, 30, 1, 30, 5, 30, 336, 8, 30, 10, 30, 12, 30, 339, 9, 30, 1, 31, 1, 31, 1, 31, 5, 31, 344, 8, 31, 10, 31, 12, 31, 347, 9, 31, 1, 32, 1, 32, 1, 32, 5, 32, 352, 8, 32, 10, 32, 12, 32, 355, 9, 32, 1, 33, 1, 33, 1, 33, 0, 0, 34, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 0, 8, 1, 0, 2, 3, 1, 0, 2, 4, 1, 0, 35, 36, 2, 0, 11, 12, 24, 24, 1, 0, 13, 15, 1, 0, 11, 12, 1, 0, 18, 21, 1, 0, 16, 17, 370, 0, 70, 1, 0, 0, 0, 2, 76, 1, 0, 0, 0, 4, 80, 1, 0, 0, 0, 6, 82, 1, 0, 0, 0, 8, 94, 1, 0, 0, 0, 10, 96, 1, 0, 0, 0, 12, 122, 1, 0, 0, 0, 14, 124, 1, 0, 0, 0, 16, 157, 1, 0, 0, 0, 18, 172, 1, 0, 0, 0, 20, 174, 1, 0, 0, 0, 22, 176, 1, 0, 0, 0, 24, 185, 1, 0, 0, 0, 26, 193, 1, 0, 0, 0, 28, 208, 1, 0, 0, 0, 30, 219, 1, 0, 0, 0, 32, 255, 1, 0, 0, 0, 34, 257, 1, 0, 0, 0, 36, 259, 1, 0, 0, 0, 38, 261, 1, 0, 0, 0, 40, 278, 1, 0, 0, 0, 42, 280, 1, 0, 0, 0, 44, 282, 1, 0, 0, 0, 46, 294, 1, 0, 0, 0, 48, 296, 1, 0, 0, 0, 50, 298, 1, 0, 0, 0, 52, 306, 1, 0, 0, 0, 54, 308, 1, 0, 0, 0, 56, 316, 1, 0, 0, 0, 58, 324, 1, 0, 0, 0, 60, 332, 1, 0, 0, 0, 62, 340, 1, 0, 0, 0, 64, 348, 1, 0, 0, 0, 66, 356, 1, 0, 0, 0, 68, 71, 3, 2, 1, 0, 69, 71, 3, 22, 11, 0, 70, 68, 1, 0, 0, 0, 70, 69, 1, 0, 0, 0, 71, 72, 1, 0, 0, 0, 72, 70, 1, 0, 0, 0, 72, 73, 1, 0, 0, 0, 73, 1, 1, 0, 0, 0, 74, 77, 3, 6, 3, 0, 75, 77, 3, 14, 7, 0, 76, 74, 1, 0, 0, 0, 76, 75, 1, 0, 0, 0, 77, 3, 1, 0, 0, 0, 78, 81, 3, 6, 3, 0, 79, 81, 3, 14, 7, 0, 80, 78, 1, 0, 0, 0, 80, 79, 1, 0, 0, 0, 81, 5, 1, 0, 0, 0, 82, 83, 5, 1, 0, 0, 83, 84, 3, 8, 4, 0, 84, 89, 3, 10, 5, 0, 85, 86, 5, 26, 0, 0, 86, 88, 3, 10, 5, 0, 87, 85, 1, 0, 0, 0, 88, 91, 1, 0, 0, 0, 89, 87, 1, 0, 0, 0, 89, 90, 1, 0, 0, 0, 90, 92, 1, 0, 0, 0, 91, 89, 1, 0, 0, 0, 92, 93, 5, 27, 0, 0, 93, 7, 1, 0, 0, 0, 94, 95, 7, 0, 0, 0, 95, 9, 1, 0, 0, 0, 96, 103, 5, 34, 0, 0, 97, 98, 5, 32, 0, 0, 98, 99, 3, 66, 33, 0, 99, 100, 5, 33, 0, 0, 100, 102, 1, 0, 0, 0, 101, 97, 1, 0, 0, 0, 102, 105, 1, 0, 0, 0, 103, 101, 1, 0, 0, 0, 103, 104, 1, 0, 0, 0, 104, 106, 1, 0, 0, 0, 105, 103, 1, 0, 0, 0, 106, 107, 5, 25, 0, 0, 107, 108, 3, 12, 6, 0, 108, 11, 1, 0, 0, 0, 109, 123, 3, 66, 33, 0, 110, 119, 5, 30, 0, 0, 111, 116, 3, 12, 6, 0, 112, 113, 5, 26, 0, 0, 113, 115, 3, 12, 6, 0, 114, 112, 1, 0, 0, 0, 115, 118, 1, 0, 0, 0, 116, 114, 1, 0, 0, 0, 116, 117, 1, 0, 0, 0, 117, 120, 1, 0, 0, 0, 118, 116, 1, 0, 0, 0, 119, 111, 1, 0, 0, 0, 119, 120, 1, 0, 0, 0, 120, 121, 1, 0, 0, 0, 121, 123, 5, 31, 0, 0, 122, 109, 1, 0, 0, 0, 122, 110, 1, 0, 0, 0, 123, 13, 1, 0, 0, 0, 124, 125, 3, 8, 4, 0, 125, 130, 3, 16, 8, 0, 126, 127, 5, 26, 0, 0, 127, 129, 3, 16, 8, 0, 128, 126, 1, 0, 0, 0, 129, 132, 1, 0, 0, 0, 130, 128, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, 131, 133, 1, 0, 0, 0, 132, 130, 1, 0, 0, 0, 133, 134, 5, 27, 0, 0, 134, 15, 1, 0, 0, 0, 135, 142, 5, 34, 0, 0, 136, 137, 5, 32, 0, 0, 137, 138, 3, 66, 33, 0, 138, 139, 5, 33, 0, 0, 139, 141, 1, 0, 0, 0, 140, 136, 1, 0, 0, 0, 141, 144, 1, 0, 0, 0, 142, 140, 1, 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 158, 1, 0, 0, 0, 144, 142, 1, 0, 0, 0, 145, 152, 5, 34, 0, 0, 146, 147, 5, 32, 0, 0, 147, 148, 3, 66, 33, 0, 148, 149, 5, 33, 0, 0, 149, 151, 1, 0, 0, 0, 150, 146, 1, 0, 0, 0, 151, 154, 1, 0, 0, 0, 152, 150, 1, 0, 0, 0, 152, 153, 1, 0, 0, 0, 153, 155, 1, 0, 0, 0, 154, 152, 1, 0, 0, 0, 155, 156, 5, 25, 0, 0, 156, 158, 3, 18, 9, 0, 157, 135, 1, 0, 0, 0, 157, 145, 1, 0, 0, 0, 158, 17, 1, 0, 0, 0, 159, 173, 3, 34, 17, 0, 160, 169, 5, 30, 0, 0, 161, 166, 3, 18, 9, 0, 162, 163, 5, 26, 0, 0, 163, 165, 3, 18, 9, 0, 164, 162, 1, 0, 0, 0, 165, 168, 1, 0, 0, 0, 166, 164, 1, 0, 0, 0, 166, 167, 1, 0, 0, 0, 167, 170, 1, 0, 0, 0, 168, 166, 1, 0, 0, 0, 169, 161, 1, 0, 0, 0, 169, 170, 1, 0, 0, 0, 170, 171, 1, 0, 0, 0, 171, 173, 5, 31, 0, 0, 172, 159, 1, 0, 0, 0, 172, 160, 1, 0, 0, 0, 173, 19, 1, 0, 0, 0, 174, 175, 7, 1, 0, 0, 175, 21, 1, 0, 0, 0, 176, 177, 3, 20, 10, 0, 177, 178, 5, 34, 0, 0, 178, 180, 5, 28, 0, 0, 179, 181, 3, 24, 12, 0, 180, 179, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 183, 5, 29, 0, 0, 183, 184, 3, 28, 14, 0, 184, 23, 1, 0, 0, 0, 185, 190, 3, 26, 13, 0, 186, 187, 5, 26, 0, 0, 187, 189, 3, 26, 13, 0, 188, 186, 1, 0, 0, 0, 189, 192, 1, 0, 0, 0, 190, 188, 1, 0, 0, 0, 190, 191, 1, 0, 0, 0, 191, 25, 1, 0, 0, 0, 192, 190, 1, 0, 0, 0, 193, 194, 3, 8, 4, 0, 194, 206, 5, 34, 0, 0, 195, 196, 5, 32, 0, 0, 196, 203, 5, 33, 0, 0, 197, 198, 5, 32, 0, 0, 198, 199, 3, 34, 17, 0, 199, 200, 5, 33, 0, 0, 200, 202, 1, 0, 0, 0, 201, 197, 1, 0, 0, 0, 202, 205, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 207, 1, 0, 0, 0, 205, 203, 1, 0, 0, 0, 206, 195, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 27, 1, 0, 0, 0, 208, 212, 5, 30, 0, 0, 209, 211, 3, 30, 15, 0, 210, 209, 1, 0, 0, 0, 211, 214, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 212, 213, 1, 0, 0, 0, 213, 215, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 215, 216, 5, 31, 0, 0, 216, 29, 1, 0, 0, 0, 217, 220, 3, 4, 2, 0, 218, 220, 3, 32, 16, 0, 219, 217, 1, 0, 0, 0, 219, 218, 1, 0, 0, 0, 220, 31, 1, 0, 0, 0, 221, 222, 3, 38, 19, 0, 222, 223, 5, 25, 0, 0, 223, 224, 3, 34, 17, 0, 224, 225, 5, 27, 0, 0, 225, 256, 1, 0, 0, 0, 226, 228, 3, 34, 17, 0, 227, 226, 1, 0, 0, 0, 227, 228, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 256, 5, 27, 0, 0, 230, 256, 3, 28, 14, 0, 231, 232, 5, 5, 0, 0, 232, 233, 5, 28, 0, 0, 233, 234, 3, 36, 18, 0, 234, 235, 5, 29, 0, 0, 235, 238, 3, 32, 16, 0, 236, 237, 5, 6, 0, 0, 237, 239, 3, 32, 16, 0, 238, 236, 1, 0, 0, 0, 238, 239, 1, 0, 0, 0, 239, 256, 1, 0, 0, 0, 240, 241, 5, 7, 0, 0, 241, 242, 5, 28, 0, 0, 242, 243, 3, 36, 18, 0, 243, 244, 5, 29, 0, 0, 244, 245, 3, 32, 16, 0, 245, 256, 1, 0, 0, 0, 246, 247, 5, 8, 0, 0, 247, 256, 5, 27, 0, 0, 248, 249, 5, 9, 0, 0, 249, 256, 5, 27, 0, 0, 250, 252, 5, 10, 0, 0, 251, 253, 3, 34, 17, 0, 252, 251, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 256, 5, 27, 0, 0, 255, 221, 1, 0, 0, 0, 255, 227, 1, 0, 0, 0, 255, 230, 1, 0, 0, 0, 255, 231, 1, 0, 0, 0, 255, 240, 1, 0, 0, 0, 255, 246, 1, 0, 0, 0, 255, 248, 1, 0, 0, 0, 255, 250, 1, 0, 0, 0, 256, 33, 1, 0, 0, 0, 257, 258, 3, 56, 28, 0, 258, 35, 1, 0, 0, 0, 259, 260, 3, 64, 32, 0, 260, 37, 1, 0, 0, 0, 261, 268, 5, 34, 0, 0, 262, 263, 5, 32, 0, 0, 263, 264, 3, 34, 17, 0, 264, 265, 5, 33, 0, 0, 265, 267, 1, 0, 0, 0, 266, 262, 1, 0, 0, 0, 267, 270, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 268, 269, 1, 0, 0, 0, 269, 39, 1, 0, 0, 0, 270, 268, 1, 0, 0, 0, 271, 272, 5, 28, 0, 0, 272, 273, 3, 34, 17, 0, 273, 274, 5, 29, 0, 0, 274, 279, 1, 0, 0, 0, 275, 279, 3, 38, 19, 0, 276, 279, 3, 42, 21, 0, 277, 279, 3, 52, 26, 0, 278, 271, 1, 0, 0, 0, 278, 275, 1, 0, 0, 0, 278, 276, 1, 0, 0, 0, 278, 277, 1, 0, 0, 0, 279, 41, 1, 0, 0, 0, 280, 281, 7, 2, 0, 0, 281, 43, 1, 0, 0, 0, 282, 283, 5, 34, 0, 0, 283, 285, 5, 28, 0, 0, 284, 286, 3, 50, 25, 0, 285, 284, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 288, 5, 29, 0, 0, 288, 45, 1, 0, 0, 0, 289, 295, 3, 40, 20, 0, 290, 295, 3, 44, 22, 0, 291, 292, 3, 48, 24, 0, 292, 293, 3, 46, 23, 0, 293, 295, 1, 0, 0, 0, 294, 289, 1, 0, 0, 0, 294, 290, 1, 0, 0, 0, 294, 291, 1, 0, 0, 0, 295, 47, 1, 0, 0, 0, 296, 297, 7, 3, 0, 0, 297, 49, 1, 0, 0, 0, 298, 303, 3, 34, 17, 0, 299, 300, 5, 26, 0, 0, 300, 302, 3, 34, 17, 0, 301, 299, 1, 0, 0, 0, 302, 305, 1, 0, 0, 0, 303, 301, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 51, 1, 0, 0, 0, 305, 303, 1, 0, 0, 0, 306, 307, 5, 37, 0, 0, 307, 53, 1, 0, 0, 0, 308, 313, 3, 46, 23, 0, 309, 310, 7, 4, 0, 0, 310, 312, 3, 46, 23, 0, 311, 309, 1, 0, 0, 0, 312, 315, 1, 0, 0, 0, 313, 311, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 55, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 316, 321, 3, 54, 27, 0, 317, 318, 7, 5, 0, 0, 318, 320, 3, 54, 27, 0, 319, 317, 1, 0, 0, 0, 320, 323, 1, 0, 0, 0, 321, 319, 1, 0, 0, 0, 321, 322, 1, 0, 0, 0, 322, 57, 1, 0, 0, 0, 323, 321, 1, 0, 0, 0, 324, 329, 3, 56, 28, 0, 325, 326, 7, 6, 0, 0, 326, 328, 3, 56, 28, 0, 327, 325, 1, 0, 0, 0, 328, 331, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 59, 1, 0, 0, 0, 331, 329, 1, 0, 0, 0, 332, 337, 3, 58, 29, 0, 333, 334, 7, 7, 0, 0, 334, 336, 3, 58, 29, 0, 335, 333, 1, 0, 0, 0, 336, 339, 1, 0, 0, 0, 337, 335, 1, 0, 0, 0, 337, 338, 1, 0, 0, 0, 338, 61, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 340, 345, 3, 60, 30, 0, 341, 342, 5, 22, 0, 0, 342, 344, 3, 60, 30, 0, 343, 341, 1, 0, 0, 0, 344, 347, 1, 0, 0, 0, 345, 343, 1, 0, 0, 0, 345, 346, 1, 0, 0, 0, 346, 63, 1, 0, 0, 0, 347, 345, 1, 0, 0, 0, 348, 353, 3, 62, 31, 0, 349, 350, 5, 23, 0, 0, 350, 352, 3, 62, 31, 0, 351, 349, 1, 0, 0, 0, 352, 355, 1, 0, 0, 0, 353, 351, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 65, 1, 0, 0, 0, 355, 353, 1, 0, 0, 0, 356, 357, 3, 56, 28, 0, 357, 67, 1, 0, 0, 0, 37, 70, 72, 76, 80, 89, 103, 116, 119, 122, 130, 142, 152, 157, 166, 169, 172, 180, 190, 203, 206, 212, 219, 227, 238, 252, 255, 268, 278, 285, 294, 303, 313, 321, 329, 337, 345, 353] \ No newline at end of file diff --git a/src/SysY.tokens b/src/SysY.tokens new file mode 100644 index 0000000..4345538 --- /dev/null +++ b/src/SysY.tokens @@ -0,0 +1,73 @@ +CONST=1 +INT=2 +FLOAT=3 +VOID=4 +IF=5 +ELSE=6 +WHILE=7 +BREAK=8 +CONTINUE=9 +RETURN=10 +ADD=11 +SUB=12 +MUL=13 +DIV=14 +MOD=15 +EQ=16 +NE=17 +LT=18 +LE=19 +GT=20 +GE=21 +AND=22 +OR=23 +NOT=24 +ASSIGN=25 +COMMA=26 +SEMICOLON=27 +LPAREN=28 +RPAREN=29 +LBRACE=30 +RBRACE=31 +LBRACK=32 +RBRACK=33 +Ident=34 +ILITERAL=35 +FLITERAL=36 +STRING=37 +WS=38 +LINECOMMENT=39 +BLOCKCOMMENT=40 +'const'=1 +'int'=2 +'float'=3 +'void'=4 +'if'=5 +'else'=6 +'while'=7 +'break'=8 +'continue'=9 +'return'=10 +'+'=11 +'-'=12 +'*'=13 +'/'=14 +'%'=15 +'=='=16 +'!='=17 +'<'=18 +'<='=19 +'>'=20 +'>='=21 +'&&'=22 +'||'=23 +'!'=24 +'='=25 +','=26 +';'=27 +'('=28 +')'=29 +'{'=30 +'}'=31 +'['=32 +']'=33 diff --git a/src/SysYBaseVisitor.cpp b/src/SysYBaseVisitor.cpp new file mode 100644 index 0000000..b70482b --- /dev/null +++ b/src/SysYBaseVisitor.cpp @@ -0,0 +1,7 @@ + +// Generated from SysY.g4 by ANTLR 4.13.2 + + +#include "SysYBaseVisitor.h" + + diff --git a/src/SysYLexer.cpp b/src/SysYLexer.cpp new file mode 100644 index 0000000..dde9d25 --- /dev/null +++ b/src/SysYLexer.cpp @@ -0,0 +1,292 @@ + +// Generated from SysY.g4 by ANTLR 4.13.2 + + +#include "SysYLexer.h" + + +using namespace antlr4; + + + +using namespace antlr4; + +namespace { + +struct SysYLexerStaticData final { + SysYLexerStaticData(std::vector ruleNames, + std::vector channelNames, + std::vector modeNames, + std::vector literalNames, + std::vector symbolicNames) + : ruleNames(std::move(ruleNames)), channelNames(std::move(channelNames)), + modeNames(std::move(modeNames)), literalNames(std::move(literalNames)), + symbolicNames(std::move(symbolicNames)), + vocabulary(this->literalNames, this->symbolicNames) {} + + SysYLexerStaticData(const SysYLexerStaticData&) = delete; + SysYLexerStaticData(SysYLexerStaticData&&) = delete; + SysYLexerStaticData& operator=(const SysYLexerStaticData&) = delete; + SysYLexerStaticData& operator=(SysYLexerStaticData&&) = delete; + + std::vector decisionToDFA; + antlr4::atn::PredictionContextCache sharedContextCache; + const std::vector ruleNames; + const std::vector channelNames; + const std::vector modeNames; + const std::vector literalNames; + const std::vector symbolicNames; + const antlr4::dfa::Vocabulary vocabulary; + antlr4::atn::SerializedATNView serializedATN; + std::unique_ptr atn; +}; + +::antlr4::internal::OnceFlag sysylexerLexerOnceFlag; +#if ANTLR4_USE_THREAD_LOCAL_CACHE +static thread_local +#endif +std::unique_ptr sysylexerLexerStaticData = nullptr; + +void sysylexerLexerInitialize() { +#if ANTLR4_USE_THREAD_LOCAL_CACHE + if (sysylexerLexerStaticData != nullptr) { + return; + } +#else + assert(sysylexerLexerStaticData == nullptr); +#endif + auto staticData = std::make_unique( + std::vector{ + "CONST", "INT", "FLOAT", "VOID", "IF", "ELSE", "WHILE", "BREAK", "CONTINUE", + "RETURN", "ADD", "SUB", "MUL", "DIV", "MOD", "EQ", "NE", "LT", "LE", + "GT", "GE", "AND", "OR", "NOT", "ASSIGN", "COMMA", "SEMICOLON", "LPAREN", + "RPAREN", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "DecDigit", "OctDigit", + "HexDigit", "OctPrefix", "HexPrefix", "NonZeroDecDigit", "Sign", "DecFractional", + "Exponent", "DecFloat", "HexFractional", "BinExponent", "HexFloat", + "ESC", "ALPHA", "ALPHANUM", "NONDIGIT", "Ident", "ILITERAL", "FLITERAL", + "STRING", "WS", "LINECOMMENT", "BLOCKCOMMENT" + }, + std::vector{ + "DEFAULT_TOKEN_CHANNEL", "HIDDEN" + }, + std::vector{ + "DEFAULT_MODE" + }, + std::vector{ + "", "'const'", "'int'", "'float'", "'void'", "'if'", "'else'", "'while'", + "'break'", "'continue'", "'return'", "'+'", "'-'", "'*'", "'/'", "'%'", + "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'&&'", "'||'", "'!'", + "'='", "','", "';'", "'('", "')'", "'{'", "'}'", "'['", "']'" + }, + std::vector{ + "", "CONST", "INT", "FLOAT", "VOID", "IF", "ELSE", "WHILE", "BREAK", + "CONTINUE", "RETURN", "ADD", "SUB", "MUL", "DIV", "MOD", "EQ", "NE", + "LT", "LE", "GT", "GE", "AND", "OR", "NOT", "ASSIGN", "COMMA", "SEMICOLON", + "LPAREN", "RPAREN", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "Ident", + "ILITERAL", "FLITERAL", "STRING", "WS", "LINECOMMENT", "BLOCKCOMMENT" + } + ); + static const int32_t serializedATNSegment[] = { + 4,0,40,416,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7, + 6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14, + 7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21, + 7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28, + 7,28,2,29,7,29,2,30,7,30,2,31,7,31,2,32,7,32,2,33,7,33,2,34,7,34,2,35, + 7,35,2,36,7,36,2,37,7,37,2,38,7,38,2,39,7,39,2,40,7,40,2,41,7,41,2,42, + 7,42,2,43,7,43,2,44,7,44,2,45,7,45,2,46,7,46,2,47,7,47,2,48,7,48,2,49, + 7,49,2,50,7,50,2,51,7,51,2,52,7,52,2,53,7,53,2,54,7,54,2,55,7,55,2,56, + 7,56,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2, + 1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1, + 6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9, + 1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,11,1,11,1,12,1,12,1,13,1,13,1,14, + 1,14,1,15,1,15,1,15,1,16,1,16,1,16,1,17,1,17,1,18,1,18,1,18,1,19,1,19, + 1,20,1,20,1,20,1,21,1,21,1,21,1,22,1,22,1,22,1,23,1,23,1,24,1,24,1,25, + 1,25,1,26,1,26,1,27,1,27,1,28,1,28,1,29,1,29,1,30,1,30,1,31,1,31,1,32, + 1,32,1,33,1,33,1,34,1,34,1,35,1,35,1,36,1,36,1,37,1,37,1,37,1,38,1,38, + 1,39,1,39,1,40,5,40,241,8,40,10,40,12,40,244,9,40,1,40,1,40,4,40,248, + 8,40,11,40,12,40,249,1,40,4,40,253,8,40,11,40,12,40,254,1,40,1,40,3,40, + 259,8,40,1,41,1,41,3,41,263,8,41,1,41,4,41,266,8,41,11,41,12,41,267,1, + 42,1,42,3,42,272,8,42,1,42,4,42,275,8,42,11,42,12,42,276,1,42,1,42,3, + 42,281,8,42,1,43,5,43,284,8,43,10,43,12,43,287,9,43,1,43,1,43,4,43,291, + 8,43,11,43,12,43,292,1,43,4,43,296,8,43,11,43,12,43,297,1,43,1,43,3,43, + 302,8,43,1,44,1,44,3,44,306,8,44,1,44,4,44,309,8,44,11,44,12,44,310,1, + 45,1,45,1,45,1,45,1,45,1,45,4,45,319,8,45,11,45,12,45,320,1,45,1,45,3, + 45,325,8,45,1,46,1,46,1,46,1,46,3,46,331,8,46,1,47,1,47,1,48,1,48,1,49, + 1,49,1,50,1,50,1,50,5,50,342,8,50,10,50,12,50,345,9,50,1,51,1,51,5,51, + 349,8,51,10,51,12,51,352,9,51,1,51,1,51,5,51,356,8,51,10,51,12,51,359, + 9,51,1,51,1,51,4,51,363,8,51,11,51,12,51,364,3,51,367,8,51,1,52,1,52, + 3,52,371,8,52,1,53,1,53,1,53,5,53,376,8,53,10,53,12,53,379,9,53,1,53, + 1,53,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,5,55,391,8,55,10,55,12,55, + 394,9,55,1,55,3,55,397,8,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,5, + 56,407,8,56,10,56,12,56,410,9,56,1,56,1,56,1,56,1,56,1,56,3,377,392,408, + 0,57,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13, + 27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,49, + 25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,0,69,0,71,0,73, + 0,75,0,77,0,79,0,81,0,83,0,85,0,87,0,89,0,91,0,93,0,95,0,97,0,99,0,101, + 34,103,35,105,36,107,37,109,38,111,39,113,40,1,0,12,1,0,48,57,1,0,48, + 55,3,0,48,57,65,70,97,102,2,0,88,88,120,120,1,0,49,57,2,0,43,43,45,45, + 2,0,69,69,101,101,2,0,80,80,112,112,2,0,65,90,97,122,3,0,48,57,65,90, + 97,122,3,0,65,90,95,95,97,122,3,0,9,10,13,13,32,32,429,0,1,1,0,0,0,0, + 3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0, + 0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0, + 25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1, + 0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0, + 0,0,47,1,0,0,0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0, + 57,1,0,0,0,0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,101, + 1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1,0,0,0,0,111, + 1,0,0,0,0,113,1,0,0,0,1,115,1,0,0,0,3,121,1,0,0,0,5,125,1,0,0,0,7,131, + 1,0,0,0,9,136,1,0,0,0,11,139,1,0,0,0,13,144,1,0,0,0,15,150,1,0,0,0,17, + 156,1,0,0,0,19,165,1,0,0,0,21,172,1,0,0,0,23,174,1,0,0,0,25,176,1,0,0, + 0,27,178,1,0,0,0,29,180,1,0,0,0,31,182,1,0,0,0,33,185,1,0,0,0,35,188, + 1,0,0,0,37,190,1,0,0,0,39,193,1,0,0,0,41,195,1,0,0,0,43,198,1,0,0,0,45, + 201,1,0,0,0,47,204,1,0,0,0,49,206,1,0,0,0,51,208,1,0,0,0,53,210,1,0,0, + 0,55,212,1,0,0,0,57,214,1,0,0,0,59,216,1,0,0,0,61,218,1,0,0,0,63,220, + 1,0,0,0,65,222,1,0,0,0,67,224,1,0,0,0,69,226,1,0,0,0,71,228,1,0,0,0,73, + 230,1,0,0,0,75,232,1,0,0,0,77,235,1,0,0,0,79,237,1,0,0,0,81,258,1,0,0, + 0,83,260,1,0,0,0,85,280,1,0,0,0,87,301,1,0,0,0,89,303,1,0,0,0,91,324, + 1,0,0,0,93,330,1,0,0,0,95,332,1,0,0,0,97,334,1,0,0,0,99,336,1,0,0,0,101, + 338,1,0,0,0,103,366,1,0,0,0,105,370,1,0,0,0,107,372,1,0,0,0,109,382,1, + 0,0,0,111,386,1,0,0,0,113,402,1,0,0,0,115,116,5,99,0,0,116,117,5,111, + 0,0,117,118,5,110,0,0,118,119,5,115,0,0,119,120,5,116,0,0,120,2,1,0,0, + 0,121,122,5,105,0,0,122,123,5,110,0,0,123,124,5,116,0,0,124,4,1,0,0,0, + 125,126,5,102,0,0,126,127,5,108,0,0,127,128,5,111,0,0,128,129,5,97,0, + 0,129,130,5,116,0,0,130,6,1,0,0,0,131,132,5,118,0,0,132,133,5,111,0,0, + 133,134,5,105,0,0,134,135,5,100,0,0,135,8,1,0,0,0,136,137,5,105,0,0,137, + 138,5,102,0,0,138,10,1,0,0,0,139,140,5,101,0,0,140,141,5,108,0,0,141, + 142,5,115,0,0,142,143,5,101,0,0,143,12,1,0,0,0,144,145,5,119,0,0,145, + 146,5,104,0,0,146,147,5,105,0,0,147,148,5,108,0,0,148,149,5,101,0,0,149, + 14,1,0,0,0,150,151,5,98,0,0,151,152,5,114,0,0,152,153,5,101,0,0,153,154, + 5,97,0,0,154,155,5,107,0,0,155,16,1,0,0,0,156,157,5,99,0,0,157,158,5, + 111,0,0,158,159,5,110,0,0,159,160,5,116,0,0,160,161,5,105,0,0,161,162, + 5,110,0,0,162,163,5,117,0,0,163,164,5,101,0,0,164,18,1,0,0,0,165,166, + 5,114,0,0,166,167,5,101,0,0,167,168,5,116,0,0,168,169,5,117,0,0,169,170, + 5,114,0,0,170,171,5,110,0,0,171,20,1,0,0,0,172,173,5,43,0,0,173,22,1, + 0,0,0,174,175,5,45,0,0,175,24,1,0,0,0,176,177,5,42,0,0,177,26,1,0,0,0, + 178,179,5,47,0,0,179,28,1,0,0,0,180,181,5,37,0,0,181,30,1,0,0,0,182,183, + 5,61,0,0,183,184,5,61,0,0,184,32,1,0,0,0,185,186,5,33,0,0,186,187,5,61, + 0,0,187,34,1,0,0,0,188,189,5,60,0,0,189,36,1,0,0,0,190,191,5,60,0,0,191, + 192,5,61,0,0,192,38,1,0,0,0,193,194,5,62,0,0,194,40,1,0,0,0,195,196,5, + 62,0,0,196,197,5,61,0,0,197,42,1,0,0,0,198,199,5,38,0,0,199,200,5,38, + 0,0,200,44,1,0,0,0,201,202,5,124,0,0,202,203,5,124,0,0,203,46,1,0,0,0, + 204,205,5,33,0,0,205,48,1,0,0,0,206,207,5,61,0,0,207,50,1,0,0,0,208,209, + 5,44,0,0,209,52,1,0,0,0,210,211,5,59,0,0,211,54,1,0,0,0,212,213,5,40, + 0,0,213,56,1,0,0,0,214,215,5,41,0,0,215,58,1,0,0,0,216,217,5,123,0,0, + 217,60,1,0,0,0,218,219,5,125,0,0,219,62,1,0,0,0,220,221,5,91,0,0,221, + 64,1,0,0,0,222,223,5,93,0,0,223,66,1,0,0,0,224,225,7,0,0,0,225,68,1,0, + 0,0,226,227,7,1,0,0,227,70,1,0,0,0,228,229,7,2,0,0,229,72,1,0,0,0,230, + 231,5,48,0,0,231,74,1,0,0,0,232,233,5,48,0,0,233,234,7,3,0,0,234,76,1, + 0,0,0,235,236,7,4,0,0,236,78,1,0,0,0,237,238,7,5,0,0,238,80,1,0,0,0,239, + 241,3,67,33,0,240,239,1,0,0,0,241,244,1,0,0,0,242,240,1,0,0,0,242,243, + 1,0,0,0,243,245,1,0,0,0,244,242,1,0,0,0,245,247,5,46,0,0,246,248,3,67, + 33,0,247,246,1,0,0,0,248,249,1,0,0,0,249,247,1,0,0,0,249,250,1,0,0,0, + 250,259,1,0,0,0,251,253,3,67,33,0,252,251,1,0,0,0,253,254,1,0,0,0,254, + 252,1,0,0,0,254,255,1,0,0,0,255,256,1,0,0,0,256,257,5,46,0,0,257,259, + 1,0,0,0,258,242,1,0,0,0,258,252,1,0,0,0,259,82,1,0,0,0,260,262,7,6,0, + 0,261,263,3,79,39,0,262,261,1,0,0,0,262,263,1,0,0,0,263,265,1,0,0,0,264, + 266,3,67,33,0,265,264,1,0,0,0,266,267,1,0,0,0,267,265,1,0,0,0,267,268, + 1,0,0,0,268,84,1,0,0,0,269,271,3,81,40,0,270,272,3,83,41,0,271,270,1, + 0,0,0,271,272,1,0,0,0,272,281,1,0,0,0,273,275,3,67,33,0,274,273,1,0,0, + 0,275,276,1,0,0,0,276,274,1,0,0,0,276,277,1,0,0,0,277,278,1,0,0,0,278, + 279,3,83,41,0,279,281,1,0,0,0,280,269,1,0,0,0,280,274,1,0,0,0,281,86, + 1,0,0,0,282,284,3,71,35,0,283,282,1,0,0,0,284,287,1,0,0,0,285,283,1,0, + 0,0,285,286,1,0,0,0,286,288,1,0,0,0,287,285,1,0,0,0,288,290,5,46,0,0, + 289,291,3,71,35,0,290,289,1,0,0,0,291,292,1,0,0,0,292,290,1,0,0,0,292, + 293,1,0,0,0,293,302,1,0,0,0,294,296,3,71,35,0,295,294,1,0,0,0,296,297, + 1,0,0,0,297,295,1,0,0,0,297,298,1,0,0,0,298,299,1,0,0,0,299,300,5,46, + 0,0,300,302,1,0,0,0,301,285,1,0,0,0,301,295,1,0,0,0,302,88,1,0,0,0,303, + 305,7,7,0,0,304,306,3,79,39,0,305,304,1,0,0,0,305,306,1,0,0,0,306,308, + 1,0,0,0,307,309,3,67,33,0,308,307,1,0,0,0,309,310,1,0,0,0,310,308,1,0, + 0,0,310,311,1,0,0,0,311,90,1,0,0,0,312,313,3,75,37,0,313,314,3,87,43, + 0,314,315,3,89,44,0,315,325,1,0,0,0,316,318,3,75,37,0,317,319,3,71,35, + 0,318,317,1,0,0,0,319,320,1,0,0,0,320,318,1,0,0,0,320,321,1,0,0,0,321, + 322,1,0,0,0,322,323,3,89,44,0,323,325,1,0,0,0,324,312,1,0,0,0,324,316, + 1,0,0,0,325,92,1,0,0,0,326,327,5,92,0,0,327,331,5,34,0,0,328,329,5,92, + 0,0,329,331,5,92,0,0,330,326,1,0,0,0,330,328,1,0,0,0,331,94,1,0,0,0,332, + 333,7,8,0,0,333,96,1,0,0,0,334,335,7,9,0,0,335,98,1,0,0,0,336,337,7,10, + 0,0,337,100,1,0,0,0,338,343,3,99,49,0,339,342,3,97,48,0,340,342,5,95, + 0,0,341,339,1,0,0,0,341,340,1,0,0,0,342,345,1,0,0,0,343,341,1,0,0,0,343, + 344,1,0,0,0,344,102,1,0,0,0,345,343,1,0,0,0,346,350,3,77,38,0,347,349, + 3,67,33,0,348,347,1,0,0,0,349,352,1,0,0,0,350,348,1,0,0,0,350,351,1,0, + 0,0,351,367,1,0,0,0,352,350,1,0,0,0,353,357,3,73,36,0,354,356,3,69,34, + 0,355,354,1,0,0,0,356,359,1,0,0,0,357,355,1,0,0,0,357,358,1,0,0,0,358, + 367,1,0,0,0,359,357,1,0,0,0,360,362,3,75,37,0,361,363,3,71,35,0,362,361, + 1,0,0,0,363,364,1,0,0,0,364,362,1,0,0,0,364,365,1,0,0,0,365,367,1,0,0, + 0,366,346,1,0,0,0,366,353,1,0,0,0,366,360,1,0,0,0,367,104,1,0,0,0,368, + 371,3,85,42,0,369,371,3,91,45,0,370,368,1,0,0,0,370,369,1,0,0,0,371,106, + 1,0,0,0,372,377,5,34,0,0,373,376,3,93,46,0,374,376,9,0,0,0,375,373,1, + 0,0,0,375,374,1,0,0,0,376,379,1,0,0,0,377,378,1,0,0,0,377,375,1,0,0,0, + 378,380,1,0,0,0,379,377,1,0,0,0,380,381,5,34,0,0,381,108,1,0,0,0,382, + 383,7,11,0,0,383,384,1,0,0,0,384,385,6,54,0,0,385,110,1,0,0,0,386,387, + 5,47,0,0,387,388,5,47,0,0,388,392,1,0,0,0,389,391,9,0,0,0,390,389,1,0, + 0,0,391,394,1,0,0,0,392,393,1,0,0,0,392,390,1,0,0,0,393,396,1,0,0,0,394, + 392,1,0,0,0,395,397,5,13,0,0,396,395,1,0,0,0,396,397,1,0,0,0,397,398, + 1,0,0,0,398,399,5,10,0,0,399,400,1,0,0,0,400,401,6,55,0,0,401,112,1,0, + 0,0,402,403,5,47,0,0,403,404,5,42,0,0,404,408,1,0,0,0,405,407,9,0,0,0, + 406,405,1,0,0,0,407,410,1,0,0,0,408,409,1,0,0,0,408,406,1,0,0,0,409,411, + 1,0,0,0,410,408,1,0,0,0,411,412,5,42,0,0,412,413,5,47,0,0,413,414,1,0, + 0,0,414,415,6,56,0,0,415,114,1,0,0,0,31,0,242,249,254,258,262,267,271, + 276,280,285,292,297,301,305,310,320,324,330,341,343,350,357,364,366,370, + 375,377,392,396,408,1,6,0,0 + }; + staticData->serializedATN = antlr4::atn::SerializedATNView(serializedATNSegment, sizeof(serializedATNSegment) / sizeof(serializedATNSegment[0])); + + antlr4::atn::ATNDeserializer deserializer; + staticData->atn = deserializer.deserialize(staticData->serializedATN); + + const size_t count = staticData->atn->getNumberOfDecisions(); + staticData->decisionToDFA.reserve(count); + for (size_t i = 0; i < count; i++) { + staticData->decisionToDFA.emplace_back(staticData->atn->getDecisionState(i), i); + } + sysylexerLexerStaticData = std::move(staticData); +} + +} + +SysYLexer::SysYLexer(CharStream *input) : Lexer(input) { + SysYLexer::initialize(); + _interpreter = new atn::LexerATNSimulator(this, *sysylexerLexerStaticData->atn, sysylexerLexerStaticData->decisionToDFA, sysylexerLexerStaticData->sharedContextCache); +} + +SysYLexer::~SysYLexer() { + delete _interpreter; +} + +std::string SysYLexer::getGrammarFileName() const { + return "SysY.g4"; +} + +const std::vector& SysYLexer::getRuleNames() const { + return sysylexerLexerStaticData->ruleNames; +} + +const std::vector& SysYLexer::getChannelNames() const { + return sysylexerLexerStaticData->channelNames; +} + +const std::vector& SysYLexer::getModeNames() const { + return sysylexerLexerStaticData->modeNames; +} + +const dfa::Vocabulary& SysYLexer::getVocabulary() const { + return sysylexerLexerStaticData->vocabulary; +} + +antlr4::atn::SerializedATNView SysYLexer::getSerializedATN() const { + return sysylexerLexerStaticData->serializedATN; +} + +const atn::ATN& SysYLexer::getATN() const { + return *sysylexerLexerStaticData->atn; +} + + + + +void SysYLexer::initialize() { +#if ANTLR4_USE_THREAD_LOCAL_CACHE + sysylexerLexerInitialize(); +#else + ::antlr4::internal::call_once(sysylexerLexerOnceFlag, sysylexerLexerInitialize); +#endif +} diff --git a/src/SysYLexer.interp b/src/SysYLexer.interp new file mode 100644 index 0000000..3b3b457 --- /dev/null +++ b/src/SysYLexer.interp @@ -0,0 +1,154 @@ +token literal names: +null +'const' +'int' +'float' +'void' +'if' +'else' +'while' +'break' +'continue' +'return' +'+' +'-' +'*' +'/' +'%' +'==' +'!=' +'<' +'<=' +'>' +'>=' +'&&' +'||' +'!' +'=' +',' +';' +'(' +')' +'{' +'}' +'[' +']' +null +null +null +null +null +null +null + +token symbolic names: +null +CONST +INT +FLOAT +VOID +IF +ELSE +WHILE +BREAK +CONTINUE +RETURN +ADD +SUB +MUL +DIV +MOD +EQ +NE +LT +LE +GT +GE +AND +OR +NOT +ASSIGN +COMMA +SEMICOLON +LPAREN +RPAREN +LBRACE +RBRACE +LBRACK +RBRACK +Ident +ILITERAL +FLITERAL +STRING +WS +LINECOMMENT +BLOCKCOMMENT + +rule names: +CONST +INT +FLOAT +VOID +IF +ELSE +WHILE +BREAK +CONTINUE +RETURN +ADD +SUB +MUL +DIV +MOD +EQ +NE +LT +LE +GT +GE +AND +OR +NOT +ASSIGN +COMMA +SEMICOLON +LPAREN +RPAREN +LBRACE +RBRACE +LBRACK +RBRACK +DecDigit +OctDigit +HexDigit +OctPrefix +HexPrefix +NonZeroDecDigit +Sign +DecFractional +Exponent +DecFloat +HexFractional +BinExponent +HexFloat +ESC +ALPHA +ALPHANUM +NONDIGIT +Ident +ILITERAL +FLITERAL +STRING +WS +LINECOMMENT +BLOCKCOMMENT + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE + +atn: +[4, 0, 40, 416, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 5, 40, 241, 8, 40, 10, 40, 12, 40, 244, 9, 40, 1, 40, 1, 40, 4, 40, 248, 8, 40, 11, 40, 12, 40, 249, 1, 40, 4, 40, 253, 8, 40, 11, 40, 12, 40, 254, 1, 40, 1, 40, 3, 40, 259, 8, 40, 1, 41, 1, 41, 3, 41, 263, 8, 41, 1, 41, 4, 41, 266, 8, 41, 11, 41, 12, 41, 267, 1, 42, 1, 42, 3, 42, 272, 8, 42, 1, 42, 4, 42, 275, 8, 42, 11, 42, 12, 42, 276, 1, 42, 1, 42, 3, 42, 281, 8, 42, 1, 43, 5, 43, 284, 8, 43, 10, 43, 12, 43, 287, 9, 43, 1, 43, 1, 43, 4, 43, 291, 8, 43, 11, 43, 12, 43, 292, 1, 43, 4, 43, 296, 8, 43, 11, 43, 12, 43, 297, 1, 43, 1, 43, 3, 43, 302, 8, 43, 1, 44, 1, 44, 3, 44, 306, 8, 44, 1, 44, 4, 44, 309, 8, 44, 11, 44, 12, 44, 310, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 4, 45, 319, 8, 45, 11, 45, 12, 45, 320, 1, 45, 1, 45, 3, 45, 325, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 331, 8, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 5, 50, 342, 8, 50, 10, 50, 12, 50, 345, 9, 50, 1, 51, 1, 51, 5, 51, 349, 8, 51, 10, 51, 12, 51, 352, 9, 51, 1, 51, 1, 51, 5, 51, 356, 8, 51, 10, 51, 12, 51, 359, 9, 51, 1, 51, 1, 51, 4, 51, 363, 8, 51, 11, 51, 12, 51, 364, 3, 51, 367, 8, 51, 1, 52, 1, 52, 3, 52, 371, 8, 52, 1, 53, 1, 53, 1, 53, 5, 53, 376, 8, 53, 10, 53, 12, 53, 379, 9, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 391, 8, 55, 10, 55, 12, 55, 394, 9, 55, 1, 55, 3, 55, 397, 8, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 407, 8, 56, 10, 56, 12, 56, 410, 9, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 3, 377, 392, 408, 0, 57, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 0, 69, 0, 71, 0, 73, 0, 75, 0, 77, 0, 79, 0, 81, 0, 83, 0, 85, 0, 87, 0, 89, 0, 91, 0, 93, 0, 95, 0, 97, 0, 99, 0, 101, 34, 103, 35, 105, 36, 107, 37, 109, 38, 111, 39, 113, 40, 1, 0, 12, 1, 0, 48, 57, 1, 0, 48, 55, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 88, 88, 120, 120, 1, 0, 49, 57, 2, 0, 43, 43, 45, 45, 2, 0, 69, 69, 101, 101, 2, 0, 80, 80, 112, 112, 2, 0, 65, 90, 97, 122, 3, 0, 48, 57, 65, 90, 97, 122, 3, 0, 65, 90, 95, 95, 97, 122, 3, 0, 9, 10, 13, 13, 32, 32, 429, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 1, 115, 1, 0, 0, 0, 3, 121, 1, 0, 0, 0, 5, 125, 1, 0, 0, 0, 7, 131, 1, 0, 0, 0, 9, 136, 1, 0, 0, 0, 11, 139, 1, 0, 0, 0, 13, 144, 1, 0, 0, 0, 15, 150, 1, 0, 0, 0, 17, 156, 1, 0, 0, 0, 19, 165, 1, 0, 0, 0, 21, 172, 1, 0, 0, 0, 23, 174, 1, 0, 0, 0, 25, 176, 1, 0, 0, 0, 27, 178, 1, 0, 0, 0, 29, 180, 1, 0, 0, 0, 31, 182, 1, 0, 0, 0, 33, 185, 1, 0, 0, 0, 35, 188, 1, 0, 0, 0, 37, 190, 1, 0, 0, 0, 39, 193, 1, 0, 0, 0, 41, 195, 1, 0, 0, 0, 43, 198, 1, 0, 0, 0, 45, 201, 1, 0, 0, 0, 47, 204, 1, 0, 0, 0, 49, 206, 1, 0, 0, 0, 51, 208, 1, 0, 0, 0, 53, 210, 1, 0, 0, 0, 55, 212, 1, 0, 0, 0, 57, 214, 1, 0, 0, 0, 59, 216, 1, 0, 0, 0, 61, 218, 1, 0, 0, 0, 63, 220, 1, 0, 0, 0, 65, 222, 1, 0, 0, 0, 67, 224, 1, 0, 0, 0, 69, 226, 1, 0, 0, 0, 71, 228, 1, 0, 0, 0, 73, 230, 1, 0, 0, 0, 75, 232, 1, 0, 0, 0, 77, 235, 1, 0, 0, 0, 79, 237, 1, 0, 0, 0, 81, 258, 1, 0, 0, 0, 83, 260, 1, 0, 0, 0, 85, 280, 1, 0, 0, 0, 87, 301, 1, 0, 0, 0, 89, 303, 1, 0, 0, 0, 91, 324, 1, 0, 0, 0, 93, 330, 1, 0, 0, 0, 95, 332, 1, 0, 0, 0, 97, 334, 1, 0, 0, 0, 99, 336, 1, 0, 0, 0, 101, 338, 1, 0, 0, 0, 103, 366, 1, 0, 0, 0, 105, 370, 1, 0, 0, 0, 107, 372, 1, 0, 0, 0, 109, 382, 1, 0, 0, 0, 111, 386, 1, 0, 0, 0, 113, 402, 1, 0, 0, 0, 115, 116, 5, 99, 0, 0, 116, 117, 5, 111, 0, 0, 117, 118, 5, 110, 0, 0, 118, 119, 5, 115, 0, 0, 119, 120, 5, 116, 0, 0, 120, 2, 1, 0, 0, 0, 121, 122, 5, 105, 0, 0, 122, 123, 5, 110, 0, 0, 123, 124, 5, 116, 0, 0, 124, 4, 1, 0, 0, 0, 125, 126, 5, 102, 0, 0, 126, 127, 5, 108, 0, 0, 127, 128, 5, 111, 0, 0, 128, 129, 5, 97, 0, 0, 129, 130, 5, 116, 0, 0, 130, 6, 1, 0, 0, 0, 131, 132, 5, 118, 0, 0, 132, 133, 5, 111, 0, 0, 133, 134, 5, 105, 0, 0, 134, 135, 5, 100, 0, 0, 135, 8, 1, 0, 0, 0, 136, 137, 5, 105, 0, 0, 137, 138, 5, 102, 0, 0, 138, 10, 1, 0, 0, 0, 139, 140, 5, 101, 0, 0, 140, 141, 5, 108, 0, 0, 141, 142, 5, 115, 0, 0, 142, 143, 5, 101, 0, 0, 143, 12, 1, 0, 0, 0, 144, 145, 5, 119, 0, 0, 145, 146, 5, 104, 0, 0, 146, 147, 5, 105, 0, 0, 147, 148, 5, 108, 0, 0, 148, 149, 5, 101, 0, 0, 149, 14, 1, 0, 0, 0, 150, 151, 5, 98, 0, 0, 151, 152, 5, 114, 0, 0, 152, 153, 5, 101, 0, 0, 153, 154, 5, 97, 0, 0, 154, 155, 5, 107, 0, 0, 155, 16, 1, 0, 0, 0, 156, 157, 5, 99, 0, 0, 157, 158, 5, 111, 0, 0, 158, 159, 5, 110, 0, 0, 159, 160, 5, 116, 0, 0, 160, 161, 5, 105, 0, 0, 161, 162, 5, 110, 0, 0, 162, 163, 5, 117, 0, 0, 163, 164, 5, 101, 0, 0, 164, 18, 1, 0, 0, 0, 165, 166, 5, 114, 0, 0, 166, 167, 5, 101, 0, 0, 167, 168, 5, 116, 0, 0, 168, 169, 5, 117, 0, 0, 169, 170, 5, 114, 0, 0, 170, 171, 5, 110, 0, 0, 171, 20, 1, 0, 0, 0, 172, 173, 5, 43, 0, 0, 173, 22, 1, 0, 0, 0, 174, 175, 5, 45, 0, 0, 175, 24, 1, 0, 0, 0, 176, 177, 5, 42, 0, 0, 177, 26, 1, 0, 0, 0, 178, 179, 5, 47, 0, 0, 179, 28, 1, 0, 0, 0, 180, 181, 5, 37, 0, 0, 181, 30, 1, 0, 0, 0, 182, 183, 5, 61, 0, 0, 183, 184, 5, 61, 0, 0, 184, 32, 1, 0, 0, 0, 185, 186, 5, 33, 0, 0, 186, 187, 5, 61, 0, 0, 187, 34, 1, 0, 0, 0, 188, 189, 5, 60, 0, 0, 189, 36, 1, 0, 0, 0, 190, 191, 5, 60, 0, 0, 191, 192, 5, 61, 0, 0, 192, 38, 1, 0, 0, 0, 193, 194, 5, 62, 0, 0, 194, 40, 1, 0, 0, 0, 195, 196, 5, 62, 0, 0, 196, 197, 5, 61, 0, 0, 197, 42, 1, 0, 0, 0, 198, 199, 5, 38, 0, 0, 199, 200, 5, 38, 0, 0, 200, 44, 1, 0, 0, 0, 201, 202, 5, 124, 0, 0, 202, 203, 5, 124, 0, 0, 203, 46, 1, 0, 0, 0, 204, 205, 5, 33, 0, 0, 205, 48, 1, 0, 0, 0, 206, 207, 5, 61, 0, 0, 207, 50, 1, 0, 0, 0, 208, 209, 5, 44, 0, 0, 209, 52, 1, 0, 0, 0, 210, 211, 5, 59, 0, 0, 211, 54, 1, 0, 0, 0, 212, 213, 5, 40, 0, 0, 213, 56, 1, 0, 0, 0, 214, 215, 5, 41, 0, 0, 215, 58, 1, 0, 0, 0, 216, 217, 5, 123, 0, 0, 217, 60, 1, 0, 0, 0, 218, 219, 5, 125, 0, 0, 219, 62, 1, 0, 0, 0, 220, 221, 5, 91, 0, 0, 221, 64, 1, 0, 0, 0, 222, 223, 5, 93, 0, 0, 223, 66, 1, 0, 0, 0, 224, 225, 7, 0, 0, 0, 225, 68, 1, 0, 0, 0, 226, 227, 7, 1, 0, 0, 227, 70, 1, 0, 0, 0, 228, 229, 7, 2, 0, 0, 229, 72, 1, 0, 0, 0, 230, 231, 5, 48, 0, 0, 231, 74, 1, 0, 0, 0, 232, 233, 5, 48, 0, 0, 233, 234, 7, 3, 0, 0, 234, 76, 1, 0, 0, 0, 235, 236, 7, 4, 0, 0, 236, 78, 1, 0, 0, 0, 237, 238, 7, 5, 0, 0, 238, 80, 1, 0, 0, 0, 239, 241, 3, 67, 33, 0, 240, 239, 1, 0, 0, 0, 241, 244, 1, 0, 0, 0, 242, 240, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 245, 1, 0, 0, 0, 244, 242, 1, 0, 0, 0, 245, 247, 5, 46, 0, 0, 246, 248, 3, 67, 33, 0, 247, 246, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 247, 1, 0, 0, 0, 249, 250, 1, 0, 0, 0, 250, 259, 1, 0, 0, 0, 251, 253, 3, 67, 33, 0, 252, 251, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 252, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 257, 5, 46, 0, 0, 257, 259, 1, 0, 0, 0, 258, 242, 1, 0, 0, 0, 258, 252, 1, 0, 0, 0, 259, 82, 1, 0, 0, 0, 260, 262, 7, 6, 0, 0, 261, 263, 3, 79, 39, 0, 262, 261, 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, 263, 265, 1, 0, 0, 0, 264, 266, 3, 67, 33, 0, 265, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 84, 1, 0, 0, 0, 269, 271, 3, 81, 40, 0, 270, 272, 3, 83, 41, 0, 271, 270, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 281, 1, 0, 0, 0, 273, 275, 3, 67, 33, 0, 274, 273, 1, 0, 0, 0, 275, 276, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 279, 3, 83, 41, 0, 279, 281, 1, 0, 0, 0, 280, 269, 1, 0, 0, 0, 280, 274, 1, 0, 0, 0, 281, 86, 1, 0, 0, 0, 282, 284, 3, 71, 35, 0, 283, 282, 1, 0, 0, 0, 284, 287, 1, 0, 0, 0, 285, 283, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 288, 1, 0, 0, 0, 287, 285, 1, 0, 0, 0, 288, 290, 5, 46, 0, 0, 289, 291, 3, 71, 35, 0, 290, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 290, 1, 0, 0, 0, 292, 293, 1, 0, 0, 0, 293, 302, 1, 0, 0, 0, 294, 296, 3, 71, 35, 0, 295, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 299, 1, 0, 0, 0, 299, 300, 5, 46, 0, 0, 300, 302, 1, 0, 0, 0, 301, 285, 1, 0, 0, 0, 301, 295, 1, 0, 0, 0, 302, 88, 1, 0, 0, 0, 303, 305, 7, 7, 0, 0, 304, 306, 3, 79, 39, 0, 305, 304, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 308, 1, 0, 0, 0, 307, 309, 3, 67, 33, 0, 308, 307, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, 90, 1, 0, 0, 0, 312, 313, 3, 75, 37, 0, 313, 314, 3, 87, 43, 0, 314, 315, 3, 89, 44, 0, 315, 325, 1, 0, 0, 0, 316, 318, 3, 75, 37, 0, 317, 319, 3, 71, 35, 0, 318, 317, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 318, 1, 0, 0, 0, 320, 321, 1, 0, 0, 0, 321, 322, 1, 0, 0, 0, 322, 323, 3, 89, 44, 0, 323, 325, 1, 0, 0, 0, 324, 312, 1, 0, 0, 0, 324, 316, 1, 0, 0, 0, 325, 92, 1, 0, 0, 0, 326, 327, 5, 92, 0, 0, 327, 331, 5, 34, 0, 0, 328, 329, 5, 92, 0, 0, 329, 331, 5, 92, 0, 0, 330, 326, 1, 0, 0, 0, 330, 328, 1, 0, 0, 0, 331, 94, 1, 0, 0, 0, 332, 333, 7, 8, 0, 0, 333, 96, 1, 0, 0, 0, 334, 335, 7, 9, 0, 0, 335, 98, 1, 0, 0, 0, 336, 337, 7, 10, 0, 0, 337, 100, 1, 0, 0, 0, 338, 343, 3, 99, 49, 0, 339, 342, 3, 97, 48, 0, 340, 342, 5, 95, 0, 0, 341, 339, 1, 0, 0, 0, 341, 340, 1, 0, 0, 0, 342, 345, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 102, 1, 0, 0, 0, 345, 343, 1, 0, 0, 0, 346, 350, 3, 77, 38, 0, 347, 349, 3, 67, 33, 0, 348, 347, 1, 0, 0, 0, 349, 352, 1, 0, 0, 0, 350, 348, 1, 0, 0, 0, 350, 351, 1, 0, 0, 0, 351, 367, 1, 0, 0, 0, 352, 350, 1, 0, 0, 0, 353, 357, 3, 73, 36, 0, 354, 356, 3, 69, 34, 0, 355, 354, 1, 0, 0, 0, 356, 359, 1, 0, 0, 0, 357, 355, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 367, 1, 0, 0, 0, 359, 357, 1, 0, 0, 0, 360, 362, 3, 75, 37, 0, 361, 363, 3, 71, 35, 0, 362, 361, 1, 0, 0, 0, 363, 364, 1, 0, 0, 0, 364, 362, 1, 0, 0, 0, 364, 365, 1, 0, 0, 0, 365, 367, 1, 0, 0, 0, 366, 346, 1, 0, 0, 0, 366, 353, 1, 0, 0, 0, 366, 360, 1, 0, 0, 0, 367, 104, 1, 0, 0, 0, 368, 371, 3, 85, 42, 0, 369, 371, 3, 91, 45, 0, 370, 368, 1, 0, 0, 0, 370, 369, 1, 0, 0, 0, 371, 106, 1, 0, 0, 0, 372, 377, 5, 34, 0, 0, 373, 376, 3, 93, 46, 0, 374, 376, 9, 0, 0, 0, 375, 373, 1, 0, 0, 0, 375, 374, 1, 0, 0, 0, 376, 379, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 377, 375, 1, 0, 0, 0, 378, 380, 1, 0, 0, 0, 379, 377, 1, 0, 0, 0, 380, 381, 5, 34, 0, 0, 381, 108, 1, 0, 0, 0, 382, 383, 7, 11, 0, 0, 383, 384, 1, 0, 0, 0, 384, 385, 6, 54, 0, 0, 385, 110, 1, 0, 0, 0, 386, 387, 5, 47, 0, 0, 387, 388, 5, 47, 0, 0, 388, 392, 1, 0, 0, 0, 389, 391, 9, 0, 0, 0, 390, 389, 1, 0, 0, 0, 391, 394, 1, 0, 0, 0, 392, 393, 1, 0, 0, 0, 392, 390, 1, 0, 0, 0, 393, 396, 1, 0, 0, 0, 394, 392, 1, 0, 0, 0, 395, 397, 5, 13, 0, 0, 396, 395, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 399, 5, 10, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 6, 55, 0, 0, 401, 112, 1, 0, 0, 0, 402, 403, 5, 47, 0, 0, 403, 404, 5, 42, 0, 0, 404, 408, 1, 0, 0, 0, 405, 407, 9, 0, 0, 0, 406, 405, 1, 0, 0, 0, 407, 410, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 408, 406, 1, 0, 0, 0, 409, 411, 1, 0, 0, 0, 410, 408, 1, 0, 0, 0, 411, 412, 5, 42, 0, 0, 412, 413, 5, 47, 0, 0, 413, 414, 1, 0, 0, 0, 414, 415, 6, 56, 0, 0, 415, 114, 1, 0, 0, 0, 31, 0, 242, 249, 254, 258, 262, 267, 271, 276, 280, 285, 292, 297, 301, 305, 310, 320, 324, 330, 341, 343, 350, 357, 364, 366, 370, 375, 377, 392, 396, 408, 1, 6, 0, 0] \ No newline at end of file diff --git a/src/SysYLexer.tokens b/src/SysYLexer.tokens new file mode 100644 index 0000000..4345538 --- /dev/null +++ b/src/SysYLexer.tokens @@ -0,0 +1,73 @@ +CONST=1 +INT=2 +FLOAT=3 +VOID=4 +IF=5 +ELSE=6 +WHILE=7 +BREAK=8 +CONTINUE=9 +RETURN=10 +ADD=11 +SUB=12 +MUL=13 +DIV=14 +MOD=15 +EQ=16 +NE=17 +LT=18 +LE=19 +GT=20 +GE=21 +AND=22 +OR=23 +NOT=24 +ASSIGN=25 +COMMA=26 +SEMICOLON=27 +LPAREN=28 +RPAREN=29 +LBRACE=30 +RBRACE=31 +LBRACK=32 +RBRACK=33 +Ident=34 +ILITERAL=35 +FLITERAL=36 +STRING=37 +WS=38 +LINECOMMENT=39 +BLOCKCOMMENT=40 +'const'=1 +'int'=2 +'float'=3 +'void'=4 +'if'=5 +'else'=6 +'while'=7 +'break'=8 +'continue'=9 +'return'=10 +'+'=11 +'-'=12 +'*'=13 +'/'=14 +'%'=15 +'=='=16 +'!='=17 +'<'=18 +'<='=19 +'>'=20 +'>='=21 +'&&'=22 +'||'=23 +'!'=24 +'='=25 +','=26 +';'=27 +'('=28 +')'=29 +'{'=30 +'}'=31 +'['=32 +']'=33 diff --git a/src/SysYParser.cpp b/src/SysYParser.cpp new file mode 100644 index 0000000..937cbd6 --- /dev/null +++ b/src/SysYParser.cpp @@ -0,0 +1,3401 @@ + +// Generated from SysY.g4 by ANTLR 4.13.2 + + +#include "SysYVisitor.h" + +#include "SysYParser.h" + + +using namespace antlrcpp; + +using namespace antlr4; + +namespace { + +struct SysYParserStaticData final { + SysYParserStaticData(std::vector ruleNames, + std::vector literalNames, + std::vector symbolicNames) + : ruleNames(std::move(ruleNames)), literalNames(std::move(literalNames)), + symbolicNames(std::move(symbolicNames)), + vocabulary(this->literalNames, this->symbolicNames) {} + + SysYParserStaticData(const SysYParserStaticData&) = delete; + SysYParserStaticData(SysYParserStaticData&&) = delete; + SysYParserStaticData& operator=(const SysYParserStaticData&) = delete; + SysYParserStaticData& operator=(SysYParserStaticData&&) = delete; + + std::vector decisionToDFA; + antlr4::atn::PredictionContextCache sharedContextCache; + const std::vector ruleNames; + const std::vector literalNames; + const std::vector symbolicNames; + const antlr4::dfa::Vocabulary vocabulary; + antlr4::atn::SerializedATNView serializedATN; + std::unique_ptr atn; +}; + +::antlr4::internal::OnceFlag sysyParserOnceFlag; +#if ANTLR4_USE_THREAD_LOCAL_CACHE +static thread_local +#endif +std::unique_ptr sysyParserStaticData = nullptr; + +void sysyParserInitialize() { +#if ANTLR4_USE_THREAD_LOCAL_CACHE + if (sysyParserStaticData != nullptr) { + return; + } +#else + assert(sysyParserStaticData == nullptr); +#endif + auto staticData = std::make_unique( + std::vector{ + "compUnit", "globalDecl", "decl", "constDecl", "bType", "constDef", + "constInitVal", "varDecl", "varDef", "initVal", "funcType", "funcDef", + "funcFParams", "funcFParam", "blockStmt", "blockItem", "stmt", "exp", + "cond", "lValue", "primaryExp", "number", "call", "unaryExp", "unaryOp", + "funcRParams", "string", "mulExp", "addExp", "relExp", "eqExp", "lAndExp", + "lOrExp", "constExp" + }, + std::vector{ + "", "'const'", "'int'", "'float'", "'void'", "'if'", "'else'", "'while'", + "'break'", "'continue'", "'return'", "'+'", "'-'", "'*'", "'/'", "'%'", + "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'&&'", "'||'", "'!'", + "'='", "','", "';'", "'('", "')'", "'{'", "'}'", "'['", "']'" + }, + std::vector{ + "", "CONST", "INT", "FLOAT", "VOID", "IF", "ELSE", "WHILE", "BREAK", + "CONTINUE", "RETURN", "ADD", "SUB", "MUL", "DIV", "MOD", "EQ", "NE", + "LT", "LE", "GT", "GE", "AND", "OR", "NOT", "ASSIGN", "COMMA", "SEMICOLON", + "LPAREN", "RPAREN", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "Ident", + "ILITERAL", "FLITERAL", "STRING", "WS", "LINECOMMENT", "BLOCKCOMMENT" + } + ); + static const int32_t serializedATNSegment[] = { + 4,1,40,359,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2, + 7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7, + 14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7, + 21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28,7, + 28,2,29,7,29,2,30,7,30,2,31,7,31,2,32,7,32,2,33,7,33,1,0,1,0,4,0,71,8, + 0,11,0,12,0,72,1,1,1,1,3,1,77,8,1,1,2,1,2,3,2,81,8,2,1,3,1,3,1,3,1,3, + 1,3,5,3,88,8,3,10,3,12,3,91,9,3,1,3,1,3,1,4,1,4,1,5,1,5,1,5,1,5,1,5,5, + 5,102,8,5,10,5,12,5,105,9,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,5,6,115,8, + 6,10,6,12,6,118,9,6,3,6,120,8,6,1,6,3,6,123,8,6,1,7,1,7,1,7,1,7,5,7,129, + 8,7,10,7,12,7,132,9,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,5,8,141,8,8,10,8,12, + 8,144,9,8,1,8,1,8,1,8,1,8,1,8,5,8,151,8,8,10,8,12,8,154,9,8,1,8,1,8,3, + 8,158,8,8,1,9,1,9,1,9,1,9,1,9,5,9,165,8,9,10,9,12,9,168,9,9,3,9,170,8, + 9,1,9,3,9,173,8,9,1,10,1,10,1,11,1,11,1,11,1,11,3,11,181,8,11,1,11,1, + 11,1,11,1,12,1,12,1,12,5,12,189,8,12,10,12,12,12,192,9,12,1,13,1,13,1, + 13,1,13,1,13,1,13,1,13,1,13,5,13,202,8,13,10,13,12,13,205,9,13,3,13,207, + 8,13,1,14,1,14,5,14,211,8,14,10,14,12,14,214,9,14,1,14,1,14,1,15,1,15, + 3,15,220,8,15,1,16,1,16,1,16,1,16,1,16,1,16,3,16,228,8,16,1,16,1,16,1, + 16,1,16,1,16,1,16,1,16,1,16,1,16,3,16,239,8,16,1,16,1,16,1,16,1,16,1, + 16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,3,16,253,8,16,1,16,3,16,256,8,16, + 1,17,1,17,1,18,1,18,1,19,1,19,1,19,1,19,1,19,5,19,267,8,19,10,19,12,19, + 270,9,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,3,20,279,8,20,1,21,1,21,1, + 22,1,22,1,22,3,22,286,8,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23,3,23,295, + 8,23,1,24,1,24,1,25,1,25,1,25,5,25,302,8,25,10,25,12,25,305,9,25,1,26, + 1,26,1,27,1,27,1,27,5,27,312,8,27,10,27,12,27,315,9,27,1,28,1,28,1,28, + 5,28,320,8,28,10,28,12,28,323,9,28,1,29,1,29,1,29,5,29,328,8,29,10,29, + 12,29,331,9,29,1,30,1,30,1,30,5,30,336,8,30,10,30,12,30,339,9,30,1,31, + 1,31,1,31,5,31,344,8,31,10,31,12,31,347,9,31,1,32,1,32,1,32,5,32,352, + 8,32,10,32,12,32,355,9,32,1,33,1,33,1,33,0,0,34,0,2,4,6,8,10,12,14,16, + 18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62, + 64,66,0,8,1,0,2,3,1,0,2,4,1,0,35,36,2,0,11,12,24,24,1,0,13,15,1,0,11, + 12,1,0,18,21,1,0,16,17,370,0,70,1,0,0,0,2,76,1,0,0,0,4,80,1,0,0,0,6,82, + 1,0,0,0,8,94,1,0,0,0,10,96,1,0,0,0,12,122,1,0,0,0,14,124,1,0,0,0,16,157, + 1,0,0,0,18,172,1,0,0,0,20,174,1,0,0,0,22,176,1,0,0,0,24,185,1,0,0,0,26, + 193,1,0,0,0,28,208,1,0,0,0,30,219,1,0,0,0,32,255,1,0,0,0,34,257,1,0,0, + 0,36,259,1,0,0,0,38,261,1,0,0,0,40,278,1,0,0,0,42,280,1,0,0,0,44,282, + 1,0,0,0,46,294,1,0,0,0,48,296,1,0,0,0,50,298,1,0,0,0,52,306,1,0,0,0,54, + 308,1,0,0,0,56,316,1,0,0,0,58,324,1,0,0,0,60,332,1,0,0,0,62,340,1,0,0, + 0,64,348,1,0,0,0,66,356,1,0,0,0,68,71,3,2,1,0,69,71,3,22,11,0,70,68,1, + 0,0,0,70,69,1,0,0,0,71,72,1,0,0,0,72,70,1,0,0,0,72,73,1,0,0,0,73,1,1, + 0,0,0,74,77,3,6,3,0,75,77,3,14,7,0,76,74,1,0,0,0,76,75,1,0,0,0,77,3,1, + 0,0,0,78,81,3,6,3,0,79,81,3,14,7,0,80,78,1,0,0,0,80,79,1,0,0,0,81,5,1, + 0,0,0,82,83,5,1,0,0,83,84,3,8,4,0,84,89,3,10,5,0,85,86,5,26,0,0,86,88, + 3,10,5,0,87,85,1,0,0,0,88,91,1,0,0,0,89,87,1,0,0,0,89,90,1,0,0,0,90,92, + 1,0,0,0,91,89,1,0,0,0,92,93,5,27,0,0,93,7,1,0,0,0,94,95,7,0,0,0,95,9, + 1,0,0,0,96,103,5,34,0,0,97,98,5,32,0,0,98,99,3,66,33,0,99,100,5,33,0, + 0,100,102,1,0,0,0,101,97,1,0,0,0,102,105,1,0,0,0,103,101,1,0,0,0,103, + 104,1,0,0,0,104,106,1,0,0,0,105,103,1,0,0,0,106,107,5,25,0,0,107,108, + 3,12,6,0,108,11,1,0,0,0,109,123,3,66,33,0,110,119,5,30,0,0,111,116,3, + 12,6,0,112,113,5,26,0,0,113,115,3,12,6,0,114,112,1,0,0,0,115,118,1,0, + 0,0,116,114,1,0,0,0,116,117,1,0,0,0,117,120,1,0,0,0,118,116,1,0,0,0,119, + 111,1,0,0,0,119,120,1,0,0,0,120,121,1,0,0,0,121,123,5,31,0,0,122,109, + 1,0,0,0,122,110,1,0,0,0,123,13,1,0,0,0,124,125,3,8,4,0,125,130,3,16,8, + 0,126,127,5,26,0,0,127,129,3,16,8,0,128,126,1,0,0,0,129,132,1,0,0,0,130, + 128,1,0,0,0,130,131,1,0,0,0,131,133,1,0,0,0,132,130,1,0,0,0,133,134,5, + 27,0,0,134,15,1,0,0,0,135,142,5,34,0,0,136,137,5,32,0,0,137,138,3,66, + 33,0,138,139,5,33,0,0,139,141,1,0,0,0,140,136,1,0,0,0,141,144,1,0,0,0, + 142,140,1,0,0,0,142,143,1,0,0,0,143,158,1,0,0,0,144,142,1,0,0,0,145,152, + 5,34,0,0,146,147,5,32,0,0,147,148,3,66,33,0,148,149,5,33,0,0,149,151, + 1,0,0,0,150,146,1,0,0,0,151,154,1,0,0,0,152,150,1,0,0,0,152,153,1,0,0, + 0,153,155,1,0,0,0,154,152,1,0,0,0,155,156,5,25,0,0,156,158,3,18,9,0,157, + 135,1,0,0,0,157,145,1,0,0,0,158,17,1,0,0,0,159,173,3,34,17,0,160,169, + 5,30,0,0,161,166,3,18,9,0,162,163,5,26,0,0,163,165,3,18,9,0,164,162,1, + 0,0,0,165,168,1,0,0,0,166,164,1,0,0,0,166,167,1,0,0,0,167,170,1,0,0,0, + 168,166,1,0,0,0,169,161,1,0,0,0,169,170,1,0,0,0,170,171,1,0,0,0,171,173, + 5,31,0,0,172,159,1,0,0,0,172,160,1,0,0,0,173,19,1,0,0,0,174,175,7,1,0, + 0,175,21,1,0,0,0,176,177,3,20,10,0,177,178,5,34,0,0,178,180,5,28,0,0, + 179,181,3,24,12,0,180,179,1,0,0,0,180,181,1,0,0,0,181,182,1,0,0,0,182, + 183,5,29,0,0,183,184,3,28,14,0,184,23,1,0,0,0,185,190,3,26,13,0,186,187, + 5,26,0,0,187,189,3,26,13,0,188,186,1,0,0,0,189,192,1,0,0,0,190,188,1, + 0,0,0,190,191,1,0,0,0,191,25,1,0,0,0,192,190,1,0,0,0,193,194,3,8,4,0, + 194,206,5,34,0,0,195,196,5,32,0,0,196,203,5,33,0,0,197,198,5,32,0,0,198, + 199,3,34,17,0,199,200,5,33,0,0,200,202,1,0,0,0,201,197,1,0,0,0,202,205, + 1,0,0,0,203,201,1,0,0,0,203,204,1,0,0,0,204,207,1,0,0,0,205,203,1,0,0, + 0,206,195,1,0,0,0,206,207,1,0,0,0,207,27,1,0,0,0,208,212,5,30,0,0,209, + 211,3,30,15,0,210,209,1,0,0,0,211,214,1,0,0,0,212,210,1,0,0,0,212,213, + 1,0,0,0,213,215,1,0,0,0,214,212,1,0,0,0,215,216,5,31,0,0,216,29,1,0,0, + 0,217,220,3,4,2,0,218,220,3,32,16,0,219,217,1,0,0,0,219,218,1,0,0,0,220, + 31,1,0,0,0,221,222,3,38,19,0,222,223,5,25,0,0,223,224,3,34,17,0,224,225, + 5,27,0,0,225,256,1,0,0,0,226,228,3,34,17,0,227,226,1,0,0,0,227,228,1, + 0,0,0,228,229,1,0,0,0,229,256,5,27,0,0,230,256,3,28,14,0,231,232,5,5, + 0,0,232,233,5,28,0,0,233,234,3,36,18,0,234,235,5,29,0,0,235,238,3,32, + 16,0,236,237,5,6,0,0,237,239,3,32,16,0,238,236,1,0,0,0,238,239,1,0,0, + 0,239,256,1,0,0,0,240,241,5,7,0,0,241,242,5,28,0,0,242,243,3,36,18,0, + 243,244,5,29,0,0,244,245,3,32,16,0,245,256,1,0,0,0,246,247,5,8,0,0,247, + 256,5,27,0,0,248,249,5,9,0,0,249,256,5,27,0,0,250,252,5,10,0,0,251,253, + 3,34,17,0,252,251,1,0,0,0,252,253,1,0,0,0,253,254,1,0,0,0,254,256,5,27, + 0,0,255,221,1,0,0,0,255,227,1,0,0,0,255,230,1,0,0,0,255,231,1,0,0,0,255, + 240,1,0,0,0,255,246,1,0,0,0,255,248,1,0,0,0,255,250,1,0,0,0,256,33,1, + 0,0,0,257,258,3,56,28,0,258,35,1,0,0,0,259,260,3,64,32,0,260,37,1,0,0, + 0,261,268,5,34,0,0,262,263,5,32,0,0,263,264,3,34,17,0,264,265,5,33,0, + 0,265,267,1,0,0,0,266,262,1,0,0,0,267,270,1,0,0,0,268,266,1,0,0,0,268, + 269,1,0,0,0,269,39,1,0,0,0,270,268,1,0,0,0,271,272,5,28,0,0,272,273,3, + 34,17,0,273,274,5,29,0,0,274,279,1,0,0,0,275,279,3,38,19,0,276,279,3, + 42,21,0,277,279,3,52,26,0,278,271,1,0,0,0,278,275,1,0,0,0,278,276,1,0, + 0,0,278,277,1,0,0,0,279,41,1,0,0,0,280,281,7,2,0,0,281,43,1,0,0,0,282, + 283,5,34,0,0,283,285,5,28,0,0,284,286,3,50,25,0,285,284,1,0,0,0,285,286, + 1,0,0,0,286,287,1,0,0,0,287,288,5,29,0,0,288,45,1,0,0,0,289,295,3,40, + 20,0,290,295,3,44,22,0,291,292,3,48,24,0,292,293,3,46,23,0,293,295,1, + 0,0,0,294,289,1,0,0,0,294,290,1,0,0,0,294,291,1,0,0,0,295,47,1,0,0,0, + 296,297,7,3,0,0,297,49,1,0,0,0,298,303,3,34,17,0,299,300,5,26,0,0,300, + 302,3,34,17,0,301,299,1,0,0,0,302,305,1,0,0,0,303,301,1,0,0,0,303,304, + 1,0,0,0,304,51,1,0,0,0,305,303,1,0,0,0,306,307,5,37,0,0,307,53,1,0,0, + 0,308,313,3,46,23,0,309,310,7,4,0,0,310,312,3,46,23,0,311,309,1,0,0,0, + 312,315,1,0,0,0,313,311,1,0,0,0,313,314,1,0,0,0,314,55,1,0,0,0,315,313, + 1,0,0,0,316,321,3,54,27,0,317,318,7,5,0,0,318,320,3,54,27,0,319,317,1, + 0,0,0,320,323,1,0,0,0,321,319,1,0,0,0,321,322,1,0,0,0,322,57,1,0,0,0, + 323,321,1,0,0,0,324,329,3,56,28,0,325,326,7,6,0,0,326,328,3,56,28,0,327, + 325,1,0,0,0,328,331,1,0,0,0,329,327,1,0,0,0,329,330,1,0,0,0,330,59,1, + 0,0,0,331,329,1,0,0,0,332,337,3,58,29,0,333,334,7,7,0,0,334,336,3,58, + 29,0,335,333,1,0,0,0,336,339,1,0,0,0,337,335,1,0,0,0,337,338,1,0,0,0, + 338,61,1,0,0,0,339,337,1,0,0,0,340,345,3,60,30,0,341,342,5,22,0,0,342, + 344,3,60,30,0,343,341,1,0,0,0,344,347,1,0,0,0,345,343,1,0,0,0,345,346, + 1,0,0,0,346,63,1,0,0,0,347,345,1,0,0,0,348,353,3,62,31,0,349,350,5,23, + 0,0,350,352,3,62,31,0,351,349,1,0,0,0,352,355,1,0,0,0,353,351,1,0,0,0, + 353,354,1,0,0,0,354,65,1,0,0,0,355,353,1,0,0,0,356,357,3,56,28,0,357, + 67,1,0,0,0,37,70,72,76,80,89,103,116,119,122,130,142,152,157,166,169, + 172,180,190,203,206,212,219,227,238,252,255,268,278,285,294,303,313,321, + 329,337,345,353 + }; + staticData->serializedATN = antlr4::atn::SerializedATNView(serializedATNSegment, sizeof(serializedATNSegment) / sizeof(serializedATNSegment[0])); + + antlr4::atn::ATNDeserializer deserializer; + staticData->atn = deserializer.deserialize(staticData->serializedATN); + + const size_t count = staticData->atn->getNumberOfDecisions(); + staticData->decisionToDFA.reserve(count); + for (size_t i = 0; i < count; i++) { + staticData->decisionToDFA.emplace_back(staticData->atn->getDecisionState(i), i); + } + sysyParserStaticData = std::move(staticData); +} + +} + +SysYParser::SysYParser(TokenStream *input) : SysYParser(input, antlr4::atn::ParserATNSimulatorOptions()) {} + +SysYParser::SysYParser(TokenStream *input, const antlr4::atn::ParserATNSimulatorOptions &options) : Parser(input) { + SysYParser::initialize(); + _interpreter = new atn::ParserATNSimulator(this, *sysyParserStaticData->atn, sysyParserStaticData->decisionToDFA, sysyParserStaticData->sharedContextCache, options); +} + +SysYParser::~SysYParser() { + delete _interpreter; +} + +const atn::ATN& SysYParser::getATN() const { + return *sysyParserStaticData->atn; +} + +std::string SysYParser::getGrammarFileName() const { + return "SysY.g4"; +} + +const std::vector& SysYParser::getRuleNames() const { + return sysyParserStaticData->ruleNames; +} + +const dfa::Vocabulary& SysYParser::getVocabulary() const { + return sysyParserStaticData->vocabulary; +} + +antlr4::atn::SerializedATNView SysYParser::getSerializedATN() const { + return sysyParserStaticData->serializedATN; +} + + +//----------------- CompUnitContext ------------------------------------------------------------------ + +SysYParser::CompUnitContext::CompUnitContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +std::vector SysYParser::CompUnitContext::globalDecl() { + return getRuleContexts(); +} + +SysYParser::GlobalDeclContext* SysYParser::CompUnitContext::globalDecl(size_t i) { + return getRuleContext(i); +} + +std::vector SysYParser::CompUnitContext::funcDef() { + return getRuleContexts(); +} + +SysYParser::FuncDefContext* SysYParser::CompUnitContext::funcDef(size_t i) { + return getRuleContext(i); +} + + +size_t SysYParser::CompUnitContext::getRuleIndex() const { + return SysYParser::RuleCompUnit; +} + + +std::any SysYParser::CompUnitContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitCompUnit(this); + else + return visitor->visitChildren(this); +} + +SysYParser::CompUnitContext* SysYParser::compUnit() { + CompUnitContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 0, SysYParser::RuleCompUnit); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(70); + _errHandler->sync(this); + _la = _input->LA(1); + do { + setState(70); + _errHandler->sync(this); + switch (getInterpreter()->adaptivePredict(_input, 0, _ctx)) { + case 1: { + setState(68); + globalDecl(); + break; + } + + case 2: { + setState(69); + funcDef(); + break; + } + + default: + break; + } + setState(72); + _errHandler->sync(this); + _la = _input->LA(1); + } while ((((_la & ~ 0x3fULL) == 0) && + ((1ULL << _la) & 30) != 0)); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- GlobalDeclContext ------------------------------------------------------------------ + +SysYParser::GlobalDeclContext::GlobalDeclContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + + +size_t SysYParser::GlobalDeclContext::getRuleIndex() const { + return SysYParser::RuleGlobalDecl; +} + +void SysYParser::GlobalDeclContext::copyFrom(GlobalDeclContext *ctx) { + ParserRuleContext::copyFrom(ctx); +} + +//----------------- GlobalConstDeclContext ------------------------------------------------------------------ + +SysYParser::ConstDeclContext* SysYParser::GlobalConstDeclContext::constDecl() { + return getRuleContext(0); +} + +SysYParser::GlobalConstDeclContext::GlobalConstDeclContext(GlobalDeclContext *ctx) { copyFrom(ctx); } + + +std::any SysYParser::GlobalConstDeclContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitGlobalConstDecl(this); + else + return visitor->visitChildren(this); +} +//----------------- GlobalVarDeclContext ------------------------------------------------------------------ + +SysYParser::VarDeclContext* SysYParser::GlobalVarDeclContext::varDecl() { + return getRuleContext(0); +} + +SysYParser::GlobalVarDeclContext::GlobalVarDeclContext(GlobalDeclContext *ctx) { copyFrom(ctx); } + + +std::any SysYParser::GlobalVarDeclContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitGlobalVarDecl(this); + else + return visitor->visitChildren(this); +} +SysYParser::GlobalDeclContext* SysYParser::globalDecl() { + GlobalDeclContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 2, SysYParser::RuleGlobalDecl); + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + setState(76); + _errHandler->sync(this); + switch (_input->LA(1)) { + case SysYParser::CONST: { + _localctx = _tracker.createInstance(_localctx); + enterOuterAlt(_localctx, 1); + setState(74); + constDecl(); + break; + } + + case SysYParser::INT: + case SysYParser::FLOAT: { + _localctx = _tracker.createInstance(_localctx); + enterOuterAlt(_localctx, 2); + setState(75); + varDecl(); + break; + } + + default: + throw NoViableAltException(this); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- DeclContext ------------------------------------------------------------------ + +SysYParser::DeclContext::DeclContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +SysYParser::ConstDeclContext* SysYParser::DeclContext::constDecl() { + return getRuleContext(0); +} + +SysYParser::VarDeclContext* SysYParser::DeclContext::varDecl() { + return getRuleContext(0); +} + + +size_t SysYParser::DeclContext::getRuleIndex() const { + return SysYParser::RuleDecl; +} + + +std::any SysYParser::DeclContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitDecl(this); + else + return visitor->visitChildren(this); +} + +SysYParser::DeclContext* SysYParser::decl() { + DeclContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 4, SysYParser::RuleDecl); + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + setState(80); + _errHandler->sync(this); + switch (_input->LA(1)) { + case SysYParser::CONST: { + enterOuterAlt(_localctx, 1); + setState(78); + constDecl(); + break; + } + + case SysYParser::INT: + case SysYParser::FLOAT: { + enterOuterAlt(_localctx, 2); + setState(79); + varDecl(); + break; + } + + default: + throw NoViableAltException(this); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- ConstDeclContext ------------------------------------------------------------------ + +SysYParser::ConstDeclContext::ConstDeclContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* SysYParser::ConstDeclContext::CONST() { + return getToken(SysYParser::CONST, 0); +} + +SysYParser::BTypeContext* SysYParser::ConstDeclContext::bType() { + return getRuleContext(0); +} + +std::vector SysYParser::ConstDeclContext::constDef() { + return getRuleContexts(); +} + +SysYParser::ConstDefContext* SysYParser::ConstDeclContext::constDef(size_t i) { + return getRuleContext(i); +} + +tree::TerminalNode* SysYParser::ConstDeclContext::SEMICOLON() { + return getToken(SysYParser::SEMICOLON, 0); +} + +std::vector SysYParser::ConstDeclContext::COMMA() { + return getTokens(SysYParser::COMMA); +} + +tree::TerminalNode* SysYParser::ConstDeclContext::COMMA(size_t i) { + return getToken(SysYParser::COMMA, i); +} + + +size_t SysYParser::ConstDeclContext::getRuleIndex() const { + return SysYParser::RuleConstDecl; +} + + +std::any SysYParser::ConstDeclContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitConstDecl(this); + else + return visitor->visitChildren(this); +} + +SysYParser::ConstDeclContext* SysYParser::constDecl() { + ConstDeclContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 6, SysYParser::RuleConstDecl); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(82); + match(SysYParser::CONST); + setState(83); + bType(); + setState(84); + constDef(); + setState(89); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == SysYParser::COMMA) { + setState(85); + match(SysYParser::COMMA); + setState(86); + constDef(); + setState(91); + _errHandler->sync(this); + _la = _input->LA(1); + } + setState(92); + match(SysYParser::SEMICOLON); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- BTypeContext ------------------------------------------------------------------ + +SysYParser::BTypeContext::BTypeContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* SysYParser::BTypeContext::INT() { + return getToken(SysYParser::INT, 0); +} + +tree::TerminalNode* SysYParser::BTypeContext::FLOAT() { + return getToken(SysYParser::FLOAT, 0); +} + + +size_t SysYParser::BTypeContext::getRuleIndex() const { + return SysYParser::RuleBType; +} + + +std::any SysYParser::BTypeContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitBType(this); + else + return visitor->visitChildren(this); +} + +SysYParser::BTypeContext* SysYParser::bType() { + BTypeContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 8, SysYParser::RuleBType); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(94); + _la = _input->LA(1); + if (!(_la == SysYParser::INT + + || _la == SysYParser::FLOAT)) { + _errHandler->recoverInline(this); + } + else { + _errHandler->reportMatch(this); + consume(); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- ConstDefContext ------------------------------------------------------------------ + +SysYParser::ConstDefContext::ConstDefContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* SysYParser::ConstDefContext::Ident() { + return getToken(SysYParser::Ident, 0); +} + +tree::TerminalNode* SysYParser::ConstDefContext::ASSIGN() { + return getToken(SysYParser::ASSIGN, 0); +} + +SysYParser::ConstInitValContext* SysYParser::ConstDefContext::constInitVal() { + return getRuleContext(0); +} + +std::vector SysYParser::ConstDefContext::LBRACK() { + return getTokens(SysYParser::LBRACK); +} + +tree::TerminalNode* SysYParser::ConstDefContext::LBRACK(size_t i) { + return getToken(SysYParser::LBRACK, i); +} + +std::vector SysYParser::ConstDefContext::constExp() { + return getRuleContexts(); +} + +SysYParser::ConstExpContext* SysYParser::ConstDefContext::constExp(size_t i) { + return getRuleContext(i); +} + +std::vector SysYParser::ConstDefContext::RBRACK() { + return getTokens(SysYParser::RBRACK); +} + +tree::TerminalNode* SysYParser::ConstDefContext::RBRACK(size_t i) { + return getToken(SysYParser::RBRACK, i); +} + + +size_t SysYParser::ConstDefContext::getRuleIndex() const { + return SysYParser::RuleConstDef; +} + + +std::any SysYParser::ConstDefContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitConstDef(this); + else + return visitor->visitChildren(this); +} + +SysYParser::ConstDefContext* SysYParser::constDef() { + ConstDefContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 10, SysYParser::RuleConstDef); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(96); + match(SysYParser::Ident); + setState(103); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == SysYParser::LBRACK) { + setState(97); + match(SysYParser::LBRACK); + setState(98); + constExp(); + setState(99); + match(SysYParser::RBRACK); + setState(105); + _errHandler->sync(this); + _la = _input->LA(1); + } + setState(106); + match(SysYParser::ASSIGN); + setState(107); + constInitVal(); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- ConstInitValContext ------------------------------------------------------------------ + +SysYParser::ConstInitValContext::ConstInitValContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + + +size_t SysYParser::ConstInitValContext::getRuleIndex() const { + return SysYParser::RuleConstInitVal; +} + +void SysYParser::ConstInitValContext::copyFrom(ConstInitValContext *ctx) { + ParserRuleContext::copyFrom(ctx); +} + +//----------------- ConstScalarInitValueContext ------------------------------------------------------------------ + +SysYParser::ConstExpContext* SysYParser::ConstScalarInitValueContext::constExp() { + return getRuleContext(0); +} + +SysYParser::ConstScalarInitValueContext::ConstScalarInitValueContext(ConstInitValContext *ctx) { copyFrom(ctx); } + + +std::any SysYParser::ConstScalarInitValueContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitConstScalarInitValue(this); + else + return visitor->visitChildren(this); +} +//----------------- ConstArrayInitValueContext ------------------------------------------------------------------ + +tree::TerminalNode* SysYParser::ConstArrayInitValueContext::LBRACE() { + return getToken(SysYParser::LBRACE, 0); +} + +tree::TerminalNode* SysYParser::ConstArrayInitValueContext::RBRACE() { + return getToken(SysYParser::RBRACE, 0); +} + +std::vector SysYParser::ConstArrayInitValueContext::constInitVal() { + return getRuleContexts(); +} + +SysYParser::ConstInitValContext* SysYParser::ConstArrayInitValueContext::constInitVal(size_t i) { + return getRuleContext(i); +} + +std::vector SysYParser::ConstArrayInitValueContext::COMMA() { + return getTokens(SysYParser::COMMA); +} + +tree::TerminalNode* SysYParser::ConstArrayInitValueContext::COMMA(size_t i) { + return getToken(SysYParser::COMMA, i); +} + +SysYParser::ConstArrayInitValueContext::ConstArrayInitValueContext(ConstInitValContext *ctx) { copyFrom(ctx); } + + +std::any SysYParser::ConstArrayInitValueContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitConstArrayInitValue(this); + else + return visitor->visitChildren(this); +} +SysYParser::ConstInitValContext* SysYParser::constInitVal() { + ConstInitValContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 12, SysYParser::RuleConstInitVal); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + setState(122); + _errHandler->sync(this); + switch (_input->LA(1)) { + case SysYParser::ADD: + case SysYParser::SUB: + case SysYParser::NOT: + case SysYParser::LPAREN: + case SysYParser::Ident: + case SysYParser::ILITERAL: + case SysYParser::FLITERAL: + case SysYParser::STRING: { + _localctx = _tracker.createInstance(_localctx); + enterOuterAlt(_localctx, 1); + setState(109); + constExp(); + break; + } + + case SysYParser::LBRACE: { + _localctx = _tracker.createInstance(_localctx); + enterOuterAlt(_localctx, 2); + setState(110); + match(SysYParser::LBRACE); + setState(119); + _errHandler->sync(this); + + _la = _input->LA(1); + if ((((_la & ~ 0x3fULL) == 0) && + ((1ULL << _la) & 259056998400) != 0)) { + setState(111); + constInitVal(); + setState(116); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == SysYParser::COMMA) { + setState(112); + match(SysYParser::COMMA); + setState(113); + constInitVal(); + setState(118); + _errHandler->sync(this); + _la = _input->LA(1); + } + } + setState(121); + match(SysYParser::RBRACE); + break; + } + + default: + throw NoViableAltException(this); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- VarDeclContext ------------------------------------------------------------------ + +SysYParser::VarDeclContext::VarDeclContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +SysYParser::BTypeContext* SysYParser::VarDeclContext::bType() { + return getRuleContext(0); +} + +std::vector SysYParser::VarDeclContext::varDef() { + return getRuleContexts(); +} + +SysYParser::VarDefContext* SysYParser::VarDeclContext::varDef(size_t i) { + return getRuleContext(i); +} + +tree::TerminalNode* SysYParser::VarDeclContext::SEMICOLON() { + return getToken(SysYParser::SEMICOLON, 0); +} + +std::vector SysYParser::VarDeclContext::COMMA() { + return getTokens(SysYParser::COMMA); +} + +tree::TerminalNode* SysYParser::VarDeclContext::COMMA(size_t i) { + return getToken(SysYParser::COMMA, i); +} + + +size_t SysYParser::VarDeclContext::getRuleIndex() const { + return SysYParser::RuleVarDecl; +} + + +std::any SysYParser::VarDeclContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitVarDecl(this); + else + return visitor->visitChildren(this); +} + +SysYParser::VarDeclContext* SysYParser::varDecl() { + VarDeclContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 14, SysYParser::RuleVarDecl); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(124); + bType(); + setState(125); + varDef(); + setState(130); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == SysYParser::COMMA) { + setState(126); + match(SysYParser::COMMA); + setState(127); + varDef(); + setState(132); + _errHandler->sync(this); + _la = _input->LA(1); + } + setState(133); + match(SysYParser::SEMICOLON); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- VarDefContext ------------------------------------------------------------------ + +SysYParser::VarDefContext::VarDefContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* SysYParser::VarDefContext::Ident() { + return getToken(SysYParser::Ident, 0); +} + +std::vector SysYParser::VarDefContext::LBRACK() { + return getTokens(SysYParser::LBRACK); +} + +tree::TerminalNode* SysYParser::VarDefContext::LBRACK(size_t i) { + return getToken(SysYParser::LBRACK, i); +} + +std::vector SysYParser::VarDefContext::constExp() { + return getRuleContexts(); +} + +SysYParser::ConstExpContext* SysYParser::VarDefContext::constExp(size_t i) { + return getRuleContext(i); +} + +std::vector SysYParser::VarDefContext::RBRACK() { + return getTokens(SysYParser::RBRACK); +} + +tree::TerminalNode* SysYParser::VarDefContext::RBRACK(size_t i) { + return getToken(SysYParser::RBRACK, i); +} + +tree::TerminalNode* SysYParser::VarDefContext::ASSIGN() { + return getToken(SysYParser::ASSIGN, 0); +} + +SysYParser::InitValContext* SysYParser::VarDefContext::initVal() { + return getRuleContext(0); +} + + +size_t SysYParser::VarDefContext::getRuleIndex() const { + return SysYParser::RuleVarDef; +} + + +std::any SysYParser::VarDefContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitVarDef(this); + else + return visitor->visitChildren(this); +} + +SysYParser::VarDefContext* SysYParser::varDef() { + VarDefContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 16, SysYParser::RuleVarDef); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + setState(157); + _errHandler->sync(this); + switch (getInterpreter()->adaptivePredict(_input, 12, _ctx)) { + case 1: { + enterOuterAlt(_localctx, 1); + setState(135); + match(SysYParser::Ident); + setState(142); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == SysYParser::LBRACK) { + setState(136); + match(SysYParser::LBRACK); + setState(137); + constExp(); + setState(138); + match(SysYParser::RBRACK); + setState(144); + _errHandler->sync(this); + _la = _input->LA(1); + } + break; + } + + case 2: { + enterOuterAlt(_localctx, 2); + setState(145); + match(SysYParser::Ident); + setState(152); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == SysYParser::LBRACK) { + setState(146); + match(SysYParser::LBRACK); + setState(147); + constExp(); + setState(148); + match(SysYParser::RBRACK); + setState(154); + _errHandler->sync(this); + _la = _input->LA(1); + } + setState(155); + match(SysYParser::ASSIGN); + setState(156); + initVal(); + break; + } + + default: + break; + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- InitValContext ------------------------------------------------------------------ + +SysYParser::InitValContext::InitValContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + + +size_t SysYParser::InitValContext::getRuleIndex() const { + return SysYParser::RuleInitVal; +} + +void SysYParser::InitValContext::copyFrom(InitValContext *ctx) { + ParserRuleContext::copyFrom(ctx); +} + +//----------------- ArrayInitValueContext ------------------------------------------------------------------ + +tree::TerminalNode* SysYParser::ArrayInitValueContext::LBRACE() { + return getToken(SysYParser::LBRACE, 0); +} + +tree::TerminalNode* SysYParser::ArrayInitValueContext::RBRACE() { + return getToken(SysYParser::RBRACE, 0); +} + +std::vector SysYParser::ArrayInitValueContext::initVal() { + return getRuleContexts(); +} + +SysYParser::InitValContext* SysYParser::ArrayInitValueContext::initVal(size_t i) { + return getRuleContext(i); +} + +std::vector SysYParser::ArrayInitValueContext::COMMA() { + return getTokens(SysYParser::COMMA); +} + +tree::TerminalNode* SysYParser::ArrayInitValueContext::COMMA(size_t i) { + return getToken(SysYParser::COMMA, i); +} + +SysYParser::ArrayInitValueContext::ArrayInitValueContext(InitValContext *ctx) { copyFrom(ctx); } + + +std::any SysYParser::ArrayInitValueContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitArrayInitValue(this); + else + return visitor->visitChildren(this); +} +//----------------- ScalarInitValueContext ------------------------------------------------------------------ + +SysYParser::ExpContext* SysYParser::ScalarInitValueContext::exp() { + return getRuleContext(0); +} + +SysYParser::ScalarInitValueContext::ScalarInitValueContext(InitValContext *ctx) { copyFrom(ctx); } + + +std::any SysYParser::ScalarInitValueContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitScalarInitValue(this); + else + return visitor->visitChildren(this); +} +SysYParser::InitValContext* SysYParser::initVal() { + InitValContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 18, SysYParser::RuleInitVal); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + setState(172); + _errHandler->sync(this); + switch (_input->LA(1)) { + case SysYParser::ADD: + case SysYParser::SUB: + case SysYParser::NOT: + case SysYParser::LPAREN: + case SysYParser::Ident: + case SysYParser::ILITERAL: + case SysYParser::FLITERAL: + case SysYParser::STRING: { + _localctx = _tracker.createInstance(_localctx); + enterOuterAlt(_localctx, 1); + setState(159); + exp(); + break; + } + + case SysYParser::LBRACE: { + _localctx = _tracker.createInstance(_localctx); + enterOuterAlt(_localctx, 2); + setState(160); + match(SysYParser::LBRACE); + setState(169); + _errHandler->sync(this); + + _la = _input->LA(1); + if ((((_la & ~ 0x3fULL) == 0) && + ((1ULL << _la) & 259056998400) != 0)) { + setState(161); + initVal(); + setState(166); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == SysYParser::COMMA) { + setState(162); + match(SysYParser::COMMA); + setState(163); + initVal(); + setState(168); + _errHandler->sync(this); + _la = _input->LA(1); + } + } + setState(171); + match(SysYParser::RBRACE); + break; + } + + default: + throw NoViableAltException(this); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- FuncTypeContext ------------------------------------------------------------------ + +SysYParser::FuncTypeContext::FuncTypeContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* SysYParser::FuncTypeContext::VOID() { + return getToken(SysYParser::VOID, 0); +} + +tree::TerminalNode* SysYParser::FuncTypeContext::INT() { + return getToken(SysYParser::INT, 0); +} + +tree::TerminalNode* SysYParser::FuncTypeContext::FLOAT() { + return getToken(SysYParser::FLOAT, 0); +} + + +size_t SysYParser::FuncTypeContext::getRuleIndex() const { + return SysYParser::RuleFuncType; +} + + +std::any SysYParser::FuncTypeContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitFuncType(this); + else + return visitor->visitChildren(this); +} + +SysYParser::FuncTypeContext* SysYParser::funcType() { + FuncTypeContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 20, SysYParser::RuleFuncType); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(174); + _la = _input->LA(1); + if (!((((_la & ~ 0x3fULL) == 0) && + ((1ULL << _la) & 28) != 0))) { + _errHandler->recoverInline(this); + } + else { + _errHandler->reportMatch(this); + consume(); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- FuncDefContext ------------------------------------------------------------------ + +SysYParser::FuncDefContext::FuncDefContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +SysYParser::FuncTypeContext* SysYParser::FuncDefContext::funcType() { + return getRuleContext(0); +} + +tree::TerminalNode* SysYParser::FuncDefContext::Ident() { + return getToken(SysYParser::Ident, 0); +} + +tree::TerminalNode* SysYParser::FuncDefContext::LPAREN() { + return getToken(SysYParser::LPAREN, 0); +} + +tree::TerminalNode* SysYParser::FuncDefContext::RPAREN() { + return getToken(SysYParser::RPAREN, 0); +} + +SysYParser::BlockStmtContext* SysYParser::FuncDefContext::blockStmt() { + return getRuleContext(0); +} + +SysYParser::FuncFParamsContext* SysYParser::FuncDefContext::funcFParams() { + return getRuleContext(0); +} + + +size_t SysYParser::FuncDefContext::getRuleIndex() const { + return SysYParser::RuleFuncDef; +} + + +std::any SysYParser::FuncDefContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitFuncDef(this); + else + return visitor->visitChildren(this); +} + +SysYParser::FuncDefContext* SysYParser::funcDef() { + FuncDefContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 22, SysYParser::RuleFuncDef); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(176); + funcType(); + setState(177); + match(SysYParser::Ident); + setState(178); + match(SysYParser::LPAREN); + setState(180); + _errHandler->sync(this); + + _la = _input->LA(1); + if (_la == SysYParser::INT + + || _la == SysYParser::FLOAT) { + setState(179); + funcFParams(); + } + setState(182); + match(SysYParser::RPAREN); + setState(183); + blockStmt(); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- FuncFParamsContext ------------------------------------------------------------------ + +SysYParser::FuncFParamsContext::FuncFParamsContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +std::vector SysYParser::FuncFParamsContext::funcFParam() { + return getRuleContexts(); +} + +SysYParser::FuncFParamContext* SysYParser::FuncFParamsContext::funcFParam(size_t i) { + return getRuleContext(i); +} + +std::vector SysYParser::FuncFParamsContext::COMMA() { + return getTokens(SysYParser::COMMA); +} + +tree::TerminalNode* SysYParser::FuncFParamsContext::COMMA(size_t i) { + return getToken(SysYParser::COMMA, i); +} + + +size_t SysYParser::FuncFParamsContext::getRuleIndex() const { + return SysYParser::RuleFuncFParams; +} + + +std::any SysYParser::FuncFParamsContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitFuncFParams(this); + else + return visitor->visitChildren(this); +} + +SysYParser::FuncFParamsContext* SysYParser::funcFParams() { + FuncFParamsContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 24, SysYParser::RuleFuncFParams); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(185); + funcFParam(); + setState(190); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == SysYParser::COMMA) { + setState(186); + match(SysYParser::COMMA); + setState(187); + funcFParam(); + setState(192); + _errHandler->sync(this); + _la = _input->LA(1); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- FuncFParamContext ------------------------------------------------------------------ + +SysYParser::FuncFParamContext::FuncFParamContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +SysYParser::BTypeContext* SysYParser::FuncFParamContext::bType() { + return getRuleContext(0); +} + +tree::TerminalNode* SysYParser::FuncFParamContext::Ident() { + return getToken(SysYParser::Ident, 0); +} + +std::vector SysYParser::FuncFParamContext::LBRACK() { + return getTokens(SysYParser::LBRACK); +} + +tree::TerminalNode* SysYParser::FuncFParamContext::LBRACK(size_t i) { + return getToken(SysYParser::LBRACK, i); +} + +std::vector SysYParser::FuncFParamContext::RBRACK() { + return getTokens(SysYParser::RBRACK); +} + +tree::TerminalNode* SysYParser::FuncFParamContext::RBRACK(size_t i) { + return getToken(SysYParser::RBRACK, i); +} + +std::vector SysYParser::FuncFParamContext::exp() { + return getRuleContexts(); +} + +SysYParser::ExpContext* SysYParser::FuncFParamContext::exp(size_t i) { + return getRuleContext(i); +} + + +size_t SysYParser::FuncFParamContext::getRuleIndex() const { + return SysYParser::RuleFuncFParam; +} + + +std::any SysYParser::FuncFParamContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitFuncFParam(this); + else + return visitor->visitChildren(this); +} + +SysYParser::FuncFParamContext* SysYParser::funcFParam() { + FuncFParamContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 26, SysYParser::RuleFuncFParam); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(193); + bType(); + setState(194); + match(SysYParser::Ident); + setState(206); + _errHandler->sync(this); + + _la = _input->LA(1); + if (_la == SysYParser::LBRACK) { + setState(195); + match(SysYParser::LBRACK); + setState(196); + match(SysYParser::RBRACK); + setState(203); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == SysYParser::LBRACK) { + setState(197); + match(SysYParser::LBRACK); + setState(198); + exp(); + setState(199); + match(SysYParser::RBRACK); + setState(205); + _errHandler->sync(this); + _la = _input->LA(1); + } + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- BlockStmtContext ------------------------------------------------------------------ + +SysYParser::BlockStmtContext::BlockStmtContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* SysYParser::BlockStmtContext::LBRACE() { + return getToken(SysYParser::LBRACE, 0); +} + +tree::TerminalNode* SysYParser::BlockStmtContext::RBRACE() { + return getToken(SysYParser::RBRACE, 0); +} + +std::vector SysYParser::BlockStmtContext::blockItem() { + return getRuleContexts(); +} + +SysYParser::BlockItemContext* SysYParser::BlockStmtContext::blockItem(size_t i) { + return getRuleContext(i); +} + + +size_t SysYParser::BlockStmtContext::getRuleIndex() const { + return SysYParser::RuleBlockStmt; +} + + +std::any SysYParser::BlockStmtContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitBlockStmt(this); + else + return visitor->visitChildren(this); +} + +SysYParser::BlockStmtContext* SysYParser::blockStmt() { + BlockStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 28, SysYParser::RuleBlockStmt); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(208); + match(SysYParser::LBRACE); + setState(212); + _errHandler->sync(this); + _la = _input->LA(1); + while ((((_la & ~ 0x3fULL) == 0) && + ((1ULL << _la) & 259191218094) != 0)) { + setState(209); + blockItem(); + setState(214); + _errHandler->sync(this); + _la = _input->LA(1); + } + setState(215); + match(SysYParser::RBRACE); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- BlockItemContext ------------------------------------------------------------------ + +SysYParser::BlockItemContext::BlockItemContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +SysYParser::DeclContext* SysYParser::BlockItemContext::decl() { + return getRuleContext(0); +} + +SysYParser::StmtContext* SysYParser::BlockItemContext::stmt() { + return getRuleContext(0); +} + + +size_t SysYParser::BlockItemContext::getRuleIndex() const { + return SysYParser::RuleBlockItem; +} + + +std::any SysYParser::BlockItemContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitBlockItem(this); + else + return visitor->visitChildren(this); +} + +SysYParser::BlockItemContext* SysYParser::blockItem() { + BlockItemContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 30, SysYParser::RuleBlockItem); + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + setState(219); + _errHandler->sync(this); + switch (_input->LA(1)) { + case SysYParser::CONST: + case SysYParser::INT: + case SysYParser::FLOAT: { + enterOuterAlt(_localctx, 1); + setState(217); + decl(); + break; + } + + case SysYParser::IF: + case SysYParser::WHILE: + case SysYParser::BREAK: + case SysYParser::CONTINUE: + case SysYParser::RETURN: + case SysYParser::ADD: + case SysYParser::SUB: + case SysYParser::NOT: + case SysYParser::SEMICOLON: + case SysYParser::LPAREN: + case SysYParser::LBRACE: + case SysYParser::Ident: + case SysYParser::ILITERAL: + case SysYParser::FLITERAL: + case SysYParser::STRING: { + enterOuterAlt(_localctx, 2); + setState(218); + stmt(); + break; + } + + default: + throw NoViableAltException(this); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- StmtContext ------------------------------------------------------------------ + +SysYParser::StmtContext::StmtContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + + +size_t SysYParser::StmtContext::getRuleIndex() const { + return SysYParser::RuleStmt; +} + +void SysYParser::StmtContext::copyFrom(StmtContext *ctx) { + ParserRuleContext::copyFrom(ctx); +} + +//----------------- BlkStmtContext ------------------------------------------------------------------ + +SysYParser::BlockStmtContext* SysYParser::BlkStmtContext::blockStmt() { + return getRuleContext(0); +} + +SysYParser::BlkStmtContext::BlkStmtContext(StmtContext *ctx) { copyFrom(ctx); } + + +std::any SysYParser::BlkStmtContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitBlkStmt(this); + else + return visitor->visitChildren(this); +} +//----------------- WhileStmtContext ------------------------------------------------------------------ + +tree::TerminalNode* SysYParser::WhileStmtContext::WHILE() { + return getToken(SysYParser::WHILE, 0); +} + +tree::TerminalNode* SysYParser::WhileStmtContext::LPAREN() { + return getToken(SysYParser::LPAREN, 0); +} + +SysYParser::CondContext* SysYParser::WhileStmtContext::cond() { + return getRuleContext(0); +} + +tree::TerminalNode* SysYParser::WhileStmtContext::RPAREN() { + return getToken(SysYParser::RPAREN, 0); +} + +SysYParser::StmtContext* SysYParser::WhileStmtContext::stmt() { + return getRuleContext(0); +} + +SysYParser::WhileStmtContext::WhileStmtContext(StmtContext *ctx) { copyFrom(ctx); } + + +std::any SysYParser::WhileStmtContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitWhileStmt(this); + else + return visitor->visitChildren(this); +} +//----------------- IfStmtContext ------------------------------------------------------------------ + +tree::TerminalNode* SysYParser::IfStmtContext::IF() { + return getToken(SysYParser::IF, 0); +} + +tree::TerminalNode* SysYParser::IfStmtContext::LPAREN() { + return getToken(SysYParser::LPAREN, 0); +} + +SysYParser::CondContext* SysYParser::IfStmtContext::cond() { + return getRuleContext(0); +} + +tree::TerminalNode* SysYParser::IfStmtContext::RPAREN() { + return getToken(SysYParser::RPAREN, 0); +} + +std::vector SysYParser::IfStmtContext::stmt() { + return getRuleContexts(); +} + +SysYParser::StmtContext* SysYParser::IfStmtContext::stmt(size_t i) { + return getRuleContext(i); +} + +tree::TerminalNode* SysYParser::IfStmtContext::ELSE() { + return getToken(SysYParser::ELSE, 0); +} + +SysYParser::IfStmtContext::IfStmtContext(StmtContext *ctx) { copyFrom(ctx); } + + +std::any SysYParser::IfStmtContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitIfStmt(this); + else + return visitor->visitChildren(this); +} +//----------------- AssignStmtContext ------------------------------------------------------------------ + +SysYParser::LValueContext* SysYParser::AssignStmtContext::lValue() { + return getRuleContext(0); +} + +tree::TerminalNode* SysYParser::AssignStmtContext::ASSIGN() { + return getToken(SysYParser::ASSIGN, 0); +} + +SysYParser::ExpContext* SysYParser::AssignStmtContext::exp() { + return getRuleContext(0); +} + +tree::TerminalNode* SysYParser::AssignStmtContext::SEMICOLON() { + return getToken(SysYParser::SEMICOLON, 0); +} + +SysYParser::AssignStmtContext::AssignStmtContext(StmtContext *ctx) { copyFrom(ctx); } + + +std::any SysYParser::AssignStmtContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitAssignStmt(this); + else + return visitor->visitChildren(this); +} +//----------------- BreakStmtContext ------------------------------------------------------------------ + +tree::TerminalNode* SysYParser::BreakStmtContext::BREAK() { + return getToken(SysYParser::BREAK, 0); +} + +tree::TerminalNode* SysYParser::BreakStmtContext::SEMICOLON() { + return getToken(SysYParser::SEMICOLON, 0); +} + +SysYParser::BreakStmtContext::BreakStmtContext(StmtContext *ctx) { copyFrom(ctx); } + + +std::any SysYParser::BreakStmtContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitBreakStmt(this); + else + return visitor->visitChildren(this); +} +//----------------- ExpStmtContext ------------------------------------------------------------------ + +tree::TerminalNode* SysYParser::ExpStmtContext::SEMICOLON() { + return getToken(SysYParser::SEMICOLON, 0); +} + +SysYParser::ExpContext* SysYParser::ExpStmtContext::exp() { + return getRuleContext(0); +} + +SysYParser::ExpStmtContext::ExpStmtContext(StmtContext *ctx) { copyFrom(ctx); } + + +std::any SysYParser::ExpStmtContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitExpStmt(this); + else + return visitor->visitChildren(this); +} +//----------------- ReturnStmtContext ------------------------------------------------------------------ + +tree::TerminalNode* SysYParser::ReturnStmtContext::RETURN() { + return getToken(SysYParser::RETURN, 0); +} + +tree::TerminalNode* SysYParser::ReturnStmtContext::SEMICOLON() { + return getToken(SysYParser::SEMICOLON, 0); +} + +SysYParser::ExpContext* SysYParser::ReturnStmtContext::exp() { + return getRuleContext(0); +} + +SysYParser::ReturnStmtContext::ReturnStmtContext(StmtContext *ctx) { copyFrom(ctx); } + + +std::any SysYParser::ReturnStmtContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitReturnStmt(this); + else + return visitor->visitChildren(this); +} +//----------------- ContinueStmtContext ------------------------------------------------------------------ + +tree::TerminalNode* SysYParser::ContinueStmtContext::CONTINUE() { + return getToken(SysYParser::CONTINUE, 0); +} + +tree::TerminalNode* SysYParser::ContinueStmtContext::SEMICOLON() { + return getToken(SysYParser::SEMICOLON, 0); +} + +SysYParser::ContinueStmtContext::ContinueStmtContext(StmtContext *ctx) { copyFrom(ctx); } + + +std::any SysYParser::ContinueStmtContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitContinueStmt(this); + else + return visitor->visitChildren(this); +} +SysYParser::StmtContext* SysYParser::stmt() { + StmtContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 32, SysYParser::RuleStmt); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + setState(255); + _errHandler->sync(this); + switch (getInterpreter()->adaptivePredict(_input, 25, _ctx)) { + case 1: { + _localctx = _tracker.createInstance(_localctx); + enterOuterAlt(_localctx, 1); + setState(221); + lValue(); + setState(222); + match(SysYParser::ASSIGN); + setState(223); + exp(); + setState(224); + match(SysYParser::SEMICOLON); + break; + } + + case 2: { + _localctx = _tracker.createInstance(_localctx); + enterOuterAlt(_localctx, 2); + setState(227); + _errHandler->sync(this); + + _la = _input->LA(1); + if ((((_la & ~ 0x3fULL) == 0) && + ((1ULL << _la) & 257983256576) != 0)) { + setState(226); + exp(); + } + setState(229); + match(SysYParser::SEMICOLON); + break; + } + + case 3: { + _localctx = _tracker.createInstance(_localctx); + enterOuterAlt(_localctx, 3); + setState(230); + blockStmt(); + break; + } + + case 4: { + _localctx = _tracker.createInstance(_localctx); + enterOuterAlt(_localctx, 4); + setState(231); + match(SysYParser::IF); + setState(232); + match(SysYParser::LPAREN); + setState(233); + cond(); + setState(234); + match(SysYParser::RPAREN); + setState(235); + stmt(); + setState(238); + _errHandler->sync(this); + + switch (getInterpreter()->adaptivePredict(_input, 23, _ctx)) { + case 1: { + setState(236); + match(SysYParser::ELSE); + setState(237); + stmt(); + break; + } + + default: + break; + } + break; + } + + case 5: { + _localctx = _tracker.createInstance(_localctx); + enterOuterAlt(_localctx, 5); + setState(240); + match(SysYParser::WHILE); + setState(241); + match(SysYParser::LPAREN); + setState(242); + cond(); + setState(243); + match(SysYParser::RPAREN); + setState(244); + stmt(); + break; + } + + case 6: { + _localctx = _tracker.createInstance(_localctx); + enterOuterAlt(_localctx, 6); + setState(246); + match(SysYParser::BREAK); + setState(247); + match(SysYParser::SEMICOLON); + break; + } + + case 7: { + _localctx = _tracker.createInstance(_localctx); + enterOuterAlt(_localctx, 7); + setState(248); + match(SysYParser::CONTINUE); + setState(249); + match(SysYParser::SEMICOLON); + break; + } + + case 8: { + _localctx = _tracker.createInstance(_localctx); + enterOuterAlt(_localctx, 8); + setState(250); + match(SysYParser::RETURN); + setState(252); + _errHandler->sync(this); + + _la = _input->LA(1); + if ((((_la & ~ 0x3fULL) == 0) && + ((1ULL << _la) & 257983256576) != 0)) { + setState(251); + exp(); + } + setState(254); + match(SysYParser::SEMICOLON); + break; + } + + default: + break; + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- ExpContext ------------------------------------------------------------------ + +SysYParser::ExpContext::ExpContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +SysYParser::AddExpContext* SysYParser::ExpContext::addExp() { + return getRuleContext(0); +} + + +size_t SysYParser::ExpContext::getRuleIndex() const { + return SysYParser::RuleExp; +} + + +std::any SysYParser::ExpContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitExp(this); + else + return visitor->visitChildren(this); +} + +SysYParser::ExpContext* SysYParser::exp() { + ExpContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 34, SysYParser::RuleExp); + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(257); + addExp(); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- CondContext ------------------------------------------------------------------ + +SysYParser::CondContext::CondContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +SysYParser::LOrExpContext* SysYParser::CondContext::lOrExp() { + return getRuleContext(0); +} + + +size_t SysYParser::CondContext::getRuleIndex() const { + return SysYParser::RuleCond; +} + + +std::any SysYParser::CondContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitCond(this); + else + return visitor->visitChildren(this); +} + +SysYParser::CondContext* SysYParser::cond() { + CondContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 36, SysYParser::RuleCond); + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(259); + lOrExp(); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- LValueContext ------------------------------------------------------------------ + +SysYParser::LValueContext::LValueContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* SysYParser::LValueContext::Ident() { + return getToken(SysYParser::Ident, 0); +} + +std::vector SysYParser::LValueContext::LBRACK() { + return getTokens(SysYParser::LBRACK); +} + +tree::TerminalNode* SysYParser::LValueContext::LBRACK(size_t i) { + return getToken(SysYParser::LBRACK, i); +} + +std::vector SysYParser::LValueContext::exp() { + return getRuleContexts(); +} + +SysYParser::ExpContext* SysYParser::LValueContext::exp(size_t i) { + return getRuleContext(i); +} + +std::vector SysYParser::LValueContext::RBRACK() { + return getTokens(SysYParser::RBRACK); +} + +tree::TerminalNode* SysYParser::LValueContext::RBRACK(size_t i) { + return getToken(SysYParser::RBRACK, i); +} + + +size_t SysYParser::LValueContext::getRuleIndex() const { + return SysYParser::RuleLValue; +} + + +std::any SysYParser::LValueContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitLValue(this); + else + return visitor->visitChildren(this); +} + +SysYParser::LValueContext* SysYParser::lValue() { + LValueContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 38, SysYParser::RuleLValue); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(261); + match(SysYParser::Ident); + setState(268); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == SysYParser::LBRACK) { + setState(262); + match(SysYParser::LBRACK); + setState(263); + exp(); + setState(264); + match(SysYParser::RBRACK); + setState(270); + _errHandler->sync(this); + _la = _input->LA(1); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- PrimaryExpContext ------------------------------------------------------------------ + +SysYParser::PrimaryExpContext::PrimaryExpContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* SysYParser::PrimaryExpContext::LPAREN() { + return getToken(SysYParser::LPAREN, 0); +} + +SysYParser::ExpContext* SysYParser::PrimaryExpContext::exp() { + return getRuleContext(0); +} + +tree::TerminalNode* SysYParser::PrimaryExpContext::RPAREN() { + return getToken(SysYParser::RPAREN, 0); +} + +SysYParser::LValueContext* SysYParser::PrimaryExpContext::lValue() { + return getRuleContext(0); +} + +SysYParser::NumberContext* SysYParser::PrimaryExpContext::number() { + return getRuleContext(0); +} + +SysYParser::StringContext* SysYParser::PrimaryExpContext::string() { + return getRuleContext(0); +} + + +size_t SysYParser::PrimaryExpContext::getRuleIndex() const { + return SysYParser::RulePrimaryExp; +} + + +std::any SysYParser::PrimaryExpContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitPrimaryExp(this); + else + return visitor->visitChildren(this); +} + +SysYParser::PrimaryExpContext* SysYParser::primaryExp() { + PrimaryExpContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 40, SysYParser::RulePrimaryExp); + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + setState(278); + _errHandler->sync(this); + switch (_input->LA(1)) { + case SysYParser::LPAREN: { + enterOuterAlt(_localctx, 1); + setState(271); + match(SysYParser::LPAREN); + setState(272); + exp(); + setState(273); + match(SysYParser::RPAREN); + break; + } + + case SysYParser::Ident: { + enterOuterAlt(_localctx, 2); + setState(275); + lValue(); + break; + } + + case SysYParser::ILITERAL: + case SysYParser::FLITERAL: { + enterOuterAlt(_localctx, 3); + setState(276); + number(); + break; + } + + case SysYParser::STRING: { + enterOuterAlt(_localctx, 4); + setState(277); + string(); + break; + } + + default: + throw NoViableAltException(this); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- NumberContext ------------------------------------------------------------------ + +SysYParser::NumberContext::NumberContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* SysYParser::NumberContext::ILITERAL() { + return getToken(SysYParser::ILITERAL, 0); +} + +tree::TerminalNode* SysYParser::NumberContext::FLITERAL() { + return getToken(SysYParser::FLITERAL, 0); +} + + +size_t SysYParser::NumberContext::getRuleIndex() const { + return SysYParser::RuleNumber; +} + + +std::any SysYParser::NumberContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitNumber(this); + else + return visitor->visitChildren(this); +} + +SysYParser::NumberContext* SysYParser::number() { + NumberContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 42, SysYParser::RuleNumber); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(280); + _la = _input->LA(1); + if (!(_la == SysYParser::ILITERAL + + || _la == SysYParser::FLITERAL)) { + _errHandler->recoverInline(this); + } + else { + _errHandler->reportMatch(this); + consume(); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- CallContext ------------------------------------------------------------------ + +SysYParser::CallContext::CallContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* SysYParser::CallContext::Ident() { + return getToken(SysYParser::Ident, 0); +} + +tree::TerminalNode* SysYParser::CallContext::LPAREN() { + return getToken(SysYParser::LPAREN, 0); +} + +tree::TerminalNode* SysYParser::CallContext::RPAREN() { + return getToken(SysYParser::RPAREN, 0); +} + +SysYParser::FuncRParamsContext* SysYParser::CallContext::funcRParams() { + return getRuleContext(0); +} + + +size_t SysYParser::CallContext::getRuleIndex() const { + return SysYParser::RuleCall; +} + + +std::any SysYParser::CallContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitCall(this); + else + return visitor->visitChildren(this); +} + +SysYParser::CallContext* SysYParser::call() { + CallContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 44, SysYParser::RuleCall); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(282); + match(SysYParser::Ident); + setState(283); + match(SysYParser::LPAREN); + setState(285); + _errHandler->sync(this); + + _la = _input->LA(1); + if ((((_la & ~ 0x3fULL) == 0) && + ((1ULL << _la) & 257983256576) != 0)) { + setState(284); + funcRParams(); + } + setState(287); + match(SysYParser::RPAREN); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- UnaryExpContext ------------------------------------------------------------------ + +SysYParser::UnaryExpContext::UnaryExpContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +SysYParser::PrimaryExpContext* SysYParser::UnaryExpContext::primaryExp() { + return getRuleContext(0); +} + +SysYParser::CallContext* SysYParser::UnaryExpContext::call() { + return getRuleContext(0); +} + +SysYParser::UnaryOpContext* SysYParser::UnaryExpContext::unaryOp() { + return getRuleContext(0); +} + +SysYParser::UnaryExpContext* SysYParser::UnaryExpContext::unaryExp() { + return getRuleContext(0); +} + + +size_t SysYParser::UnaryExpContext::getRuleIndex() const { + return SysYParser::RuleUnaryExp; +} + + +std::any SysYParser::UnaryExpContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitUnaryExp(this); + else + return visitor->visitChildren(this); +} + +SysYParser::UnaryExpContext* SysYParser::unaryExp() { + UnaryExpContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 46, SysYParser::RuleUnaryExp); + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + setState(294); + _errHandler->sync(this); + switch (getInterpreter()->adaptivePredict(_input, 29, _ctx)) { + case 1: { + enterOuterAlt(_localctx, 1); + setState(289); + primaryExp(); + break; + } + + case 2: { + enterOuterAlt(_localctx, 2); + setState(290); + call(); + break; + } + + case 3: { + enterOuterAlt(_localctx, 3); + setState(291); + unaryOp(); + setState(292); + unaryExp(); + break; + } + + default: + break; + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- UnaryOpContext ------------------------------------------------------------------ + +SysYParser::UnaryOpContext::UnaryOpContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* SysYParser::UnaryOpContext::ADD() { + return getToken(SysYParser::ADD, 0); +} + +tree::TerminalNode* SysYParser::UnaryOpContext::SUB() { + return getToken(SysYParser::SUB, 0); +} + +tree::TerminalNode* SysYParser::UnaryOpContext::NOT() { + return getToken(SysYParser::NOT, 0); +} + + +size_t SysYParser::UnaryOpContext::getRuleIndex() const { + return SysYParser::RuleUnaryOp; +} + + +std::any SysYParser::UnaryOpContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitUnaryOp(this); + else + return visitor->visitChildren(this); +} + +SysYParser::UnaryOpContext* SysYParser::unaryOp() { + UnaryOpContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 48, SysYParser::RuleUnaryOp); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(296); + _la = _input->LA(1); + if (!((((_la & ~ 0x3fULL) == 0) && + ((1ULL << _la) & 16783360) != 0))) { + _errHandler->recoverInline(this); + } + else { + _errHandler->reportMatch(this); + consume(); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- FuncRParamsContext ------------------------------------------------------------------ + +SysYParser::FuncRParamsContext::FuncRParamsContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +std::vector SysYParser::FuncRParamsContext::exp() { + return getRuleContexts(); +} + +SysYParser::ExpContext* SysYParser::FuncRParamsContext::exp(size_t i) { + return getRuleContext(i); +} + +std::vector SysYParser::FuncRParamsContext::COMMA() { + return getTokens(SysYParser::COMMA); +} + +tree::TerminalNode* SysYParser::FuncRParamsContext::COMMA(size_t i) { + return getToken(SysYParser::COMMA, i); +} + + +size_t SysYParser::FuncRParamsContext::getRuleIndex() const { + return SysYParser::RuleFuncRParams; +} + + +std::any SysYParser::FuncRParamsContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitFuncRParams(this); + else + return visitor->visitChildren(this); +} + +SysYParser::FuncRParamsContext* SysYParser::funcRParams() { + FuncRParamsContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 50, SysYParser::RuleFuncRParams); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(298); + exp(); + setState(303); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == SysYParser::COMMA) { + setState(299); + match(SysYParser::COMMA); + setState(300); + exp(); + setState(305); + _errHandler->sync(this); + _la = _input->LA(1); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- StringContext ------------------------------------------------------------------ + +SysYParser::StringContext::StringContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* SysYParser::StringContext::STRING() { + return getToken(SysYParser::STRING, 0); +} + + +size_t SysYParser::StringContext::getRuleIndex() const { + return SysYParser::RuleString; +} + + +std::any SysYParser::StringContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitString(this); + else + return visitor->visitChildren(this); +} + +SysYParser::StringContext* SysYParser::string() { + StringContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 52, SysYParser::RuleString); + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(306); + match(SysYParser::STRING); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- MulExpContext ------------------------------------------------------------------ + +SysYParser::MulExpContext::MulExpContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +std::vector SysYParser::MulExpContext::unaryExp() { + return getRuleContexts(); +} + +SysYParser::UnaryExpContext* SysYParser::MulExpContext::unaryExp(size_t i) { + return getRuleContext(i); +} + +std::vector SysYParser::MulExpContext::MUL() { + return getTokens(SysYParser::MUL); +} + +tree::TerminalNode* SysYParser::MulExpContext::MUL(size_t i) { + return getToken(SysYParser::MUL, i); +} + +std::vector SysYParser::MulExpContext::DIV() { + return getTokens(SysYParser::DIV); +} + +tree::TerminalNode* SysYParser::MulExpContext::DIV(size_t i) { + return getToken(SysYParser::DIV, i); +} + +std::vector SysYParser::MulExpContext::MOD() { + return getTokens(SysYParser::MOD); +} + +tree::TerminalNode* SysYParser::MulExpContext::MOD(size_t i) { + return getToken(SysYParser::MOD, i); +} + + +size_t SysYParser::MulExpContext::getRuleIndex() const { + return SysYParser::RuleMulExp; +} + + +std::any SysYParser::MulExpContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitMulExp(this); + else + return visitor->visitChildren(this); +} + +SysYParser::MulExpContext* SysYParser::mulExp() { + MulExpContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 54, SysYParser::RuleMulExp); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(308); + unaryExp(); + setState(313); + _errHandler->sync(this); + _la = _input->LA(1); + while ((((_la & ~ 0x3fULL) == 0) && + ((1ULL << _la) & 57344) != 0)) { + setState(309); + _la = _input->LA(1); + if (!((((_la & ~ 0x3fULL) == 0) && + ((1ULL << _la) & 57344) != 0))) { + _errHandler->recoverInline(this); + } + else { + _errHandler->reportMatch(this); + consume(); + } + setState(310); + unaryExp(); + setState(315); + _errHandler->sync(this); + _la = _input->LA(1); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- AddExpContext ------------------------------------------------------------------ + +SysYParser::AddExpContext::AddExpContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +std::vector SysYParser::AddExpContext::mulExp() { + return getRuleContexts(); +} + +SysYParser::MulExpContext* SysYParser::AddExpContext::mulExp(size_t i) { + return getRuleContext(i); +} + +std::vector SysYParser::AddExpContext::ADD() { + return getTokens(SysYParser::ADD); +} + +tree::TerminalNode* SysYParser::AddExpContext::ADD(size_t i) { + return getToken(SysYParser::ADD, i); +} + +std::vector SysYParser::AddExpContext::SUB() { + return getTokens(SysYParser::SUB); +} + +tree::TerminalNode* SysYParser::AddExpContext::SUB(size_t i) { + return getToken(SysYParser::SUB, i); +} + + +size_t SysYParser::AddExpContext::getRuleIndex() const { + return SysYParser::RuleAddExp; +} + + +std::any SysYParser::AddExpContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitAddExp(this); + else + return visitor->visitChildren(this); +} + +SysYParser::AddExpContext* SysYParser::addExp() { + AddExpContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 56, SysYParser::RuleAddExp); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(316); + mulExp(); + setState(321); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == SysYParser::ADD + + || _la == SysYParser::SUB) { + setState(317); + _la = _input->LA(1); + if (!(_la == SysYParser::ADD + + || _la == SysYParser::SUB)) { + _errHandler->recoverInline(this); + } + else { + _errHandler->reportMatch(this); + consume(); + } + setState(318); + mulExp(); + setState(323); + _errHandler->sync(this); + _la = _input->LA(1); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- RelExpContext ------------------------------------------------------------------ + +SysYParser::RelExpContext::RelExpContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +std::vector SysYParser::RelExpContext::addExp() { + return getRuleContexts(); +} + +SysYParser::AddExpContext* SysYParser::RelExpContext::addExp(size_t i) { + return getRuleContext(i); +} + +std::vector SysYParser::RelExpContext::LT() { + return getTokens(SysYParser::LT); +} + +tree::TerminalNode* SysYParser::RelExpContext::LT(size_t i) { + return getToken(SysYParser::LT, i); +} + +std::vector SysYParser::RelExpContext::GT() { + return getTokens(SysYParser::GT); +} + +tree::TerminalNode* SysYParser::RelExpContext::GT(size_t i) { + return getToken(SysYParser::GT, i); +} + +std::vector SysYParser::RelExpContext::LE() { + return getTokens(SysYParser::LE); +} + +tree::TerminalNode* SysYParser::RelExpContext::LE(size_t i) { + return getToken(SysYParser::LE, i); +} + +std::vector SysYParser::RelExpContext::GE() { + return getTokens(SysYParser::GE); +} + +tree::TerminalNode* SysYParser::RelExpContext::GE(size_t i) { + return getToken(SysYParser::GE, i); +} + + +size_t SysYParser::RelExpContext::getRuleIndex() const { + return SysYParser::RuleRelExp; +} + + +std::any SysYParser::RelExpContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitRelExp(this); + else + return visitor->visitChildren(this); +} + +SysYParser::RelExpContext* SysYParser::relExp() { + RelExpContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 58, SysYParser::RuleRelExp); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(324); + addExp(); + setState(329); + _errHandler->sync(this); + _la = _input->LA(1); + while ((((_la & ~ 0x3fULL) == 0) && + ((1ULL << _la) & 3932160) != 0)) { + setState(325); + _la = _input->LA(1); + if (!((((_la & ~ 0x3fULL) == 0) && + ((1ULL << _la) & 3932160) != 0))) { + _errHandler->recoverInline(this); + } + else { + _errHandler->reportMatch(this); + consume(); + } + setState(326); + addExp(); + setState(331); + _errHandler->sync(this); + _la = _input->LA(1); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- EqExpContext ------------------------------------------------------------------ + +SysYParser::EqExpContext::EqExpContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +std::vector SysYParser::EqExpContext::relExp() { + return getRuleContexts(); +} + +SysYParser::RelExpContext* SysYParser::EqExpContext::relExp(size_t i) { + return getRuleContext(i); +} + +std::vector SysYParser::EqExpContext::EQ() { + return getTokens(SysYParser::EQ); +} + +tree::TerminalNode* SysYParser::EqExpContext::EQ(size_t i) { + return getToken(SysYParser::EQ, i); +} + +std::vector SysYParser::EqExpContext::NE() { + return getTokens(SysYParser::NE); +} + +tree::TerminalNode* SysYParser::EqExpContext::NE(size_t i) { + return getToken(SysYParser::NE, i); +} + + +size_t SysYParser::EqExpContext::getRuleIndex() const { + return SysYParser::RuleEqExp; +} + + +std::any SysYParser::EqExpContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitEqExp(this); + else + return visitor->visitChildren(this); +} + +SysYParser::EqExpContext* SysYParser::eqExp() { + EqExpContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 60, SysYParser::RuleEqExp); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(332); + relExp(); + setState(337); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == SysYParser::EQ + + || _la == SysYParser::NE) { + setState(333); + _la = _input->LA(1); + if (!(_la == SysYParser::EQ + + || _la == SysYParser::NE)) { + _errHandler->recoverInline(this); + } + else { + _errHandler->reportMatch(this); + consume(); + } + setState(334); + relExp(); + setState(339); + _errHandler->sync(this); + _la = _input->LA(1); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- LAndExpContext ------------------------------------------------------------------ + +SysYParser::LAndExpContext::LAndExpContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +std::vector SysYParser::LAndExpContext::eqExp() { + return getRuleContexts(); +} + +SysYParser::EqExpContext* SysYParser::LAndExpContext::eqExp(size_t i) { + return getRuleContext(i); +} + +std::vector SysYParser::LAndExpContext::AND() { + return getTokens(SysYParser::AND); +} + +tree::TerminalNode* SysYParser::LAndExpContext::AND(size_t i) { + return getToken(SysYParser::AND, i); +} + + +size_t SysYParser::LAndExpContext::getRuleIndex() const { + return SysYParser::RuleLAndExp; +} + + +std::any SysYParser::LAndExpContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitLAndExp(this); + else + return visitor->visitChildren(this); +} + +SysYParser::LAndExpContext* SysYParser::lAndExp() { + LAndExpContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 62, SysYParser::RuleLAndExp); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(340); + eqExp(); + setState(345); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == SysYParser::AND) { + setState(341); + match(SysYParser::AND); + setState(342); + eqExp(); + setState(347); + _errHandler->sync(this); + _la = _input->LA(1); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- LOrExpContext ------------------------------------------------------------------ + +SysYParser::LOrExpContext::LOrExpContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +std::vector SysYParser::LOrExpContext::lAndExp() { + return getRuleContexts(); +} + +SysYParser::LAndExpContext* SysYParser::LOrExpContext::lAndExp(size_t i) { + return getRuleContext(i); +} + +std::vector SysYParser::LOrExpContext::OR() { + return getTokens(SysYParser::OR); +} + +tree::TerminalNode* SysYParser::LOrExpContext::OR(size_t i) { + return getToken(SysYParser::OR, i); +} + + +size_t SysYParser::LOrExpContext::getRuleIndex() const { + return SysYParser::RuleLOrExp; +} + + +std::any SysYParser::LOrExpContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitLOrExp(this); + else + return visitor->visitChildren(this); +} + +SysYParser::LOrExpContext* SysYParser::lOrExp() { + LOrExpContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 64, SysYParser::RuleLOrExp); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(348); + lAndExp(); + setState(353); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == SysYParser::OR) { + setState(349); + match(SysYParser::OR); + setState(350); + lAndExp(); + setState(355); + _errHandler->sync(this); + _la = _input->LA(1); + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- ConstExpContext ------------------------------------------------------------------ + +SysYParser::ConstExpContext::ConstExpContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +SysYParser::AddExpContext* SysYParser::ConstExpContext::addExp() { + return getRuleContext(0); +} + + +size_t SysYParser::ConstExpContext::getRuleIndex() const { + return SysYParser::RuleConstExp; +} + + +std::any SysYParser::ConstExpContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitConstExp(this); + else + return visitor->visitChildren(this); +} + +SysYParser::ConstExpContext* SysYParser::constExp() { + ConstExpContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 66, SysYParser::RuleConstExp); + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(356); + addExp(); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +void SysYParser::initialize() { +#if ANTLR4_USE_THREAD_LOCAL_CACHE + sysyParserInitialize(); +#else + ::antlr4::internal::call_once(sysyParserOnceFlag, sysyParserInitialize); +#endif +} diff --git a/src/SysYVisitor.cpp b/src/SysYVisitor.cpp new file mode 100644 index 0000000..a4bb3dc --- /dev/null +++ b/src/SysYVisitor.cpp @@ -0,0 +1,7 @@ + +// Generated from SysY.g4 by ANTLR 4.13.2 + + +#include "SysYVisitor.h" + + diff --git a/src/include/LLVMIRGenerator.h b/src/include/LLVMIRGenerator.h deleted file mode 100644 index e330a4f..0000000 --- a/src/include/LLVMIRGenerator.h +++ /dev/null @@ -1,78 +0,0 @@ -#pragma once -#include "SysYBaseVisitor.h" -#include "SysYParser.h" -#include "IR.h" -#include "IRBuilder.h" -#include -#include -#include -#include - -class LLVMIRGenerator : public SysYBaseVisitor { -public: - sysy::Module* getIRModule() const { return irModule.get(); } - - std::string generateIR(SysYParser::CompUnitContext* unit); - std::string getIR() const { return irStream.str(); } - -private: - std::unique_ptr irModule; // IR数据结构 - std::stringstream irStream; // 文本输出流 - sysy::IRBuilder irBuilder; // IR构建器 - int tempCounter = 0; - std::string currentVarType; - // std::map symbolTable; - std::map> symbolTable; - std::map tmpTable; - std::vector globalVars; - std::string currentFunction; - std::string currentReturnType; - std::vector breakStack; - std::vector continueStack; - bool hasReturn = false; - - struct LoopLabels { - std::string breakLabel; // break跳转的目标标签 - std::string continueLabel; // continue跳转的目标标签 - }; - std::stack loopStack; // 用于管理循环的break和continue标签 - std::string getNextTemp(); - std::string getLLVMType(const std::string&); - sysy::Type* getSysYType(const std::string&); - - bool inFunction = false; // 标识当前是否处于函数内部 - - // 访问方法 - std::any visitCompUnit(SysYParser::CompUnitContext* ctx); - std::any visitConstDecl(SysYParser::ConstDeclContext* ctx); - std::any visitVarDecl(SysYParser::VarDeclContext* ctx); - std::any visitVarDef(SysYParser::VarDefContext* ctx); - std::any visitFuncDef(SysYParser::FuncDefContext* ctx); - std::any visitBlockStmt(SysYParser::BlockStmtContext* ctx); - // std::any visitStmt(SysYParser::StmtContext* ctx); - std::any visitLValue(SysYParser::LValueContext* ctx); - std::any visitPrimaryExp(SysYParser::PrimaryExpContext* ctx); - std::any visitPrimExp(SysYParser::PrimExpContext* ctx); - std::any visitParenExp(SysYParser::ParenExpContext* ctx); - std::any visitNumber(SysYParser::NumberContext* ctx); - std::any visitString(SysYParser::StringContext* ctx); - std::any visitCall(SysYParser::CallContext *ctx); - std::any visitUnExp(SysYParser::UnExpContext* ctx); - std::any visitMulExp(SysYParser::MulExpContext* ctx); - std::any visitAddExp(SysYParser::AddExpContext* ctx); - std::any visitRelExp(SysYParser::RelExpContext* ctx); - std::any visitEqExp(SysYParser::EqExpContext* ctx); - std::any visitLAndExp(SysYParser::LAndExpContext* ctx); - std::any visitLOrExp(SysYParser::LOrExpContext* ctx); - std::any visitAssignStmt(SysYParser::AssignStmtContext *ctx) override; - std::any visitIfStmt(SysYParser::IfStmtContext *ctx) override; - std::any visitWhileStmt(SysYParser::WhileStmtContext *ctx) override; - std::any visitBreakStmt(SysYParser::BreakStmtContext *ctx) override; - std::any visitContinueStmt(SysYParser::ContinueStmtContext *ctx) override; - std::any visitReturnStmt(SysYParser::ReturnStmtContext *ctx) override; - - // 统一创建二元操作(同时生成数据结构和文本) - sysy::Value* createBinaryOp(SysYParser::ExpContext* lhs, - SysYParser::ExpContext* rhs, - sysy::Instruction::Kind opKind); -}; \ No newline at end of file diff --git a/src/RISCv64Backend.h b/src/include/RISCv64Backend.h similarity index 100% rename from src/RISCv64Backend.h rename to src/include/RISCv64Backend.h diff --git a/src/include/SysYBaseVisitor.h b/src/include/SysYBaseVisitor.h new file mode 100644 index 0000000..921cb09 --- /dev/null +++ b/src/include/SysYBaseVisitor.h @@ -0,0 +1,196 @@ + +// Generated from SysY.g4 by ANTLR 4.13.2 + +#pragma once + + +#include "antlr4-runtime.h" +#include "SysYVisitor.h" + + +/** + * This class provides an empty implementation of SysYVisitor, which can be + * extended to create a visitor which only needs to handle a subset of the available methods. + */ +class SysYBaseVisitor : public SysYVisitor { +public: + + virtual std::any visitCompUnit(SysYParser::CompUnitContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitGlobalConstDecl(SysYParser::GlobalConstDeclContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitGlobalVarDecl(SysYParser::GlobalVarDeclContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitDecl(SysYParser::DeclContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitConstDecl(SysYParser::ConstDeclContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitBType(SysYParser::BTypeContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitConstDef(SysYParser::ConstDefContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitConstScalarInitValue(SysYParser::ConstScalarInitValueContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitConstArrayInitValue(SysYParser::ConstArrayInitValueContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitVarDecl(SysYParser::VarDeclContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitVarDef(SysYParser::VarDefContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitScalarInitValue(SysYParser::ScalarInitValueContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitArrayInitValue(SysYParser::ArrayInitValueContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitFuncType(SysYParser::FuncTypeContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitFuncDef(SysYParser::FuncDefContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitFuncFParams(SysYParser::FuncFParamsContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitFuncFParam(SysYParser::FuncFParamContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitBlockStmt(SysYParser::BlockStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitBlockItem(SysYParser::BlockItemContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitAssignStmt(SysYParser::AssignStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitExpStmt(SysYParser::ExpStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitBlkStmt(SysYParser::BlkStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitIfStmt(SysYParser::IfStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitWhileStmt(SysYParser::WhileStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitBreakStmt(SysYParser::BreakStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitContinueStmt(SysYParser::ContinueStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitReturnStmt(SysYParser::ReturnStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitExp(SysYParser::ExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitCond(SysYParser::CondContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitLValue(SysYParser::LValueContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitPrimaryExp(SysYParser::PrimaryExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitNumber(SysYParser::NumberContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitCall(SysYParser::CallContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitUnaryExp(SysYParser::UnaryExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitUnaryOp(SysYParser::UnaryOpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitFuncRParams(SysYParser::FuncRParamsContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitString(SysYParser::StringContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitMulExp(SysYParser::MulExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitAddExp(SysYParser::AddExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitRelExp(SysYParser::RelExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitEqExp(SysYParser::EqExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitLAndExp(SysYParser::LAndExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitLOrExp(SysYParser::LOrExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitConstExp(SysYParser::ConstExpContext *ctx) override { + return visitChildren(ctx); + } + + +}; + diff --git a/src/include/SysYLexer.h b/src/include/SysYLexer.h new file mode 100644 index 0000000..1a2b6c2 --- /dev/null +++ b/src/include/SysYLexer.h @@ -0,0 +1,55 @@ + +// Generated from SysY.g4 by ANTLR 4.13.2 + +#pragma once + + +#include "antlr4-runtime.h" + + + + +class SysYLexer : public antlr4::Lexer { +public: + enum { + CONST = 1, INT = 2, FLOAT = 3, VOID = 4, IF = 5, ELSE = 6, WHILE = 7, + BREAK = 8, CONTINUE = 9, RETURN = 10, ADD = 11, SUB = 12, MUL = 13, + DIV = 14, MOD = 15, EQ = 16, NE = 17, LT = 18, LE = 19, GT = 20, GE = 21, + AND = 22, OR = 23, NOT = 24, ASSIGN = 25, COMMA = 26, SEMICOLON = 27, + LPAREN = 28, RPAREN = 29, LBRACE = 30, RBRACE = 31, LBRACK = 32, RBRACK = 33, + Ident = 34, ILITERAL = 35, FLITERAL = 36, STRING = 37, WS = 38, LINECOMMENT = 39, + BLOCKCOMMENT = 40 + }; + + explicit SysYLexer(antlr4::CharStream *input); + + ~SysYLexer() override; + + + std::string getGrammarFileName() const override; + + const std::vector& getRuleNames() const override; + + const std::vector& getChannelNames() const override; + + const std::vector& getModeNames() const override; + + const antlr4::dfa::Vocabulary& getVocabulary() const override; + + antlr4::atn::SerializedATNView getSerializedATN() const override; + + const antlr4::atn::ATN& getATN() const override; + + // By default the static state used to implement the lexer is lazily initialized during the first + // call to the constructor. You can call this function if you wish to initialize the static state + // ahead of time. + static void initialize(); + +private: + + // Individual action functions triggered by action() above. + + // Individual semantic predicate functions triggered by sempred() above. + +}; + diff --git a/src/include/SysYParser.h b/src/include/SysYParser.h new file mode 100644 index 0000000..203a8d9 --- /dev/null +++ b/src/include/SysYParser.h @@ -0,0 +1,808 @@ + +// Generated from SysY.g4 by ANTLR 4.13.2 + +#pragma once + + +#include "antlr4-runtime.h" + + + + +class SysYParser : public antlr4::Parser { +public: + enum { + CONST = 1, INT = 2, FLOAT = 3, VOID = 4, IF = 5, ELSE = 6, WHILE = 7, + BREAK = 8, CONTINUE = 9, RETURN = 10, ADD = 11, SUB = 12, MUL = 13, + DIV = 14, MOD = 15, EQ = 16, NE = 17, LT = 18, LE = 19, GT = 20, GE = 21, + AND = 22, OR = 23, NOT = 24, ASSIGN = 25, COMMA = 26, SEMICOLON = 27, + LPAREN = 28, RPAREN = 29, LBRACE = 30, RBRACE = 31, LBRACK = 32, RBRACK = 33, + Ident = 34, ILITERAL = 35, FLITERAL = 36, STRING = 37, WS = 38, LINECOMMENT = 39, + BLOCKCOMMENT = 40 + }; + + enum { + RuleCompUnit = 0, RuleGlobalDecl = 1, RuleDecl = 2, RuleConstDecl = 3, + RuleBType = 4, RuleConstDef = 5, RuleConstInitVal = 6, RuleVarDecl = 7, + RuleVarDef = 8, RuleInitVal = 9, RuleFuncType = 10, RuleFuncDef = 11, + RuleFuncFParams = 12, RuleFuncFParam = 13, RuleBlockStmt = 14, RuleBlockItem = 15, + RuleStmt = 16, RuleExp = 17, RuleCond = 18, RuleLValue = 19, RulePrimaryExp = 20, + RuleNumber = 21, RuleCall = 22, RuleUnaryExp = 23, RuleUnaryOp = 24, + RuleFuncRParams = 25, RuleString = 26, RuleMulExp = 27, RuleAddExp = 28, + RuleRelExp = 29, RuleEqExp = 30, RuleLAndExp = 31, RuleLOrExp = 32, + RuleConstExp = 33 + }; + + explicit SysYParser(antlr4::TokenStream *input); + + SysYParser(antlr4::TokenStream *input, const antlr4::atn::ParserATNSimulatorOptions &options); + + ~SysYParser() override; + + std::string getGrammarFileName() const override; + + const antlr4::atn::ATN& getATN() const override; + + const std::vector& getRuleNames() const override; + + const antlr4::dfa::Vocabulary& getVocabulary() const override; + + antlr4::atn::SerializedATNView getSerializedATN() const override; + + + class CompUnitContext; + class GlobalDeclContext; + class DeclContext; + class ConstDeclContext; + class BTypeContext; + class ConstDefContext; + class ConstInitValContext; + class VarDeclContext; + class VarDefContext; + class InitValContext; + class FuncTypeContext; + class FuncDefContext; + class FuncFParamsContext; + class FuncFParamContext; + class BlockStmtContext; + class BlockItemContext; + class StmtContext; + class ExpContext; + class CondContext; + class LValueContext; + class PrimaryExpContext; + class NumberContext; + class CallContext; + class UnaryExpContext; + class UnaryOpContext; + class FuncRParamsContext; + class StringContext; + class MulExpContext; + class AddExpContext; + class RelExpContext; + class EqExpContext; + class LAndExpContext; + class LOrExpContext; + class ConstExpContext; + + class CompUnitContext : public antlr4::ParserRuleContext { + public: + CompUnitContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + std::vector globalDecl(); + GlobalDeclContext* globalDecl(size_t i); + std::vector funcDef(); + FuncDefContext* funcDef(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + CompUnitContext* compUnit(); + + class GlobalDeclContext : public antlr4::ParserRuleContext { + public: + GlobalDeclContext(antlr4::ParserRuleContext *parent, size_t invokingState); + + GlobalDeclContext() = default; + void copyFrom(GlobalDeclContext *context); + using antlr4::ParserRuleContext::copyFrom; + + virtual size_t getRuleIndex() const override; + + + }; + + class GlobalConstDeclContext : public GlobalDeclContext { + public: + GlobalConstDeclContext(GlobalDeclContext *ctx); + + ConstDeclContext *constDecl(); + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + }; + + class GlobalVarDeclContext : public GlobalDeclContext { + public: + GlobalVarDeclContext(GlobalDeclContext *ctx); + + VarDeclContext *varDecl(); + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + }; + + GlobalDeclContext* globalDecl(); + + class DeclContext : public antlr4::ParserRuleContext { + public: + DeclContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + ConstDeclContext *constDecl(); + VarDeclContext *varDecl(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + DeclContext* decl(); + + class ConstDeclContext : public antlr4::ParserRuleContext { + public: + ConstDeclContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *CONST(); + BTypeContext *bType(); + std::vector constDef(); + ConstDefContext* constDef(size_t i); + antlr4::tree::TerminalNode *SEMICOLON(); + std::vector COMMA(); + antlr4::tree::TerminalNode* COMMA(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + ConstDeclContext* constDecl(); + + class BTypeContext : public antlr4::ParserRuleContext { + public: + BTypeContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *INT(); + antlr4::tree::TerminalNode *FLOAT(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + BTypeContext* bType(); + + class ConstDefContext : public antlr4::ParserRuleContext { + public: + ConstDefContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *Ident(); + antlr4::tree::TerminalNode *ASSIGN(); + ConstInitValContext *constInitVal(); + std::vector LBRACK(); + antlr4::tree::TerminalNode* LBRACK(size_t i); + std::vector constExp(); + ConstExpContext* constExp(size_t i); + std::vector RBRACK(); + antlr4::tree::TerminalNode* RBRACK(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + ConstDefContext* constDef(); + + class ConstInitValContext : public antlr4::ParserRuleContext { + public: + ConstInitValContext(antlr4::ParserRuleContext *parent, size_t invokingState); + + ConstInitValContext() = default; + void copyFrom(ConstInitValContext *context); + using antlr4::ParserRuleContext::copyFrom; + + virtual size_t getRuleIndex() const override; + + + }; + + class ConstScalarInitValueContext : public ConstInitValContext { + public: + ConstScalarInitValueContext(ConstInitValContext *ctx); + + ConstExpContext *constExp(); + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + }; + + class ConstArrayInitValueContext : public ConstInitValContext { + public: + ConstArrayInitValueContext(ConstInitValContext *ctx); + + antlr4::tree::TerminalNode *LBRACE(); + antlr4::tree::TerminalNode *RBRACE(); + std::vector constInitVal(); + ConstInitValContext* constInitVal(size_t i); + std::vector COMMA(); + antlr4::tree::TerminalNode* COMMA(size_t i); + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + }; + + ConstInitValContext* constInitVal(); + + class VarDeclContext : public antlr4::ParserRuleContext { + public: + VarDeclContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + BTypeContext *bType(); + std::vector varDef(); + VarDefContext* varDef(size_t i); + antlr4::tree::TerminalNode *SEMICOLON(); + std::vector COMMA(); + antlr4::tree::TerminalNode* COMMA(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + VarDeclContext* varDecl(); + + class VarDefContext : public antlr4::ParserRuleContext { + public: + VarDefContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *Ident(); + std::vector LBRACK(); + antlr4::tree::TerminalNode* LBRACK(size_t i); + std::vector constExp(); + ConstExpContext* constExp(size_t i); + std::vector RBRACK(); + antlr4::tree::TerminalNode* RBRACK(size_t i); + antlr4::tree::TerminalNode *ASSIGN(); + InitValContext *initVal(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + VarDefContext* varDef(); + + class InitValContext : public antlr4::ParserRuleContext { + public: + InitValContext(antlr4::ParserRuleContext *parent, size_t invokingState); + + InitValContext() = default; + void copyFrom(InitValContext *context); + using antlr4::ParserRuleContext::copyFrom; + + virtual size_t getRuleIndex() const override; + + + }; + + class ArrayInitValueContext : public InitValContext { + public: + ArrayInitValueContext(InitValContext *ctx); + + antlr4::tree::TerminalNode *LBRACE(); + antlr4::tree::TerminalNode *RBRACE(); + std::vector initVal(); + InitValContext* initVal(size_t i); + std::vector COMMA(); + antlr4::tree::TerminalNode* COMMA(size_t i); + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + }; + + class ScalarInitValueContext : public InitValContext { + public: + ScalarInitValueContext(InitValContext *ctx); + + ExpContext *exp(); + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + }; + + InitValContext* initVal(); + + class FuncTypeContext : public antlr4::ParserRuleContext { + public: + FuncTypeContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *VOID(); + antlr4::tree::TerminalNode *INT(); + antlr4::tree::TerminalNode *FLOAT(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + FuncTypeContext* funcType(); + + class FuncDefContext : public antlr4::ParserRuleContext { + public: + FuncDefContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + FuncTypeContext *funcType(); + antlr4::tree::TerminalNode *Ident(); + antlr4::tree::TerminalNode *LPAREN(); + antlr4::tree::TerminalNode *RPAREN(); + BlockStmtContext *blockStmt(); + FuncFParamsContext *funcFParams(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + FuncDefContext* funcDef(); + + class FuncFParamsContext : public antlr4::ParserRuleContext { + public: + FuncFParamsContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + std::vector funcFParam(); + FuncFParamContext* funcFParam(size_t i); + std::vector COMMA(); + antlr4::tree::TerminalNode* COMMA(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + FuncFParamsContext* funcFParams(); + + class FuncFParamContext : public antlr4::ParserRuleContext { + public: + FuncFParamContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + BTypeContext *bType(); + antlr4::tree::TerminalNode *Ident(); + std::vector LBRACK(); + antlr4::tree::TerminalNode* LBRACK(size_t i); + std::vector RBRACK(); + antlr4::tree::TerminalNode* RBRACK(size_t i); + std::vector exp(); + ExpContext* exp(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + FuncFParamContext* funcFParam(); + + class BlockStmtContext : public antlr4::ParserRuleContext { + public: + BlockStmtContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *LBRACE(); + antlr4::tree::TerminalNode *RBRACE(); + std::vector blockItem(); + BlockItemContext* blockItem(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + BlockStmtContext* blockStmt(); + + class BlockItemContext : public antlr4::ParserRuleContext { + public: + BlockItemContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + DeclContext *decl(); + StmtContext *stmt(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + BlockItemContext* blockItem(); + + class StmtContext : public antlr4::ParserRuleContext { + public: + StmtContext(antlr4::ParserRuleContext *parent, size_t invokingState); + + StmtContext() = default; + void copyFrom(StmtContext *context); + using antlr4::ParserRuleContext::copyFrom; + + virtual size_t getRuleIndex() const override; + + + }; + + class BlkStmtContext : public StmtContext { + public: + BlkStmtContext(StmtContext *ctx); + + BlockStmtContext *blockStmt(); + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + }; + + class WhileStmtContext : public StmtContext { + public: + WhileStmtContext(StmtContext *ctx); + + antlr4::tree::TerminalNode *WHILE(); + antlr4::tree::TerminalNode *LPAREN(); + CondContext *cond(); + antlr4::tree::TerminalNode *RPAREN(); + StmtContext *stmt(); + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + }; + + class IfStmtContext : public StmtContext { + public: + IfStmtContext(StmtContext *ctx); + + antlr4::tree::TerminalNode *IF(); + antlr4::tree::TerminalNode *LPAREN(); + CondContext *cond(); + antlr4::tree::TerminalNode *RPAREN(); + std::vector stmt(); + StmtContext* stmt(size_t i); + antlr4::tree::TerminalNode *ELSE(); + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + }; + + class AssignStmtContext : public StmtContext { + public: + AssignStmtContext(StmtContext *ctx); + + LValueContext *lValue(); + antlr4::tree::TerminalNode *ASSIGN(); + ExpContext *exp(); + antlr4::tree::TerminalNode *SEMICOLON(); + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + }; + + class BreakStmtContext : public StmtContext { + public: + BreakStmtContext(StmtContext *ctx); + + antlr4::tree::TerminalNode *BREAK(); + antlr4::tree::TerminalNode *SEMICOLON(); + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + }; + + class ExpStmtContext : public StmtContext { + public: + ExpStmtContext(StmtContext *ctx); + + antlr4::tree::TerminalNode *SEMICOLON(); + ExpContext *exp(); + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + }; + + class ReturnStmtContext : public StmtContext { + public: + ReturnStmtContext(StmtContext *ctx); + + antlr4::tree::TerminalNode *RETURN(); + antlr4::tree::TerminalNode *SEMICOLON(); + ExpContext *exp(); + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + }; + + class ContinueStmtContext : public StmtContext { + public: + ContinueStmtContext(StmtContext *ctx); + + antlr4::tree::TerminalNode *CONTINUE(); + antlr4::tree::TerminalNode *SEMICOLON(); + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + }; + + StmtContext* stmt(); + + class ExpContext : public antlr4::ParserRuleContext { + public: + ExpContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + AddExpContext *addExp(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + ExpContext* exp(); + + class CondContext : public antlr4::ParserRuleContext { + public: + CondContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + LOrExpContext *lOrExp(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + CondContext* cond(); + + class LValueContext : public antlr4::ParserRuleContext { + public: + LValueContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *Ident(); + std::vector LBRACK(); + antlr4::tree::TerminalNode* LBRACK(size_t i); + std::vector exp(); + ExpContext* exp(size_t i); + std::vector RBRACK(); + antlr4::tree::TerminalNode* RBRACK(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + LValueContext* lValue(); + + class PrimaryExpContext : public antlr4::ParserRuleContext { + public: + PrimaryExpContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *LPAREN(); + ExpContext *exp(); + antlr4::tree::TerminalNode *RPAREN(); + LValueContext *lValue(); + NumberContext *number(); + StringContext *string(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + PrimaryExpContext* primaryExp(); + + class NumberContext : public antlr4::ParserRuleContext { + public: + NumberContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *ILITERAL(); + antlr4::tree::TerminalNode *FLITERAL(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + NumberContext* number(); + + class CallContext : public antlr4::ParserRuleContext { + public: + CallContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *Ident(); + antlr4::tree::TerminalNode *LPAREN(); + antlr4::tree::TerminalNode *RPAREN(); + FuncRParamsContext *funcRParams(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + CallContext* call(); + + class UnaryExpContext : public antlr4::ParserRuleContext { + public: + UnaryExpContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + PrimaryExpContext *primaryExp(); + CallContext *call(); + UnaryOpContext *unaryOp(); + UnaryExpContext *unaryExp(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + UnaryExpContext* unaryExp(); + + class UnaryOpContext : public antlr4::ParserRuleContext { + public: + UnaryOpContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *ADD(); + antlr4::tree::TerminalNode *SUB(); + antlr4::tree::TerminalNode *NOT(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + UnaryOpContext* unaryOp(); + + class FuncRParamsContext : public antlr4::ParserRuleContext { + public: + FuncRParamsContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + std::vector exp(); + ExpContext* exp(size_t i); + std::vector COMMA(); + antlr4::tree::TerminalNode* COMMA(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + FuncRParamsContext* funcRParams(); + + class StringContext : public antlr4::ParserRuleContext { + public: + StringContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *STRING(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + StringContext* string(); + + class MulExpContext : public antlr4::ParserRuleContext { + public: + MulExpContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + std::vector unaryExp(); + UnaryExpContext* unaryExp(size_t i); + std::vector MUL(); + antlr4::tree::TerminalNode* MUL(size_t i); + std::vector DIV(); + antlr4::tree::TerminalNode* DIV(size_t i); + std::vector MOD(); + antlr4::tree::TerminalNode* MOD(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + MulExpContext* mulExp(); + + class AddExpContext : public antlr4::ParserRuleContext { + public: + AddExpContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + std::vector mulExp(); + MulExpContext* mulExp(size_t i); + std::vector ADD(); + antlr4::tree::TerminalNode* ADD(size_t i); + std::vector SUB(); + antlr4::tree::TerminalNode* SUB(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + AddExpContext* addExp(); + + class RelExpContext : public antlr4::ParserRuleContext { + public: + RelExpContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + std::vector addExp(); + AddExpContext* addExp(size_t i); + std::vector LT(); + antlr4::tree::TerminalNode* LT(size_t i); + std::vector GT(); + antlr4::tree::TerminalNode* GT(size_t i); + std::vector LE(); + antlr4::tree::TerminalNode* LE(size_t i); + std::vector GE(); + antlr4::tree::TerminalNode* GE(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + RelExpContext* relExp(); + + class EqExpContext : public antlr4::ParserRuleContext { + public: + EqExpContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + std::vector relExp(); + RelExpContext* relExp(size_t i); + std::vector EQ(); + antlr4::tree::TerminalNode* EQ(size_t i); + std::vector NE(); + antlr4::tree::TerminalNode* NE(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + EqExpContext* eqExp(); + + class LAndExpContext : public antlr4::ParserRuleContext { + public: + LAndExpContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + std::vector eqExp(); + EqExpContext* eqExp(size_t i); + std::vector AND(); + antlr4::tree::TerminalNode* AND(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + LAndExpContext* lAndExp(); + + class LOrExpContext : public antlr4::ParserRuleContext { + public: + LOrExpContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + std::vector lAndExp(); + LAndExpContext* lAndExp(size_t i); + std::vector OR(); + antlr4::tree::TerminalNode* OR(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + LOrExpContext* lOrExp(); + + class ConstExpContext : public antlr4::ParserRuleContext { + public: + ConstExpContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + AddExpContext *addExp(); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + ConstExpContext* constExp(); + + + // By default the static state used to implement the parser is lazily initialized during the first + // call to the constructor. You can call this function if you wish to initialize the static state + // ahead of time. + static void initialize(); + +private: +}; + diff --git a/src/include/SysYVisitor.h b/src/include/SysYVisitor.h new file mode 100644 index 0000000..8334475 --- /dev/null +++ b/src/include/SysYVisitor.h @@ -0,0 +1,112 @@ + +// Generated from SysY.g4 by ANTLR 4.13.2 + +#pragma once + + +#include "antlr4-runtime.h" +#include "SysYParser.h" + + + +/** + * This class defines an abstract visitor for a parse tree + * produced by SysYParser. + */ +class SysYVisitor : public antlr4::tree::AbstractParseTreeVisitor { +public: + + /** + * Visit parse trees produced by SysYParser. + */ + virtual std::any visitCompUnit(SysYParser::CompUnitContext *context) = 0; + + virtual std::any visitGlobalConstDecl(SysYParser::GlobalConstDeclContext *context) = 0; + + virtual std::any visitGlobalVarDecl(SysYParser::GlobalVarDeclContext *context) = 0; + + virtual std::any visitDecl(SysYParser::DeclContext *context) = 0; + + virtual std::any visitConstDecl(SysYParser::ConstDeclContext *context) = 0; + + virtual std::any visitBType(SysYParser::BTypeContext *context) = 0; + + virtual std::any visitConstDef(SysYParser::ConstDefContext *context) = 0; + + virtual std::any visitConstScalarInitValue(SysYParser::ConstScalarInitValueContext *context) = 0; + + virtual std::any visitConstArrayInitValue(SysYParser::ConstArrayInitValueContext *context) = 0; + + virtual std::any visitVarDecl(SysYParser::VarDeclContext *context) = 0; + + virtual std::any visitVarDef(SysYParser::VarDefContext *context) = 0; + + virtual std::any visitScalarInitValue(SysYParser::ScalarInitValueContext *context) = 0; + + virtual std::any visitArrayInitValue(SysYParser::ArrayInitValueContext *context) = 0; + + virtual std::any visitFuncType(SysYParser::FuncTypeContext *context) = 0; + + virtual std::any visitFuncDef(SysYParser::FuncDefContext *context) = 0; + + virtual std::any visitFuncFParams(SysYParser::FuncFParamsContext *context) = 0; + + virtual std::any visitFuncFParam(SysYParser::FuncFParamContext *context) = 0; + + virtual std::any visitBlockStmt(SysYParser::BlockStmtContext *context) = 0; + + virtual std::any visitBlockItem(SysYParser::BlockItemContext *context) = 0; + + virtual std::any visitAssignStmt(SysYParser::AssignStmtContext *context) = 0; + + virtual std::any visitExpStmt(SysYParser::ExpStmtContext *context) = 0; + + virtual std::any visitBlkStmt(SysYParser::BlkStmtContext *context) = 0; + + virtual std::any visitIfStmt(SysYParser::IfStmtContext *context) = 0; + + virtual std::any visitWhileStmt(SysYParser::WhileStmtContext *context) = 0; + + virtual std::any visitBreakStmt(SysYParser::BreakStmtContext *context) = 0; + + virtual std::any visitContinueStmt(SysYParser::ContinueStmtContext *context) = 0; + + virtual std::any visitReturnStmt(SysYParser::ReturnStmtContext *context) = 0; + + virtual std::any visitExp(SysYParser::ExpContext *context) = 0; + + virtual std::any visitCond(SysYParser::CondContext *context) = 0; + + virtual std::any visitLValue(SysYParser::LValueContext *context) = 0; + + virtual std::any visitPrimaryExp(SysYParser::PrimaryExpContext *context) = 0; + + virtual std::any visitNumber(SysYParser::NumberContext *context) = 0; + + virtual std::any visitCall(SysYParser::CallContext *context) = 0; + + virtual std::any visitUnaryExp(SysYParser::UnaryExpContext *context) = 0; + + virtual std::any visitUnaryOp(SysYParser::UnaryOpContext *context) = 0; + + virtual std::any visitFuncRParams(SysYParser::FuncRParamsContext *context) = 0; + + virtual std::any visitString(SysYParser::StringContext *context) = 0; + + virtual std::any visitMulExp(SysYParser::MulExpContext *context) = 0; + + virtual std::any visitAddExp(SysYParser::AddExpContext *context) = 0; + + virtual std::any visitRelExp(SysYParser::RelExpContext *context) = 0; + + virtual std::any visitEqExp(SysYParser::EqExpContext *context) = 0; + + virtual std::any visitLAndExp(SysYParser::LAndExpContext *context) = 0; + + virtual std::any visitLOrExp(SysYParser::LOrExpContext *context) = 0; + + virtual std::any visitConstExp(SysYParser::ConstExpContext *context) = 0; + + +}; +