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) {...@@ -1716,6 +1716,30 @@ static AstNode *trans_while_loop(Context *c, AstNode *block, WhileStmt *stmt) {
1716 return while_node;1716 return while_node;
1717}1717}
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
1719static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {1743static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
1720 Stmt::StmtClass sc = stmt->getStmtClass();1744 Stmt::StmtClass sc = stmt->getStmtClass();
1721 switch (sc) {1745 switch (sc) {
...@@ -1741,6 +1765,9 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s...@@ -1741,6 +1765,9 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
1741 return trans_local_declaration(c, block, (DeclStmt *)stmt);1765 return trans_local_declaration(c, block, (DeclStmt *)stmt);
1742 case Stmt::WhileStmtClass:1766 case Stmt::WhileStmtClass:
1743 return trans_while_loop(c, block, (WhileStmt *)stmt);1767 return trans_while_loop(c, block, (WhileStmt *)stmt);
1768 case Stmt::IfStmtClass:
1769 return trans_if_statement(c, block, (IfStmt *)stmt);
1770
1744 case Stmt::CaseStmtClass:1771 case Stmt::CaseStmtClass:
1745 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");1772 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
1746 return nullptr;1773 return nullptr;
...@@ -2106,9 +2133,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s...@@ -2106,9 +2133,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
2106 case Stmt::GotoStmtClass:2133 case Stmt::GotoStmtClass:
2107 emit_warning(c, stmt->getLocStart(), "TODO handle C GotoStmtClass");2134 emit_warning(c, stmt->getLocStart(), "TODO handle C GotoStmtClass");
2108 return nullptr;2135 return nullptr;
2109 case Stmt::IfStmtClass:
2110 emit_warning(c, stmt->getLocStart(), "TODO handle C IfStmtClass");
2111 return nullptr;
2112 case Stmt::IndirectGotoStmtClass:2136 case Stmt::IndirectGotoStmtClass:
2113 emit_warning(c, stmt->getLocStart(), "TODO handle C IndirectGotoStmtClass");2137 emit_warning(c, stmt->getLocStart(), "TODO handle C IndirectGotoStmtClass");
2114 return nullptr;2138 return nullptr;