authorgravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2017-09-20 21:16:49-07:00
committergravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2017-09-20 21:16:49-07:00
log46fef543f945bb2ddce32073c16b93a153a47754
tree4fd427854e1db0550e0dc68de678b5ef491640d9
parentc3814eee261a2e0a290f78271391df35c3d14b22

if statement


1 files changed, 27 insertions(+), 3 deletions(-)

src/parsec.cpp+27-3
......@@ -1716,6 +1716,30 @@ static AstNode *trans_while_loop(Context *c, AstNode *block, WhileStmt *stmt) {
17161716 return while_node;
17171717}
17181718
1719static AstNode *trans_if_statement(Context *c, AstNode *block, IfStmt *stmt) {
1720 // if (c) t
1721 // if (c) t else e
1722 AstNode *if_node = trans_create_node(c, NodeTypeIfBoolExpr);
1723
1724 // TODO: condition != 0
1725 AstNode *condition_node = trans_expr(c, true, block, stmt->getCond(), TransRValue);
1726 if (condition_node == nullptr)
1727 return nullptr;
1728 if_node->data.if_bool_expr.condition = condition_node;
1729
1730 if_node->data.if_bool_expr.then_block = trans_stmt(c, false, block, stmt->getThen(), TransRValue);
1731 if (if_node->data.if_bool_expr.then_block == nullptr)
1732 return nullptr;
1733
1734 if (stmt->getElse() != nullptr) {
1735 if_node->data.if_bool_expr.else_node = trans_stmt(c, false, block, stmt->getElse(), TransRValue);
1736 if (if_node->data.if_bool_expr.else_node == nullptr)
1737 return nullptr;
1738 }
1739
1740 return if_node;
1741}
1742
17191743static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
17201744 Stmt::StmtClass sc = stmt->getStmtClass();
17211745 switch (sc) {
......@@ -1741,6 +1765,9 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
17411765 return trans_local_declaration(c, block, (DeclStmt *)stmt);
17421766 case Stmt::WhileStmtClass:
17431767 return trans_while_loop(c, block, (WhileStmt *)stmt);
1768 case Stmt::IfStmtClass:
1769 return trans_if_statement(c, block, (IfStmt *)stmt);
1770
17441771 case Stmt::CaseStmtClass:
17451772 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
17461773 return nullptr;
......@@ -2106,9 +2133,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
21062133 case Stmt::GotoStmtClass:
21072134 emit_warning(c, stmt->getLocStart(), "TODO handle C GotoStmtClass");
21082135 return nullptr;
2109 case Stmt::IfStmtClass:
2110 emit_warning(c, stmt->getLocStart(), "TODO handle C IfStmtClass");
2111 return nullptr;
21122136 case Stmt::IndirectGotoStmtClass:
21132137 emit_warning(c, stmt->getLocStart(), "TODO handle C IndirectGotoStmtClass");
21142138 return nullptr;