// File: /workspace/github_c_makefile_star2_O2/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 0xba30(%rip), %r12      # 0x17e2c
pushq $0x1
popq %r13
pushq $0x5d
popq %r15
movl 0x4(%rbx), %eax
cmpq $0xb, %rax
ja 0xc616
movslq (%r12,%rax,4), %rax
addq %r12, %rax
jmpq *%rax
movq 0x48(%r14), %rcx
leaq 0xbc10(%rip), %rdi      # 0x18035
pushq $0x14
popq %rsi
movq %r13, %rdx
callq 0x7270
movq 0x18(%rbx), %rsi
movq %r14, %rdi
callq 0xc3e1
movl 0x10(%rbx), %eax
testq %rax, %rax
je 0xc49e
movq 0x48(%r14), %rdi
leaq 0x13d31(%rip), %rcx     # 0x20180
movq (%rcx,%rax,8), %rdx
leaq 0xbbf0(%rip), %rsi      # 0x1804a
jmp 0xc497
movq 0x48(%r14), %rcx
leaq 0xbcd2(%rip), %rdi      # 0x18139
pushq $0x18
popq %rsi
movq %r13, %rdx
callq 0x7270
movq 0x18(%rbx), %rsi
movq %r14, %rdi
callq 0xc3e1
movq 0x48(%r14), %rdi
movl 0x10(%rbx), %eax
leaq 0x13d94(%rip), %rcx     # 0x20220
movq (%rcx,%rax,8), %rdx
leaq 0xbcbb(%rip), %rsi      # 0x18152
xorl %eax, %eax
callq 0x7180
movq 0x20(%rbx), %rsi
jmp 0xc599
movq 0x48(%r14), %rcx
leaq 0xbbef(%rip), %rdi      # 0x180a1
pushq $0x14
jmp 0xc58c
movq 0x48(%r14), %rcx
leaq 0xbc48(%rip), %rdi      # 0x1810c
pushq $0x14
popq %rsi
movq %r13, %rdx
callq 0x7270
movq 0x10(%rbx), %rsi
movq %r14, %rdi
callq 0xc901
movq 0x18(%rbx), %rsi
jmp 0xc5bd
movq 0x48(%r14), %rcx
leaq 0xbb7f(%rip), %rdi      # 0x1806e
pushq $0x16
popq %rsi
movq %r13, %rdx
callq 0x7270
movq 0x10(%rbx), %rsi
movq %r14, %rdi
callq 0xc802
jmp 0xc60a
movq 0x48(%r14), %rcx
leaq 0xbb6f(%rip), %rdi      # 0x18085
pushq $0x1b
popq %rsi
movq %r13, %rdx
callq 0x7270
movq 0x10(%rbx), %rsi
movq %r14, %rdi
callq 0xc32c
jmp 0xc579
movq 0x48(%r14), %rcx
leaq 0xbba5(%rip), %rdi      # 0x180df
pushq $0x16
jmp 0xc58c
movq 0x48(%r14), %rcx
leaq 0xbb11(%rip), %rdi      # 0x1805a
pushq $0x13
popq %rsi
movq %r13, %rdx
callq 0x7270
movl 0x10(%rbx), %eax
testq %rax, %rax
je 0xc579
movq 0x48(%r14), %rdi
leaq 0x13c19(%rip), %rcx     # 0x20180
movq (%rcx,%rax,8), %rdx
leaq 0xbad8(%rip), %rsi      # 0x1804a
xorl %eax, %eax
callq 0x7180
movq 0x18(%rbx), %rsi
jmp 0xc599
movq 0x48(%r14), %rcx
leaq 0xbb2c(%rip), %rdi      # 0x180b6
pushq $0x11
popq %rsi
movq %r13, %rdx
callq 0x7270
movq 0x10(%rbx), %rsi
movq %r14, %rdi
callq 0xc3e1
jmp 0xc60a
movq 0x48(%r14), %rcx
leaq 0xbb1a(%rip), %rdi      # 0x180c8
pushq $0x16
popq %rsi
movq %r13, %rdx
callq 0x7270
movq 0x10(%rbx), %rsi
movq %r14, %rdi
callq 0xc901
jmp 0xc60a
movq 0x48(%r14), %rcx
leaq 0xbb4f(%rip), %rdi      # 0x18121
pushq $0x17
popq %rsi
movq %r13, %rdx
callq 0x7270
movq 0x10(%rbx), %rsi
movq %r14, %rdi
callq 0xc32c
jmp 0xc60a
movq 0x48(%r14), %rcx
leaq 0xbb00(%rip), %rdi      # 0x180f6
pushq $0x15
popq %rsi
movq %r13, %rdx
callq 0x7270
movq 0x10(%rbx), %rsi
testq %rsi, %rsi
jne 0xc599
movq 0x48(%r14), %rsi
movl %r15d, %edi
callq 0x7140
movq 0x8(%rbx), %rbx
testq %rbx, %rbx
jne 0xc404
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq