// File: CobaltXII[P]cxcc/./parser/parser.hpp
// Function: parser_t::parse_statement()
statement_t* parse_statement() {
		token_t peek = input.peek();
		if (peek.type == tk_left_brace) {
			// Compound statement.
			std::vector<statement_t*> statements;
			expect(tk_left_brace);
			while (input.peek().type != tk_right_brace) {
				statements.push_back(parse_statement());
			}
			expect(tk_right_brace);
			return new statement_t({statements});
		} else if (peek.type == tk_if) {
			// Conditional statement.
			expect(tk_if);
			expect(tk_left_parenthesis);
			expression_t* condition = parse_expression();
			expect(tk_right_parenthesis);
			statement_t* body = parse_statement();
			return new statement_t((conditional_statement_t){condition, body});
		} else if (peek.type == tk_while) {
			// While statement.
			expect(tk_while);
			expect(tk_left_parenthesis);
			expression_t* condition = parse_expression();
			expect(tk_right_parenthesis);
			statement_t* body = parse_statement();
			return new statement_t((while_statement_t){condition, body});
		} else if (peek.type == tk_return) {
			// Return statement.
			expect(tk_return);
			expression_t* value = parse_expression();
			expect(tk_semicolon);
			return new statement_t((return_statement_t){value});
		} else if (peek.type == tk_int) {
			// Variable declaration statement.
			type_t type = parse_type();
			identifier_t identifier = parse_identifier();
			expression_t* initializer = nullptr;
			if (input.peek().type == tk_bi_assignment) {
				expect(tk_bi_assignment);
				initializer = parse_expression();
			}
			expect(tk_semicolon);
			return new statement_t({type, identifier, initializer});
		} else if (peek.type == tk_semicolon) {
			// No-op statement.
			expect(tk_semicolon);
			return new statement_t(st_no_op, STATEMENT_DEBUG);
		} else if (peek.type == tk_break) {
			// Break statement.
			expect(tk_break);
			return new statement_t(st_break, STATEMENT_DEBUG);
		} else if (peek.type == tk_continue) {
			// Continue statement.
			expect(tk_continue);
			return new statement_t(st_continue, STATEMENT_DEBUG);
		} else {
			// Expression statement.
			expression_t* expression = parse_expression();
			expect(tk_semicolon);
			return new statement_t((expression_statement_t){expression});
		}
	}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x630, %rsp            # imm = 0x630
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rsi
movq %rsi, -0x558(%rbp)
addq $0x20, %rsi
leaq -0x48(%rbp), %rdi
callq 0xd3a0
cmpl $0x10, -0x48(%rbp)
jne 0xfce5
leaq -0x60(%rbp), %rdi
callq 0xfab0
movq -0x558(%rbp), %rsi
leaq -0x98(%rbp), %rdi
movl $0x10, %edx
callq 0xe580
jmp 0xfb54
leaq -0x98(%rbp), %rdi
callq 0xb430
movq -0x558(%rbp), %rsi
addq $0x20, %rsi
leaq -0xe0(%rbp), %rdi
callq 0xd3a0
jmp 0xfb79
movl -0xe0(%rbp), %eax
movl %eax, -0x55c(%rbp)
leaq -0xe0(%rbp), %rdi
callq 0xb430
movl -0x55c(%rbp), %eax
cmpl $0x11, %eax
je 0xfbea
movq -0x558(%rbp), %rdi
callq 0xfb00
movq %rax, -0x568(%rbp)
jmp 0xfbb1
movq -0x568(%rbp), %rax
movq %rax, -0xe8(%rbp)
leaq -0x60(%rbp), %rdi
leaq -0xe8(%rbp), %rsi
callq 0xfad0
jmp 0xfbd1
jmp 0xfb60
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
jmp 0xfcd7
movq -0x558(%rbp), %rsi
leaq -0x120(%rbp), %rdi
movl $0x11, %edx
callq 0xe580
jmp 0xfc04
leaq -0x120(%rbp), %rdi
callq 0xb430
movl $0x90, %edi
callq 0x32e0
movq %rax, -0x570(%rbp)
jmp 0xfc23
movb $0x1, -0x139(%rbp)
leaq -0x138(%rbp), %rdi
leaq -0x60(%rbp), %rsi
callq 0x10f80
jmp 0xfc3c
movq -0x570(%rbp), %rdi
leaq -0x138(%rbp), %rsi
callq 0x11070
jmp 0xfc51
movq -0x570(%rbp), %rax
movb $0x0, -0x139(%rbp)
movq %rax, -0x8(%rbp)
leaq -0x138(%rbp), %rdi
callq 0x110f0
movl $0x1, -0x140(%rbp)
leaq -0x60(%rbp), %rdi
callq 0x105f0
jmp 0x105bb
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
jmp 0xfcb9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
leaq -0x138(%rbp), %rdi
callq 0x110f0
testb $0x1, -0x139(%rbp)
jne 0xfcc4
jmp 0xfcd5
movq -0x570(%rbp), %rdi
movl $0x90, %esi
callq 0x32f0
jmp 0xfcd7
leaq -0x60(%rbp), %rdi
callq 0x105f0
jmp 0x105d1
cmpl $0x5, -0x48(%rbp)
jne 0xfe4b
movq -0x558(%rbp), %rsi
leaq -0x178(%rbp), %rdi
movl $0x5, %edx
callq 0xe580
jmp 0xfd09
leaq -0x178(%rbp), %rdi
callq 0xb430
movq -0x558(%rbp), %rsi
leaq -0x1b0(%rbp), %rdi
movl $0xc, %edx
callq 0xe580
jmp 0xfd2f
leaq -0x1b0(%rbp), %rdi
callq 0xb430
movq -0x558(%rbp), %rdi
callq 0x11110
movq %rax, -0x578(%rbp)
jmp 0xfd50
movq -0x558(%rbp), %rsi
movq -0x578(%rbp), %rax
movq %rax, -0x1b8(%rbp)
leaq -0x1f0(%rbp), %rdi
movl $0xd, %edx
callq 0xe580
jmp 0xfd78
leaq -0x1f0(%rbp), %rdi
callq 0xb430
movq -0x558(%rbp), %rdi
callq 0xfb00
movq %rax, -0x580(%rbp)
jmp 0xfd99
movq -0x580(%rbp), %rax
movq %rax, -0x1f8(%rbp)
movl $0x90, %edi
callq 0x32e0
movq %rax, -0x588(%rbp)
jmp 0xfdba
movq -0x588(%rbp), %rdi
movq -0x1b8(%rbp), %rax
movq %rax, -0x208(%rbp)
movq -0x1f8(%rbp), %rax
movq %rax, -0x200(%rbp)
movq -0x208(%rbp), %rsi
movq -0x200(%rbp), %rdx
callq 0x11130
jmp 0xfdf2
movq -0x588(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x140(%rbp)
jmp 0x105bb
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
jmp 0x105d1
movq -0x588(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
movl $0x90, %esi
callq 0x32f0
jmp 0x105d1
cmpl $0x8, -0x48(%rbp)
jne 0xff9a
movq -0x558(%rbp), %rsi
leaq -0x240(%rbp), %rdi
movl $0x8, %edx
callq 0xe580
jmp 0xfe6f
leaq -0x240(%rbp), %rdi
callq 0xb430
movq -0x558(%rbp), %rsi
leaq -0x278(%rbp), %rdi
movl $0xc, %edx
callq 0xe580
jmp 0xfe95
leaq -0x278(%rbp), %rdi
callq 0xb430
movq -0x558(%rbp), %rdi
callq 0x11110
movq %rax, -0x590(%rbp)
jmp 0xfeb6
movq -0x558(%rbp), %rsi
movq -0x590(%rbp), %rax
movq %rax, -0x280(%rbp)
leaq -0x2b8(%rbp), %rdi
movl $0xd, %edx
callq 0xe580
jmp 0xfede
leaq -0x2b8(%rbp), %rdi
callq 0xb430
movq -0x558(%rbp), %rdi
callq 0xfb00
movq %rax, -0x598(%rbp)
jmp 0xfeff
movq -0x598(%rbp), %rax
movq %rax, -0x2c0(%rbp)
movl $0x90, %edi
callq 0x32e0
movq %rax, -0x5a0(%rbp)
jmp 0xff20
movq -0x5a0(%rbp), %rdi
movq -0x280(%rbp), %rax
movq %rax, -0x2d0(%rbp)
movq -0x2c0(%rbp), %rax
movq %rax, -0x2c8(%rbp)
movq -0x2d0(%rbp), %rsi
movq -0x2c8(%rbp), %rdx
callq 0x11190
jmp 0xff58
movq -0x5a0(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x140(%rbp)
jmp 0x105bb
movq -0x5a0(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
movl $0x90, %esi
callq 0x32f0
jmp 0x105d1
cmpl $0x9, -0x48(%rbp)
jne 0x1008b
movq -0x558(%rbp), %rsi
leaq -0x308(%rbp), %rdi
movl $0x9, %edx
callq 0xe580
jmp 0xffbe
leaq -0x308(%rbp), %rdi
callq 0xb430
movq -0x558(%rbp), %rdi
callq 0x11110
movq %rax, -0x5a8(%rbp)
jmp 0xffdf
movq -0x558(%rbp), %rsi
movq -0x5a8(%rbp), %rax
movq %rax, -0x310(%rbp)
leaq -0x348(%rbp), %rdi
movl $0x13, %edx
callq 0xe580
jmp 0x10007
leaq -0x348(%rbp), %rdi
callq 0xb430
movl $0x90, %edi
callq 0x32e0
movq %rax, -0x5b0(%rbp)
jmp 0x10026
movq -0x5b0(%rbp), %rdi
movq -0x310(%rbp), %rax
movq %rax, -0x350(%rbp)
movq -0x350(%rbp), %rsi
callq 0x111f0
jmp 0x10049
movq -0x5b0(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x140(%rbp)
jmp 0x105bb
movq -0x5b0(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
movl $0x90, %esi
callq 0x32f0
jmp 0x105d1
cmpl $0x6, -0x48(%rbp)
jne 0x10296
movq -0x558(%rbp), %rdi
callq 0xd420
movq %rax, -0x5b8(%rbp)
jmp 0x100aa
movq -0x558(%rbp), %rsi
movq -0x5b8(%rbp), %rax
movq %rax, -0x358(%rbp)
leaq -0x378(%rbp), %rdi
callq 0xd4e0
jmp 0x100cd
movq -0x558(%rbp), %rsi
movq $0x0, -0x380(%rbp)
addq $0x20, %rsi
leaq -0x3b8(%rbp), %rdi
callq 0xd3a0
jmp 0x100f1
movl -0x3b8(%rbp), %eax
movl %eax, -0x5bc(%rbp)
leaq -0x3b8(%rbp), %rdi
callq 0xb430
movl -0x5bc(%rbp), %eax
cmpl $0x16, %eax
jne 0x10176
movq -0x558(%rbp), %rsi
leaq -0x3f0(%rbp), %rdi
movl $0x16, %edx
callq 0xe580
jmp 0x1012e
leaq -0x3f0(%rbp), %rdi
callq 0xb430
movq -0x558(%rbp), %rdi
callq 0x11110
movq %rax, -0x5c8(%rbp)
jmp 0x1014f
movq -0x5c8(%rbp), %rax
movq %rax, -0x380(%rbp)
jmp 0x10176
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
jmp 0x10285
movq -0x558(%rbp), %rsi
leaq -0x428(%rbp), %rdi
movl $0x13, %edx
callq 0xe580
jmp 0x10190
leaq -0x428(%rbp), %rdi
callq 0xb430
movl $0x90, %edi
callq 0x32e0
movq %rax, -0x5d0(%rbp)
jmp 0x101af
movb $0x1, -0x459(%rbp)
movq -0x358(%rbp), %rax
movq %rax, -0x458(%rbp)
leaq -0x450(%rbp), %rdi
leaq -0x378(%rbp), %rsi
callq 0x3130
jmp 0x101d9
movq -0x5d0(%rbp), %rdi
movq -0x380(%rbp), %rax
movq %rax, -0x430(%rbp)
leaq -0x458(%rbp), %rsi
callq 0x11240
jmp 0x101fc
movq -0x5d0(%rbp), %rax
movb $0x0, -0x459(%rbp)
movq %rax, -0x8(%rbp)
leaq -0x458(%rbp), %rdi
callq 0x112c0
movl $0x1, -0x140(%rbp)
leaq -0x378(%rbp), %rdi
callq 0x31c0
jmp 0x105bb
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
jmp 0x10267
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
leaq -0x458(%rbp), %rdi
callq 0x112c0
testb $0x1, -0x459(%rbp)
jne 0x10272
jmp 0x10283
movq -0x5d0(%rbp), %rdi
movl $0x90, %esi
callq 0x32f0
jmp 0x10285
leaq -0x378(%rbp), %rdi
callq 0x31c0
jmp 0x105d1
cmpl $0x13, -0x48(%rbp)
jne 0x10364
movq -0x558(%rbp), %rsi
leaq -0x498(%rbp), %rdi
movl $0x13, %edx
callq 0xe580
jmp 0x102ba
leaq -0x498(%rbp), %rdi
callq 0xb430
movl $0x90, %edi
callq 0x32e0
movq %rax, -0x5d8(%rbp)
jmp 0x102d9
movq -0x20(%rbp), %rax
movq %rax, -0x5e8(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x5e0(%rbp)
leaq -0x40(%rbp), %rdi
callq 0x3420
movq -0x5d8(%rbp), %rdi
movq -0x5e8(%rbp), %rdx
movq %rax, %rcx
movq -0x5e0(%rbp), %rax
notq %rcx
addq %rax, %rcx
movl $0x5, %esi
callq 0x112e0
jmp 0x10322
movq -0x5d8(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x140(%rbp)
jmp 0x105bb
movq -0x5d8(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
movl $0x90, %esi
callq 0x32f0
jmp 0x105d1
cmpl $0xa, -0x48(%rbp)
jne 0x10432
movq -0x558(%rbp), %rsi
leaq -0x4d0(%rbp), %rdi
movl $0xa, %edx
callq 0xe580
jmp 0x10388
leaq -0x4d0(%rbp), %rdi
callq 0xb430
movl $0x90, %edi
callq 0x32e0
movq %rax, -0x5f0(%rbp)
jmp 0x103a7
movq -0x20(%rbp), %rax
movq %rax, -0x600(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x5f8(%rbp)
leaq -0x40(%rbp), %rdi
callq 0x3420
movq -0x5f0(%rbp), %rdi
movq -0x600(%rbp), %rdx
movq %rax, %rcx
movq -0x5f8(%rbp), %rax
notq %rcx
addq %rax, %rcx
movl $0x7, %esi
callq 0x112e0
jmp 0x103f0
movq -0x5f0(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x140(%rbp)
jmp 0x105bb
movq -0x5f0(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
movl $0x90, %esi
callq 0x32f0
jmp 0x105d1
cmpl $0xb, -0x48(%rbp)
jne 0x10500
movq -0x558(%rbp), %rsi
leaq -0x508(%rbp), %rdi
movl $0xb, %edx
callq 0xe580
jmp 0x10456
leaq -0x508(%rbp), %rdi
callq 0xb430
movl $0x90, %edi
callq 0x32e0
movq %rax, -0x608(%rbp)
jmp 0x10475
movq -0x20(%rbp), %rax
movq %rax, -0x618(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x610(%rbp)
leaq -0x40(%rbp), %rdi
callq 0x3420
movq -0x608(%rbp), %rdi
movq -0x618(%rbp), %rdx
movq %rax, %rcx
movq -0x610(%rbp), %rax
notq %rcx
addq %rax, %rcx
movl $0x8, %esi
callq 0x112e0
jmp 0x104be
movq -0x608(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x140(%rbp)
jmp 0x105bb
movq -0x608(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
movl $0x90, %esi
callq 0x32f0
jmp 0x105d1
movq -0x558(%rbp), %rdi
callq 0x11110
movq %rax, -0x620(%rbp)
jmp 0x10515
movq -0x558(%rbp), %rsi
movq -0x620(%rbp), %rax
movq %rax, -0x510(%rbp)
leaq -0x548(%rbp), %rdi
movl $0x13, %edx
callq 0xe580
jmp 0x1053d
leaq -0x548(%rbp), %rdi
callq 0xb430
movl $0x90, %edi
callq 0x32e0
movq %rax, -0x628(%rbp)
jmp 0x1055c
movq -0x628(%rbp), %rdi
movq -0x510(%rbp), %rax
movq %rax, -0x550(%rbp)
movq -0x550(%rbp), %rsi
callq 0x11340
jmp 0x1057f
movq -0x628(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x140(%rbp)
jmp 0x105bb
movq -0x628(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa0(%rbp)
movl %eax, -0xa4(%rbp)
movl $0x90, %esi
callq 0x32f0
jmp 0x105d1
leaq -0x48(%rbp), %rdi
callq 0xb430
movq -0x8(%rbp), %rax
addq $0x630, %rsp            # imm = 0x630
popq %rbp
retq
leaq -0x48(%rbp), %rdi
callq 0xb430
movq -0xa0(%rbp), %rdi
callq 0x34c0
nopw %cs:(%rax,%rax)