// File: /workspace/github_cpp_makefile_star2_O2/sighingnow[P]compile-pascal/pl0_parser.cpp
// Function: pl0_expression_fn(input_t*)
pair<int, pl0_ast_expression *> pl0_expression_fn(input_t *text) {
    auto res1 = ((~pl0_addop) + pl0_term)(text);
    pair<int, pl0_ast_expression *> ans;
    if (std::get<0>(res1) == -1) {
        auto vec = std::vector<std::pair<struct pl0_ast_addop *, struct pl0_ast_term *>>();
        ans = make_pair(-1, new pl0_ast_expression(text->locate(), vec));
    }
    else {
        std::pair<struct pl0_ast_addop *, struct pl0_ast_term *> head;
        int headlen = std::get<0>(res1);
        if (std::get<1>(res1).first == nullptr) {
            head = make_pair(new pl0_ast_addop(text->locate(), '+'), std::get<1>(res1).second); // default: '+'
        }
        else {
            head = std::get<1>(res1);
        }
        auto res2 = (++(pl0_addop + pl0_term))(text->drop(headlen));
        auto vec = std::get<1>(res2);
        vec.emplace(vec.begin(), head);
        ans = make_pair(headlen + std::get<0>(res2), new pl0_ast_expression(text->locate(), vec));
    }
    if (verbose) {
        cout << "parsing: Expression" << endl;
    }
    return ans;
}

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
subq $0x1c0, %rsp            # imm = 0x1C0
movq %rdi, %rbx
leaq 0x80173(%rip), %rsi     # 0x8c1e0
leaq 0x130(%rsp), %r14
movq %r14, %rdi
callq 0x1a468
leaq 0x7fff4(%rip), %rdx     # 0x8c078
leaq 0x20(%rsp), %rdi
movq %r14, %rsi
callq 0x1a3e4
leaq 0xb8(%rsp), %rdi
leaq 0x20(%rsp), %rsi
movq %rbx, %rdx
callq 0x13818
leaq 0x20(%rsp), %rdi
callq 0x13a8e
leaq 0x130(%rsp), %rdi
callq 0x1a55c
movl 0xe8(%rsp), %eax
xorps %xmm0, %xmm0
cmpl $-0x1, %eax
je 0xc0f1
movaps %xmm0, 0x10(%rsp)
movl %eax, 0xc(%rsp)
movq 0xd8(%rsp), %rax
testq %rax, %rax
je 0xc131
movq %rax, 0x10(%rsp)
movq 0xe0(%rsp), %rcx
jmp 0xc151
movaps %xmm0, 0x20(%rsp)
andq $0x0, 0x30(%rsp)
pushq $0x20
popq %rdi
callq 0x5260
movq %rax, %r14
movq 0x8(%rbx), %rax
movq %rax, (%r14)
movq %r14, %rdi
addq $0x8, %rdi
leaq 0x20(%rsp), %rsi
callq 0x13b28
leaq 0x20(%rsp), %rdi
callq 0x1d540
pushq $-0x1
popq %rbp
jmp 0xc225
pushq $0x10
popq %rdi
callq 0x5260
movq 0x8(%rbx), %rcx
movq %rcx, (%rax)
movb $0x2b, 0xc(%rax)
movq 0xe0(%rsp), %rcx
movq %rax, 0x10(%rsp)
movq %rcx, 0x18(%rsp)
leaq 0x80083(%rip), %rsi     # 0x8c1e0
leaq 0x7ff14(%rip), %rdx     # 0x8c078
leaq 0x130(%rsp), %rdi
callq 0x1a5b0
leaq 0x20(%rsp), %rdi
leaq 0x130(%rsp), %rsi
callq 0x1a576
leaq 0xc(%rsp), %rsi
movq %rbx, %rdi
callq 0x10b60
leaq 0xf0(%rsp), %rdi
leaq 0x20(%rsp), %rsi
movq %rax, %rdx
callq 0x13aa4
leaq 0x20(%rsp), %rdi
callq 0x13b12
leaq 0x130(%rsp), %rdi
callq 0x13b12
leaq 0x110(%rsp), %rsi
leaq 0x20(%rsp), %rdi
callq 0x13b28
leaq 0x20(%rsp), %rdi
movq (%rdi), %rsi
leaq 0x10(%rsp), %rdx
callq 0x2f1be
movl 0x128(%rsp), %ebp
addl 0xc(%rsp), %ebp
pushq $0x20
popq %rdi
callq 0x5260
movq %rax, %r14
movq 0x8(%rbx), %rax
movq %rax, (%r14)
movq %r14, %rdi
addq $0x8, %rdi
leaq 0x20(%rsp), %rsi
callq 0x13b28
leaq 0x20(%rsp), %rdi
callq 0x1d540
leaq 0xf0(%rsp), %rdi
callq 0x13b78
leaq 0xb8(%rsp), %rdi
callq 0x5120
movl %ebp, %eax
movq %r14, %rdx
addq $0x1c0, %rsp            # imm = 0x1C0
popq %rbx
popq %r14
popq %rbp
retq
jmp 0xc29c
movq %rax, %rbx
pushq $0x20
popq %rsi
movq %r14, %rdi
callq 0x5270
jmp 0xc258
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x1d540
jmp 0xc2dc
movq %rax, %rbx
pushq $0x20
popq %rsi
movq %r14, %rdi
callq 0x5270
jmp 0xc279
jmp 0xc276
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x1d540
jmp 0xc288
movq %rax, %rbx
leaq 0xf0(%rsp), %rdi
callq 0x13b78
jmp 0xc2dc
movq %rax, %rbx
jmp 0xc2cf
movq %rax, %rbx
jmp 0xc2dc
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x13a8e
jmp 0xc2b3
movq %rax, %rbx
leaq 0x130(%rsp), %rdi
callq 0x1a55c
jmp 0xc2e9
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x13b12
leaq 0x130(%rsp), %rdi
callq 0x13b12
leaq 0xb8(%rsp), %rdi
callq 0x5120
movq %rbx, %rdi
callq 0x53f0