if statement
This commit is contained in:
parent
c3814eee26
commit
46fef543f9
@ -1716,6 +1716,30 @@ static AstNode *trans_while_loop(Context *c, AstNode *block, WhileStmt *stmt) {
|
|||||||
return while_node;
|
return while_node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static AstNode *trans_if_statement(Context *c, AstNode *block, IfStmt *stmt) {
|
||||||
|
// if (c) t
|
||||||
|
// if (c) t else e
|
||||||
|
AstNode *if_node = trans_create_node(c, NodeTypeIfBoolExpr);
|
||||||
|
|
||||||
|
// TODO: condition != 0
|
||||||
|
AstNode *condition_node = trans_expr(c, true, block, stmt->getCond(), TransRValue);
|
||||||
|
if (condition_node == nullptr)
|
||||||
|
return nullptr;
|
||||||
|
if_node->data.if_bool_expr.condition = condition_node;
|
||||||
|
|
||||||
|
if_node->data.if_bool_expr.then_block = trans_stmt(c, false, block, stmt->getThen(), TransRValue);
|
||||||
|
if (if_node->data.if_bool_expr.then_block == nullptr)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
if (stmt->getElse() != nullptr) {
|
||||||
|
if_node->data.if_bool_expr.else_node = trans_stmt(c, false, block, stmt->getElse(), TransRValue);
|
||||||
|
if (if_node->data.if_bool_expr.else_node == nullptr)
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return if_node;
|
||||||
|
}
|
||||||
|
|
||||||
static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
|
static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
|
||||||
Stmt::StmtClass sc = stmt->getStmtClass();
|
Stmt::StmtClass sc = stmt->getStmtClass();
|
||||||
switch (sc) {
|
switch (sc) {
|
||||||
@ -1741,6 +1765,9 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
|
|||||||
return trans_local_declaration(c, block, (DeclStmt *)stmt);
|
return trans_local_declaration(c, block, (DeclStmt *)stmt);
|
||||||
case Stmt::WhileStmtClass:
|
case Stmt::WhileStmtClass:
|
||||||
return trans_while_loop(c, block, (WhileStmt *)stmt);
|
return trans_while_loop(c, block, (WhileStmt *)stmt);
|
||||||
|
case Stmt::IfStmtClass:
|
||||||
|
return trans_if_statement(c, block, (IfStmt *)stmt);
|
||||||
|
|
||||||
case Stmt::CaseStmtClass:
|
case Stmt::CaseStmtClass:
|
||||||
emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
|
emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -2106,9 +2133,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
|
|||||||
case Stmt::GotoStmtClass:
|
case Stmt::GotoStmtClass:
|
||||||
emit_warning(c, stmt->getLocStart(), "TODO handle C GotoStmtClass");
|
emit_warning(c, stmt->getLocStart(), "TODO handle C GotoStmtClass");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
case Stmt::IfStmtClass:
|
|
||||||
emit_warning(c, stmt->getLocStart(), "TODO handle C IfStmtClass");
|
|
||||||
return nullptr;
|
|
||||||
case Stmt::IndirectGotoStmtClass:
|
case Stmt::IndirectGotoStmtClass:
|
||||||
emit_warning(c, stmt->getLocStart(), "TODO handle C IndirectGotoStmtClass");
|
emit_warning(c, stmt->getLocStart(), "TODO handle C IndirectGotoStmtClass");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user