// File: /workspace/github_c_makefile_star2_O3/neosploit[P]compiler/ast_print.c
// Function: ast_expression_print
void ast_expression_print(AstPrintState* state, Expression* expression) {

    switch (expression->tag) {
        case EXPRESSION_BINARY:
            fprintf(state->fp, " [EXPRESSION_BINARY:");

            ast_expression_print(state, expression->binary.left_expression);
            if (expression->binary.operator != UNDEFINED) fprintf(state->fp, " (OPERATOR: %s)", OperatorString[expression->binary.operator]);
            ast_expression_print(state, expression->binary.right_expression);

            fprintf(state->fp, "]");

            break;
        case EXPRESSION_UNARY:
            fprintf(state->fp, " [EXPRESSION_UNARY:");

            if (expression->unary.operator != UNDEFINED) fprintf(state->fp, " (OPERATOR: %s)", OperatorString[expression->unary.operator]);
            ast_expression_print(state, expression->unary.expression);

            fprintf(state->fp, "]");

            break;
        case EXPRESSION_VARIABLE:
            fprintf(state->fp, " [EXPRESSION_VARIABLE:");

            ast_variable_print(state, expression->variable.variable);

            fprintf(state->fp, "]");

            break;
        case EXPRESSION_FUNCTION_CALL:
            fprintf(state->fp, " [EXPRESSION_FUNCTION_CALL:");

            ast_id_print(state, expression->function_call.id);
            ast_expression_print(state, expression->function_call.expressions);

            fprintf(state->fp, "]");

            break;
        case EXPRESSION_LENGTH:
            fprintf(state->fp, " [EXPRESSION_LENGTH:");

            ast_expression_print(state, expression->length.expression);

            fprintf(state->fp, "]");

            break;
        case EXPRESSION_NEW:
            fprintf(state->fp, " [EXPRESSION_NEW:");

            ast_expression_print(state, expression->new.expression);

            fprintf(state->fp, "]");

            break;
        case EXPRESSION_CONSTANT:
            fprintf(state->fp, " [EXPRESSION_CONSTANT:");

            ast_constant_print(state, expression->constant.constant);

            fprintf(state->fp, "]");

            break;
        case EXPRESSION_ENCLOSED:
            fprintf(state->fp, " [EXPRESSION_ENCLOSED:");

            ast_expression_print(state, expression->enclosed.expression);

            fprintf(state->fp, "]");

            break;
        case EXPRESSION_SETLIST:
            fprintf(state->fp, " [EXPRESSION_SETLIST:");

            if (expression->setlist.expression) ast_expression_print(state, expression->setlist.expression);

            fprintf(state->fp, "]");

            break;
        case EXPRESSION_LIMITS:
            fprintf(state->fp, " [EXPRESSION_LIMITS:");

            ast_constant_print(state, expression->limits.lower_limit);
            ast_constant_print(state, expression->limits.upper_limit);

            fprintf(state->fp, "]");

            break;
        case EXPRESSION_LIMITS_ID:
            fprintf(state->fp, " [EXPRESSION_LIMITS_ID:");

            ast_id_print(state, expression->limits_id.id);

            fprintf(state->fp, "]");

            break;
        case EXPRESSION_ITER_SPACE:
            fprintf(state->fp, " [EXPRESSION_ITER_SPACE:");

            ast_expression_print(state, expression->iter_space.initial_expression);
            fprintf(state->fp, " (ITER SPACE: %s)", IterSpaceString[expression->iter_space.iter_space]);
            ast_expression_print(state, expression->iter_space.final_expression);

            fprintf(state->fp, "]");
    }

    if (expression->next) ast_expression_print(state, expression->next);

}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rsi, %rbx
movq %rdi, %r14
leaq 0xc6f8(%rip), %r13      # 0x18e34
leaq 0xc7fb(%rip), %r15      # 0x18f3e
movl 0x4(%rbx), %eax
cmpq $0xb, %rax
ja 0xc9bf
movslq (%r13,%rax,4), %rax
addq %r13, %rax
jmpq *%rax
movq 0x48(%r14), %rcx
movl $0x14, %esi
movl $0x1, %edx
leaq 0xc8ce(%rip), %rdi      # 0x1903d
callq 0x7270
movq 0x18(%rbx), %rsi
movq %r14, %rdi
callq 0xc721
movl 0x10(%rbx), %eax
testq %rax, %rax
je 0xc7e6
movq 0x48(%r14), %rdi
leaq 0x139ed(%rip), %rcx     # 0x20180
movq (%rcx,%rax,8), %rdx
leaq 0xc8b4(%rip), %rsi      # 0x19052
jmp 0xc7df
movq 0x48(%r14), %rcx
movl $0x18, %esi
movl $0x1, %edx
leaq 0xc98c(%rip), %rdi      # 0x19141
callq 0x7270
movq 0x18(%rbx), %rsi
movq %r14, %rdi
callq 0xc721
movq 0x48(%r14), %rdi
movl 0x10(%rbx), %eax
leaq 0x13a4c(%rip), %rcx     # 0x20220
movq (%rcx,%rax,8), %rdx
leaq 0xc97b(%rip), %rsi      # 0x1915a
xorl %eax, %eax
callq 0x7180
movq 0x20(%rbx), %rsi
jmp 0xc919
movq 0x48(%r14), %rcx
movl $0x14, %esi
movl $0x1, %edx
leaq 0xc8a5(%rip), %rdi      # 0x190a9
jmp 0xc910
movq 0x48(%r14), %rcx
movl $0x14, %esi
movl $0x1, %edx
leaq 0xc8f6(%rip), %rdi      # 0x19114
callq 0x7270
movq 0x10(%rbx), %rsi
movq %r14, %rdi
callq 0xcd59
movq 0x18(%rbx), %rsi
jmp 0xc944
movq 0x48(%r14), %rcx
movl $0x16, %esi
movl $0x1, %edx
leaq 0xc829(%rip), %rdi      # 0x19076
callq 0x7270
movq 0x10(%rbx), %rsi
movq %r14, %rdi
callq 0xcc05
jmp 0xc9b1
movq 0x48(%r14), %rcx
movl $0x1b, %esi
movl $0x1, %edx
leaq 0xc815(%rip), %rdi      # 0x1908d
callq 0x7270
movq 0x10(%rbx), %r12
movq 0x48(%r14), %rdi
movq (%r12), %rdx
movq %r15, %rsi
xorl %eax, %eax
callq 0x7180
movq 0x8(%r12), %r12
testq %r12, %r12
jne 0xc881
jmp 0xc8f5
movq 0x48(%r14), %rcx
movl $0x16, %esi
movl $0x1, %edx
leaq 0xc833(%rip), %rdi      # 0x190e7
jmp 0xc910
movq 0x48(%r14), %rcx
movl $0x13, %esi
movl $0x1, %edx
leaq 0xc797(%rip), %rdi      # 0x19062
callq 0x7270
movl 0x10(%rbx), %eax
testq %rax, %rax
je 0xc8f5
movq 0x48(%r14), %rdi
leaq 0x1389d(%rip), %rcx     # 0x20180
movq (%rcx,%rax,8), %rdx
leaq 0xc764(%rip), %rsi      # 0x19052
xorl %eax, %eax
callq 0x7180
movq 0x18(%rbx), %rsi
jmp 0xc919
movq 0x48(%r14), %rcx
movl $0x11, %esi
movl $0x1, %edx
leaq 0xc7ae(%rip), %rdi      # 0x190be
callq 0x7270
movq 0x10(%rbx), %rsi
movq %r14, %rdi
callq 0xc721
jmp 0xc9b1
movq 0x48(%r14), %rcx
movl $0x16, %esi
movl $0x1, %edx
leaq 0xc795(%rip), %rdi      # 0x190d0
callq 0x7270
movq 0x10(%rbx), %rsi
movq %r14, %rdi
callq 0xcd59
jmp 0xc9b1
movq 0x48(%r14), %rcx
movl $0x17, %esi
movl $0x1, %edx
leaq 0xc7c6(%rip), %rdi      # 0x19129
callq 0x7270
movq 0x10(%rbx), %r12
movq 0x48(%r14), %rdi
movq (%r12), %rdx
movq %r15, %rsi
xorl %eax, %eax
callq 0x7180
movq 0x8(%r12), %r12
testq %r12, %r12
jne 0xc96c
jmp 0xc9b1
movq 0x48(%r14), %rcx
movl $0x15, %esi
movl $0x1, %edx
leaq 0xc75f(%rip), %rdi      # 0x190fe
callq 0x7270
movq 0x10(%rbx), %rsi
testq %rsi, %rsi
jne 0xc919
movq 0x48(%r14), %rsi
movl $0x5d, %edi
callq 0x7140
movq 0x8(%rbx), %rbx
testq %rbx, %rbx
jne 0xc743
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq