diff --git a/src/ASTPrinter.cpp b/src/ASTPrinter.cpp deleted file mode 100644 index a29383e..0000000 --- a/src/ASTPrinter.cpp +++ /dev/null @@ -1,355 +0,0 @@ -#include -#include -using namespace std; -#include "ASTPrinter.h" -#include "SysYParser.h" - - -any ASTPrinter::visitCompUnit(SysYParser::CompUnitContext *ctx) { - if(ctx->decl().empty() && ctx->funcDef().empty()) - return nullptr; - for (auto dcl : ctx->decl()) {dcl->accept(this);cout << '\n';}cout << '\n'; - for (auto func : ctx->funcDef()) {func->accept(this);cout << "\n";} - return nullptr; -} - -// std::any ASTPrinter::visitBType(SysYParser::BTypeContext *ctx); -// std::any ASTPrinter::visitDecl(SysYParser::DeclContext *ctx); - -std::any ASTPrinter::visitConstDecl(SysYParser::ConstDeclContext *ctx) { - cout << getIndent() << ctx->CONST()->getText() << ' ' << ctx->bType()->getText() << ' '; - auto numConstDefs = ctx->constDef().size(); - ctx->constDef(0)->accept(this); - for (int i = 1; i < numConstDefs; ++i) { - cout << ctx->COMMA(i - 1)->getText() << ' '; - ctx->constDef(i)->accept(this); - } - cout << ctx->SEMICOLON()->getText() << '\n'; - return nullptr; -} - -std::any ASTPrinter::visitConstDef(SysYParser::ConstDefContext *ctx) { - cout << ctx->Ident()->getText(); - auto numConstExps = ctx->constExp().size(); - for (int i = 0; i < numConstExps; ++i) { - cout << ctx->LBRACK(i)->getText(); - ctx->constExp(i)->accept(this); - cout << ctx->RBRACK(i)->getText(); - } - cout << ' ' << ctx->ASSIGN()->getText() << ' '; - ctx->constInitVal()->accept(this); - return nullptr; -} - -// std::any ASTPrinter::visitConstInitVal(SysYParser::ConstInitValContext *ctx); - -std::any ASTPrinter::visitVarDecl(SysYParser::VarDeclContext *ctx){ - cout << getIndent() << ctx->bType()->getText() << ' '; - auto numVarDefs = ctx->varDef().size(); - ctx->varDef(0)->accept(this); - for (int i = 1; i < numVarDefs; ++i) { - cout << ", "; - ctx->varDef(i)->accept(this); - } - cout << ctx->SEMICOLON()->getText() << '\n'; - return nullptr; -} - -std::any ASTPrinter::visitVarDef(SysYParser::VarDefContext *ctx){ - cout << ctx->Ident()->getText(); - auto numConstExps = ctx->constExp().size(); - for (int i = 0; i < numConstExps; ++i) { - cout << ctx->LBRACK(i)->getText(); - ctx->constExp(i)->accept(this); - cout << ctx->RBRACK(i)->getText(); - } - if (ctx->initVal()) { - cout << ' ' << ctx->ASSIGN()->getText() << ' '; - ctx->initVal()->accept(this); - } - return nullptr; -} - -std::any ASTPrinter::visitInitVal(SysYParser::InitValContext *ctx){ - if (ctx->exp()) { - ctx->exp()->accept(this); - } else { - cout << ctx->LBRACE()->getText(); - auto numInitVals = ctx->initVal().size(); - ctx->initVal(0)->accept(this); - for (int i = 1; i < numInitVals; ++i) { - cout << ctx->COMMA(i - 1)->getText() << ' '; - ctx->initVal(i)->accept(this); - } - cout << ctx->RBRACE()->getText(); - } - return nullptr; -} - -std::any ASTPrinter::visitFuncDef(SysYParser::FuncDefContext *ctx){ - cout << getIndent() << ctx->funcType()->getText() << ' ' << ctx->Ident()->getText(); - cout << ctx->LPAREN()->getText(); - if (ctx->funcFParams()) ctx->funcFParams()->accept(this); - if(ctx->RPAREN()) - cout << ctx->RPAREN()->getText(); - else - cout << ""; - ctx->blockStmt()->accept(this); - return nullptr; -} - -// std::any ASTPrinter::visitFuncType(SysYParser::FuncTypeContext *ctx); - -std::any ASTPrinter::visitFuncFParams(SysYParser::FuncFParamsContext *ctx){ - auto numFuncFParams = ctx->funcFParam().size(); - ctx->funcFParam(0)->accept(this); - for (int i = 1; i < numFuncFParams; ++i) { - cout << ctx->COMMA(i - 1)->getText() << ' '; - ctx->funcFParam(i)->accept(this); - } - return nullptr; -} - -std::any ASTPrinter::visitFuncFParam(SysYParser::FuncFParamContext *ctx){ - cout << ctx->bType()->getText() << ' ' << ctx->Ident()->getText(); - if (!ctx->exp().empty()) { - cout << "[]"; - for (auto exp : ctx->exp()) { - cout << '['; - exp->accept(this); - cout << ']'; - } - } - return nullptr; -} - -std::any ASTPrinter::visitBlockStmt(SysYParser::BlockStmtContext *ctx){ - cout << ctx->LBRACE()->getText() << endl; - indentLevel++; - for (auto item : ctx->blockItem()) item->accept(this); - indentLevel--; - cout << getIndent() << ctx->RBRACE()->getText() << endl; - return nullptr; -} -// std::any ASTPrinter::visitBlockItem(SysYParser::BlockItemContext *ctx); - -std::any ASTPrinter::visitAssignStmt(SysYParser::AssignStmtContext *ctx){ - cout << getIndent(); - ctx->lValue()->accept(this); - cout << ' ' << ctx->ASSIGN()->getText() << ' '; - ctx->exp()->accept(this); - cout << ctx->SEMICOLON()->getText() << '\n'; - return nullptr; -} - -std::any ASTPrinter::visitExpStmt(SysYParser::ExpStmtContext *ctx){ - cout << getIndent(); - if (ctx->exp()) { - ctx->exp()->accept(this); - } - cout << ctx->SEMICOLON()->getText() << '\n'; - return nullptr; -} - -std::any ASTPrinter::visitIfStmt(SysYParser::IfStmtContext *ctx){ - cout << getIndent() << ctx->IF()->getText() << ' ' << ctx->LPAREN()->getText(); - ctx->cond()->accept(this); - cout << ctx->RPAREN()->getText() << ' '; - //格式化有问题 - if(ctx->stmt(0)) { - ctx->stmt(0)->accept(this); - } - else { - cout << '{' << endl; - indentLevel++; - ctx->stmt(0)->accept(this); - indentLevel--; - cout << getIndent() << '}' << endl; - } - if (ctx->ELSE()) { - cout << getIndent() << ctx->ELSE()->getText() << ' '; - ctx->stmt(1)->accept(this); - } - return nullptr; -} - -std::any ASTPrinter::visitWhileStmt(SysYParser::WhileStmtContext *ctx){ - cout << getIndent() << ctx->WHILE()->getText() << ' ' << ctx->LPAREN()->getText(); - ctx->cond()->accept(this); - cout << ctx->RPAREN()->getText() << ' '; - ctx->stmt()->accept(this); - return nullptr; -} - -std::any ASTPrinter::visitBreakStmt(SysYParser::BreakStmtContext *ctx){ - cout << getIndent() << ctx->BREAK()->getText() << ctx->SEMICOLON()->getText() << '\n'; - return nullptr; -} - -std::any ASTPrinter::visitContinueStmt(SysYParser::ContinueStmtContext *ctx){ - cout << getIndent() << ctx->CONTINUE()->getText() << ctx->SEMICOLON()->getText() << '\n'; - return nullptr; -} - -std::any ASTPrinter::visitReturnStmt(SysYParser::ReturnStmtContext *ctx){ - cout << getIndent() << ctx->RETURN()->getText() << ' '; - if (ctx->exp()) { - ctx->exp()->accept(this); - } - cout << ctx->SEMICOLON()->getText() << '\n'; - return nullptr; -} - -// std::any ASTPrinter::visitExp(SysYParser::ExpContext *ctx); -// std::any ASTPrinter::visitCond(SysYParser::CondContext *ctx); -std::any ASTPrinter::visitLValue(SysYParser::LValueContext *ctx){ - cout << ctx->Ident()->getText(); - for (auto exp : ctx->exp()) { - cout << "["; - exp->accept(this); - cout << "]"; - } - return nullptr; -} -// std::any ASTPrinter::visitPrimaryExp(SysYParser::PrimaryExpContext *ctx); -std::any ASTPrinter::visitParenExp(SysYParser::ParenExpContext *ctx){ - cout << ctx->LPAREN()->getText(); - ctx->exp()->accept(this); - cout << ctx->RPAREN()->getText(); - return nullptr; -} - -std::any ASTPrinter::visitNumber(SysYParser::NumberContext *ctx) { - if(ctx->ILITERAL())cout << ctx->ILITERAL()->getText(); - if(ctx->FLITERAL())cout << ctx->FLITERAL()->getText(); - return nullptr; -} - -std::any ASTPrinter::visitString(SysYParser::StringContext *ctx) { - cout << ctx->STRING()->getText(); - return nullptr; -} -// std::any visitUnaryExp(SysYParser::UnaryExpContext *ctx); -// std::any ASTPrinter::visitUnaryOp(SysYParser::UnaryOpContext *ctx); -std::any ASTPrinter::visitCall(SysYParser::CallContext *ctx){ - cout << ctx->Ident()->getText() << ctx->LPAREN()->getText(); - if(ctx->funcRParams()) - ctx->funcRParams()->accept(this); - cout << ctx->RPAREN()->getText(); - return nullptr; -} - -any ASTPrinter::visitFuncRParams(SysYParser::FuncRParamsContext *ctx) { - if (ctx->exp().empty()) - return nullptr; - auto numParams = ctx->exp().size(); - ctx->exp(0)->accept(this); - for (int i = 1; i < numParams; ++i) { - cout << ctx->COMMA(i - 1)->getText() << ' '; - ctx->exp(i)->accept(this); - } - return nullptr; -} - -std::any ASTPrinter::visitMulExp(SysYParser::MulExpContext *ctx){ - auto unaryExps = ctx->unaryExp(); - if (unaryExps.size() == 1) { - unaryExps[0]->accept(this); - } else { - for (size_t i = 0; i < unaryExps.size() - 1; ++i) { - auto opNode = dynamic_cast(ctx->children[2 * i + 1]); - if (opNode) { - unaryExps[i]->accept(this); - cout << " " << opNode->getText() << " "; - } - } - unaryExps.back()->accept(this); - } - return nullptr; -} - -std::any ASTPrinter::visitAddExp(SysYParser::AddExpContext *ctx){ - auto mulExps = ctx->mulExp(); - if (mulExps.size() == 1) { - mulExps[0]->accept(this); - } else { - for (size_t i = 0; i < mulExps.size() - 1; ++i) { - auto opNode = dynamic_cast(ctx->children[2 * i + 1]); - if (opNode) { - mulExps[i]->accept(this); - cout << " " << opNode->getText() << " "; - } - } - mulExps.back()->accept(this); - } - return nullptr; -} -// 以下表达式待补全形式同addexp mulexp -std::any ASTPrinter::visitRelExp(SysYParser::RelExpContext *ctx){ - auto relExps = ctx->addExp(); - if (relExps.size() == 1) { - relExps[0]->accept(this); - } else { - for (size_t i = 0; i < relExps.size() - 1; ++i) { - auto opNode = dynamic_cast(ctx->children[2 * i + 1]); - if (opNode) { - relExps[i]->accept(this); - cout << " " << opNode->getText() << " "; - } - } - relExps.back()->accept(this); - } - return nullptr; -} -std::any ASTPrinter::visitEqExp(SysYParser::EqExpContext *ctx){ - auto eqExps = ctx->relExp(); - if (eqExps.size() == 1) { - eqExps[0]->accept(this); - } else { - for (size_t i = 0; i < eqExps.size() - 1; ++i) { - auto opNode = dynamic_cast(ctx->children[2 * i + 1]); - if (opNode) { - eqExps[i]->accept(this); - cout << " " << opNode->getText() << " "; - } - } - eqExps.back()->accept(this); - } - return nullptr; -} -std::any ASTPrinter::visitLAndExp(SysYParser::LAndExpContext *ctx){ - auto lAndExps = ctx->eqExp(); - if (lAndExps.size() == 1) { - lAndExps[0]->accept(this); - } else { - for (size_t i = 0; i < lAndExps.size() - 1; ++i) { - auto opNode = dynamic_cast(ctx->children[2 * i + 1]); - if (opNode) { - lAndExps[i]->accept(this); - cout << " " << opNode->getText() << " "; - } - } - lAndExps.back()->accept(this); - } - return nullptr; -} -std::any ASTPrinter::visitLOrExp(SysYParser::LOrExpContext *ctx){ - auto lOrExps = ctx->lAndExp(); - if (lOrExps.size() == 1) { - lOrExps[0]->accept(this); - } else { - for (size_t i = 0; i < lOrExps.size() - 1; ++i) { - auto opNode = dynamic_cast(ctx->children[2 * i + 1]); - if (opNode) { - lOrExps[i]->accept(this); - cout << " " << opNode->getText() << " "; - } - } - lOrExps.back()->accept(this); - } - return nullptr; -} -std::any ASTPrinter::visitConstExp(SysYParser::ConstExpContext *ctx){ - ctx->addExp()->accept(this); - return nullptr; -} \ No newline at end of file diff --git a/src/include/ASTPrinter.h b/src/include/ASTPrinter.h deleted file mode 100644 index 31b4863..0000000 --- a/src/include/ASTPrinter.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include "SysYBaseVisitor.h" -#include "SysYParser.h" - -class ASTPrinter : public SysYBaseVisitor { -private: - int indentLevel = 0; - - std::string getIndent() { - return std::string(indentLevel * 4, ' '); - } -public: - std::any visitCompUnit(SysYParser::CompUnitContext *ctx) override; - // std::any visitBType(SysYParser::BTypeContext *ctx) override; - // std::any visitDecl(SysYParser::DeclContext *ctx) override; - std::any visitConstDecl(SysYParser::ConstDeclContext *ctx) override; - std::any visitConstDef(SysYParser::ConstDefContext *ctx) override; - // std::any visitConstInitVal(SysYParser::ConstInitValContext *ctx) override; - std::any visitVarDecl(SysYParser::VarDeclContext *ctx) override; - std::any visitVarDef(SysYParser::VarDefContext *ctx) override; - std::any visitInitVal(SysYParser::InitValContext *ctx) override; - std::any visitFuncDef(SysYParser::FuncDefContext *ctx) override; - // std::any visitFuncType(SysYParser::FuncTypeContext *ctx) override; - std::any visitFuncFParams(SysYParser::FuncFParamsContext *ctx) override; - std::any visitFuncFParam(SysYParser::FuncFParamContext *ctx) override; - std::any visitBlockStmt(SysYParser::BlockStmtContext *ctx) override; - - // std::any visitBlockItem(SysYParser::BlockItemContext *ctx) override; - // std::any visitStmt(SysYParser::StmtContext *ctx) override; - - std::any visitAssignStmt(SysYParser::AssignStmtContext *ctx) override; - std::any visitExpStmt(SysYParser::ExpStmtContext *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; - - // std::any visitExp(SysYParser::ExpContext *ctx) override; - // std::any visitCond(SysYParser::CondContext *ctx) override; - std::any visitLValue(SysYParser::LValueContext *ctx) override; - // std::any visitPrimaryExp(SysYParser::PrimaryExpContext *ctx) override; - std::any visitParenExp(SysYParser::ParenExpContext *ctx) override; - std::any visitNumber(SysYParser::NumberContext *ctx) override; - std::any visitString(SysYParser::StringContext *ctx) override; - // std::any visitUnaryExp(SysYParser::UnaryExpContext *ctx) override; - std::any visitCall(SysYParser::CallContext *ctx) override; - // std::any visitUnExpOp(SysYParser::UnExpContext *ctx) override; - // std::any visitUnaryOp(SysYParser::UnaryOpContext *ctx) override; - std::any visitFuncRParams(SysYParser::FuncRParamsContext *ctx) override; - std::any visitMulExp(SysYParser::MulExpContext *ctx) override; - std::any visitAddExp(SysYParser::AddExpContext *ctx) override; - std::any visitRelExp(SysYParser::RelExpContext *ctx) override; - std::any visitEqExp(SysYParser::EqExpContext *ctx) override; - std::any visitLAndExp(SysYParser::LAndExpContext *ctx) override; - std::any visitLOrExp(SysYParser::LOrExpContext *ctx) override; - std::any visitConstExp(SysYParser::ConstExpContext *ctx) override; -}; diff --git a/src/sysyc.cpp b/src/sysyc.cpp index b509fab..1328f55 100644 --- a/src/sysyc.cpp +++ b/src/sysyc.cpp @@ -70,12 +70,6 @@ int main(int argc, char **argv) { return EXIT_SUCCESS; } - // pretty format the input file - if (argFormat) { - ASTPrinter printer; - printer.visitCompUnit(moduleAST); - return EXIT_SUCCESS; - } // visit AST to generate IR