// File: /workspace/github_c_makefile_star2_O1/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 0xc4e2(%rip), %r13      # 0x18e44
leaq 0x48(%rdi), %r15
leaq 0xc6f5(%rip), %r12      # 0x19062
movl 0x4(%rbx), %eax
cmpq $0xb, %rax
ja 0xcbaf
movslq (%r13,%rax,4), %rax
addq %r13, %rax
jmpq *%rax
movq 0x48(%r14), %rcx
movl $0x14, %esi
movl $0x1, %edx
leaq 0xc6b4(%rip), %rdi      # 0x1904d
callq 0x7280
movq 0x18(%rbx), %rsi
movq %r14, %rdi
callq 0xc947
movl 0x10(%rbx), %eax
testq %rax, %rax
je 0xca0b
movq (%r15), %rdi
leaq 0x147c4(%rip), %rcx     # 0x21180
movq (%rcx,%rax,8), %rdx
movq %r12, %rsi
jmp 0xca04
movq 0x48(%r14), %rcx
movl $0x18, %esi
movl $0x1, %edx
leaq 0xc777(%rip), %rdi      # 0x19151
callq 0x7280
movq 0x18(%rbx), %rsi
movq %r14, %rdi
callq 0xc947
movq 0x48(%r14), %rdi
movl 0x10(%rbx), %eax
leaq 0x14827(%rip), %rcx     # 0x21220
movq (%rcx,%rax,8), %rdx
leaq 0xc766(%rip), %rsi      # 0x1916a
xorl %eax, %eax
callq 0x7190
movq 0x20(%rbx), %rsi
jmp 0xcb25
movq 0x48(%r14), %rcx
movl $0x14, %esi
movl $0x1, %edx
leaq 0xc690(%rip), %rdi      # 0x190b9
jmp 0xcb1c
movq 0x48(%r14), %rcx
movl $0x14, %esi
movl $0x1, %edx
leaq 0xc6e1(%rip), %rdi      # 0x19124
callq 0x7280
movq 0x10(%rbx), %rsi
movq %r14, %rdi
callq 0xced9
movq 0x18(%rbx), %rsi
jmp 0xcb4d
movq 0x48(%r14), %rcx
movl $0x16, %esi
movl $0x1, %edx
leaq 0xc614(%rip), %rdi      # 0x19086
callq 0x7280
movq 0x10(%rbx), %rsi
movq %r14, %rdi
callq 0xcdc6
jmp 0xcba2
movq 0x48(%r14), %rcx
movl $0x1b, %esi
movl $0x1, %edx
leaq 0xc600(%rip), %rdi      # 0x1909d
callq 0x7280
movq 0x10(%rbx), %rsi
movq %r14, %rdi
callq 0xc8d7
jmp 0xcb01
movq 0x48(%r14), %rcx
movl $0x16, %esi
movl $0x1, %edx
leaq 0xc632(%rip), %rdi      # 0x190f7
jmp 0xcb1c
movq 0x48(%r14), %rcx
movl $0x13, %esi
movl $0x1, %edx
leaq 0xc596(%rip), %rdi      # 0x19072
callq 0x7280
movl 0x10(%rbx), %eax
testq %rax, %rax
je 0xcb01
movq (%r15), %rdi
leaq 0x1468d(%rip), %rcx     # 0x21180
movq (%rcx,%rax,8), %rdx
movq %r12, %rsi
xorl %eax, %eax
callq 0x7190
movq 0x18(%rbx), %rsi
jmp 0xcb25
movq 0x48(%r14), %rcx
movl $0x11, %esi
movl $0x1, %edx
leaq 0xc5b2(%rip), %rdi      # 0x190ce
callq 0x7280
movq 0x10(%rbx), %rsi
movq %r14, %rdi
callq 0xc947
jmp 0xcba2
movq 0x48(%r14), %rcx
movl $0x16, %esi
movl $0x1, %edx
leaq 0xc59c(%rip), %rdi      # 0x190e0
callq 0x7280
movq 0x10(%rbx), %rsi
movq %r14, %rdi
callq 0xced9
jmp 0xcba2
movq 0x48(%r14), %rcx
movl $0x17, %esi
movl $0x1, %edx
leaq 0xc5cd(%rip), %rdi      # 0x19139
callq 0x7280
movq 0x10(%rbx), %rsi
movq %r14, %rdi
callq 0xc8d7
jmp 0xcba2
movq 0x48(%r14), %rcx
movl $0x15, %esi
movl $0x1, %edx
leaq 0xc57a(%rip), %rdi      # 0x1910e
callq 0x7280
movq 0x10(%rbx), %rsi
testq %rsi, %rsi
jne 0xcb25
movq (%r15), %rsi
movl $0x5d, %edi
callq 0x7150
movq 0x8(%rbx), %rbx
testq %rbx, %rbx
jne 0xc96d
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq