(self, add_predef: bool)
| 1618 | return node |
| 1619 | |
| 1620 | def if_statement(self, add_predef: bool) -> Optional[Node]: |
| 1621 | cond_node = self.token_list_to_tree() |
| 1622 | if cond_node.ntype not in (any_type, bool_type): |
| 1623 | print_error('if_statement', |
| 1624 | f'Expected a boolean expression, got type {rev_type_of(cond_node.ntype)}', self) |
| 1625 | |
| 1626 | self.next_line() |
| 1627 | cond_node = self.inject_cond(cond_node) |
| 1628 | end_node = Node(NodeKind.END, void_type, '') |
| 1629 | |
| 1630 | # TODO: Create a function to emulate this repeated behaviour |
| 1631 | predef = Def.predeferred |
| 1632 | Def.predeferred = None |
| 1633 | true_node = glue_statements([Node(NodeKind.IF, void_type, '', |
| 1634 | self.compound_statement(), None, cond_node), end_node]) |
| 1635 | Def.predeferred = predef |
| 1636 | |
| 1637 | elif_node = None |
| 1638 | if self.curr_token().kind == TokenKind.KW_ELIF: |
| 1639 | elif_node = self.elif_statement(add_predef) |
| 1640 | |
| 1641 | false_node = None |
| 1642 | if self.curr_token().kind == TokenKind.KW_ELSE: |
| 1643 | self.next_line() |
| 1644 | predef = Def.predeferred |
| 1645 | Def.predeferred = None |
| 1646 | false_node = glue_statements([Node(NodeKind.ELSE, void_type, '', |
| 1647 | self.compound_statement()), end_node]) |
| 1648 | Def.predeferred = predef |
| 1649 | |
| 1650 | nodes = [true_node] |
| 1651 | if elif_node is not None: |
| 1652 | nodes.append(elif_node) |
| 1653 | if false_node is not None: |
| 1654 | nodes.append(false_node) |
| 1655 | |
| 1656 | node = glue_statements(nodes) |
| 1657 | return node |
| 1658 | |
| 1659 | def ret_statement(self) -> Optional[Node]: |
| 1660 | if Def.macro_name != '': |
no test coverage detected