(node: Node, parent: Node = None, cnt: int = 0)
| 42 | |
| 43 | |
| 44 | def tree_str(node: Node, parent: Node = None, cnt: int = 0): |
| 45 | left = None |
| 46 | right = None |
| 47 | |
| 48 | if node is None: |
| 49 | return '' |
| 50 | |
| 51 | if node.kind != NodeKind.FUN_CALL and node.left: |
| 52 | left = tree_str(node.left, node, cnt + |
| 53 | has_indent(node.left.kind) - (node.kind == NodeKind.END)) |
| 54 | if node.kind != NodeKind.FUN_CALL and node.right: |
| 55 | right = tree_str(node.right, node, cnt + |
| 56 | has_indent(node.right.kind) - (node.kind == NodeKind.END)) |
| 57 | |
| 58 | indent = ' ' * cnt |
| 59 | |
| 60 | if node.kind in (NodeKind.INT_LIT, NodeKind.CHAR_LIT): |
| 61 | return node.value |
| 62 | if node.kind in (NodeKind.TRUE_LIT, NodeKind.FALSE_LIT): |
| 63 | return color_str(Color.BLUE, node.value) |
| 64 | if node.kind == NodeKind.STR_LIT: |
| 65 | string = node.value.replace('\n', '\\n').replace( |
| 66 | '\t', '\\t').replace('\\end', 'end') |
| 67 | return string |
| 68 | if node.kind == NodeKind.IDENT: |
| 69 | return f'({color_str(Color.GREEN, rev_type_of_ident(node.value))})({node.value})' |
| 70 | if node.kind == NodeKind.OP_ADD: |
| 71 | return f'({left} + {right})' |
| 72 | if node.kind == NodeKind.OP_SUB: |
| 73 | return f'({left} - {right})' |
| 74 | if node.kind == NodeKind.OP_DIV: |
| 75 | return f'({left} / {right})' |
| 76 | if node.kind == NodeKind.OP_MOD: |
| 77 | return f'({left} % {right})' |
| 78 | if node.kind == NodeKind.OP_MULT: |
| 79 | return f'({left} * {right})' |
| 80 | if node.kind == NodeKind.OP_AND: |
| 81 | return f'({left} & {right})' |
| 82 | if node.kind == NodeKind.OP_OR: |
| 83 | return f'({left} | {right})' |
| 84 | if node.kind in (NodeKind.OP_ASSIGN, NodeKind.DECLARATION): |
| 85 | return f'({left} = {right})' |
| 86 | if node.kind == NodeKind.OP_GT: |
| 87 | return f'({left} > {right})' |
| 88 | if node.kind == NodeKind.OP_LT: |
| 89 | return f'({left} < {right})' |
| 90 | if node.kind == NodeKind.OP_EQ: |
| 91 | return f'({left} == {right})' |
| 92 | if node.kind == NodeKind.OP_LTE: |
| 93 | return f'({left} <= {right})' |
| 94 | if node.kind == NodeKind.OP_NEQ: |
| 95 | return f'({left} != {right})' |
| 96 | if node.kind == NodeKind.ARR_ACC: |
| 97 | return f'{left}[{right}]' |
| 98 | if node.kind == NodeKind.IF: |
| 99 | if right is not None: |
| 100 | return f'{color_str(Color.BLUE, "if")} {tree_str(node.middle)}\n {indent + left}\n{indent}{color_str(Color.BLUE, "else")}\n {indent + right}' |
| 101 | else: |
no test coverage detected