add file
This commit is contained in:
@@ -133,69 +133,58 @@ std::any ASTPrinter::visitBlockStmt(SysYParser::BlockStmtContext *ctx){
|
||||
}
|
||||
// std::any ASTPrinter::visitBlockItem(SysYParser::BlockItemContext *ctx);
|
||||
|
||||
std::any ASTPrinter::visitStmt(SysYParser::StmtContext *ctx){
|
||||
if(ctx->lValue()&& ctx->exp()) {
|
||||
cout << getIndent();
|
||||
ctx->lValue()->accept(this);
|
||||
cout << ' ' << ctx->ASSIGN()->getText() <<' ';
|
||||
std::any ASTPrinter::visitAssignStmt(SysYParser::AssignStmtContext *ctx){
|
||||
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){
|
||||
if (ctx->exp()) {
|
||||
ctx->exp()->accept(this);
|
||||
cout << ctx->SEMICOLON()->getText() << endl;
|
||||
}
|
||||
else if(ctx->blockStmt()){
|
||||
ctx->blockStmt()->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() << ' ';
|
||||
ctx->stmt(0)->accept(this);
|
||||
if (ctx->ELSE()) {
|
||||
cout << getIndent() << ctx->ELSE()->getText() << ' ';
|
||||
ctx->stmt(1)->accept(this);
|
||||
}
|
||||
else if(ctx->IF()){
|
||||
cout << getIndent() << "if (";
|
||||
ctx->cond()->accept(this);
|
||||
cout << ")";
|
||||
// visit ctx->stmt(0) to judge if it is a blockStmt or a Lvale=exp
|
||||
if(ctx->stmt(0)->blockStmt())ctx->stmt(0)->accept(this);
|
||||
else{
|
||||
cout << " {"<< endl;
|
||||
indentLevel++;
|
||||
ctx->stmt(0)->accept(this);
|
||||
indentLevel--;
|
||||
cout << getIndent() << "}" << endl;
|
||||
}
|
||||
if (ctx->stmt().size() > 1) {
|
||||
cout << getIndent() << "else";
|
||||
if(ctx->stmt(1)->blockStmt())ctx->stmt(1)->accept(this);
|
||||
else{
|
||||
cout << " {"<< endl;
|
||||
indentLevel++;
|
||||
ctx->stmt(1)->accept(this);
|
||||
indentLevel--;
|
||||
cout << getIndent() << "}" << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(ctx->WHILE()){
|
||||
cout << getIndent() << "while (";
|
||||
ctx->cond()->accept(this);
|
||||
cout << ")";
|
||||
if(ctx->stmt(0)->blockStmt())ctx->stmt(0)->accept(this);
|
||||
else{
|
||||
cout << " {"<< endl;
|
||||
indentLevel++;
|
||||
ctx->stmt(0)->accept(this);
|
||||
indentLevel--;
|
||||
cout << getIndent() << "}" << endl;
|
||||
}
|
||||
}
|
||||
else if(ctx->BREAK()){
|
||||
cout << getIndent() << "break;" << endl;
|
||||
}
|
||||
else if(ctx->CONTINUE()){
|
||||
cout << getIndent() << "continue;" << endl;
|
||||
}
|
||||
else if(ctx->RETURN()){
|
||||
cout << getIndent() << "return";
|
||||
if(ctx->exp()){
|
||||
cout << ' ';
|
||||
ctx->exp()->accept(this);
|
||||
}
|
||||
cout << ctx->SEMICOLON()->getText() << endl;
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -211,6 +200,12 @@ std::any ASTPrinter::visitLValue(SysYParser::LValueContext *ctx){
|
||||
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();
|
||||
@@ -222,28 +217,15 @@ std::any ASTPrinter::visitString(SysYParser::StringContext *ctx) {
|
||||
cout << ctx->STRING()->getText();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::any ASTPrinter::visitUnaryExp(SysYParser::UnaryExpContext *ctx){
|
||||
if(ctx->primaryExp())
|
||||
ctx->primaryExp()->accept(this);
|
||||
else if(ctx->Ident()){
|
||||
cout << ctx->Ident()->getText() << ctx->LPAREN()->getText();
|
||||
if(ctx->funcRParams())
|
||||
ctx->funcRParams()->accept(this);
|
||||
if (ctx->RPAREN())
|
||||
cout << ctx->RPAREN()->getText();
|
||||
else
|
||||
cout << "<missing \')\'?>";
|
||||
}
|
||||
else if(ctx->unaryExp()){
|
||||
cout << ctx->unaryOp()->getText();
|
||||
ctx->unaryExp()->accept(this);
|
||||
}
|
||||
else
|
||||
ctx->accept(this);
|
||||
// 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;
|
||||
}
|
||||
// std::any ASTPrinter::visitUnaryOp(SysYParser::UnaryOpContext *ctx);
|
||||
|
||||
any ASTPrinter::visitFuncRParams(SysYParser::FuncRParamsContext *ctx) {
|
||||
if (ctx->exp().empty())
|
||||
|
||||
@@ -26,23 +26,27 @@ public:
|
||||
std::any visitFuncFParam(SysYParser::FuncFParamContext *ctx) override;
|
||||
std::any visitBlockStmt(SysYParser::BlockStmtContext *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 visitBlockItem(SysYParser::BlockItemContext *ctx) override;
|
||||
std::any visitStmt(SysYParser::StmtContext *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 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;
|
||||
|
||||
@@ -77,7 +77,9 @@ private:
|
||||
std::unique_ptr<Module> module;
|
||||
IRBuilder builder;
|
||||
SymbolTable symbols_table;
|
||||
//array init use variables
|
||||
|
||||
static Type current_type;
|
||||
|
||||
int d = 0, n = 0;
|
||||
vector<int> path;
|
||||
bool isalloca;
|
||||
@@ -94,39 +96,42 @@ public:
|
||||
|
||||
public:
|
||||
std::any visitCompUnit(SysYParser::CompUnitContext *ctx) override;
|
||||
|
||||
std::any visitDecl(SysYParser::DeclContext *ctx) override;
|
||||
|
||||
std::any visitConstDecl(SysYParser::ConstDeclContext *ctx) override;
|
||||
|
||||
std::any visitBType(SysYParser::BTypeContext *ctx) override;
|
||||
|
||||
std::any visitConstDef(SysYParser::ConstDefContext *ctx) override;
|
||||
|
||||
std::any visitConstInitVal(SysYParser::ConstInitValContext *ctx) override;
|
||||
|
||||
std::any visitFuncType(SysYParser::FuncTypeContext* ctx) override;
|
||||
|
||||
std::any visitFuncDef(SysYParser::FuncDefContext* ctx) override;
|
||||
|
||||
|
||||
std::any visitVarDecl(SysYParser::VarDeclContext *ctx) override;
|
||||
|
||||
std::any visitVarDef(SysYParser::VarDefContext *ctx, Type* btype);
|
||||
|
||||
// std::any visitVarDef(SysYParser::VarDefContext *ctx) override;
|
||||
std::any visitInitVal(SysYParser::InitValContext *ctx) override;
|
||||
std::any visitFuncFParam(SysYParser::FuncFParamContext *ctx) override;
|
||||
|
||||
std::any visitFuncFParams(SysYParser::FuncFParamsContext *ctx) override;
|
||||
|
||||
std::any visitBlockStmt(SysYParser::BlockStmtContext* ctx) override;
|
||||
|
||||
std::any visitStmt(SysYParser::StmtContext *ctx) override;
|
||||
|
||||
std::any visitFuncRParams(SysYParser::FuncRParamsContext *ctx) override;
|
||||
|
||||
// std::any visitStmt(SysYParser::StmtContext *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 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 visitCall(SysYParser::CallContext *ctx) override;
|
||||
// std::any visitUnaryExp(SysYParser::UnaryExpContext *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;
|
||||
|
||||
private:
|
||||
std::any visitConstGlobalDecl(SysYParser::ConstDeclContext *ctx, Type* type);
|
||||
|
||||
Reference in New Issue
Block a user