diff --git a/src/ASTPrinter.h b/src/ASTPrinter.h index 6f787fa..8c55383 100644 --- a/src/ASTPrinter.h +++ b/src/ASTPrinter.h @@ -25,6 +25,15 @@ public: std::any visitFuncFParams(SysYParser::FuncFParamsContext *ctx) override; 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 visitExp(SysYParser::ExpContext *ctx) override; diff --git a/src/SysY.g4 b/src/SysY.g4 index 2a8361e..b3ed583 100644 --- a/src/SysY.g4 +++ b/src/SysY.g4 @@ -136,29 +136,29 @@ blockStmt: LBRACE blockItem* RBRACE; blockItem: decl | stmt; -stmt: lValue ASSIGN exp SEMICOLON - | exp? SEMICOLON - | blockStmt - | IF LPAREN cond RPAREN stmt (ELSE stmt)? - | WHILE LPAREN cond RPAREN stmt - | BREAK SEMICOLON - | CONTINUE SEMICOLON - | RETURN exp? SEMICOLON; +stmt: lValue ASSIGN exp SEMICOLON #assignStmt + | exp? SEMICOLON #expStmt + | blockStmt #blkStmt + | IF LPAREN cond RPAREN stmt (ELSE stmt)? #ifStmt + | WHILE LPAREN cond RPAREN stmt #whileStmt + | BREAK SEMICOLON #breakStmt + | CONTINUE SEMICOLON #continueStmt + | RETURN exp? SEMICOLON #returnStmt; exp: addExp; cond: lOrExp; lValue: Ident (LBRACK exp RBRACK)*; // 为了方便测试 primaryExp 可以是一个string -primaryExp: LPAREN exp RPAREN - | lValue - | number - | string; +primaryExp: LPAREN exp RPAREN #parenExp + | lValue #lVal + | number #num + | string #str; number: ILITERAL | FLITERAL; -unaryExp: primaryExp - | Ident LPAREN (funcRParams)? RPAREN - | unaryOp unaryExp; +unaryExp: primaryExp #primExp + | Ident LPAREN (funcRParams)? RPAREN #call + | unaryOp unaryExp #unExp; unaryOp: ADD|SUB|NOT; funcRParams: exp (COMMA exp)*;