// File: /workspace/github_cpp_makefile_star2_O2/RuiDGPires[P]CrimLang/src/parser.cpp
// Function: ps_Tracker::statement()
void _ps_Tracker::statement(){
	if (accept(crl::Token::Type::SEMICLN))
		this->enter(crl::Node::Type::NONE);
	else if (accept(crl::Token::Type::IF)){
		this->enter(crl::Node::Type::IF);

		this->expect(crl::Token::Type::LPAREN);
		this->casted_expression();	
		this->expect(crl::Token::Type::RPAREN);

		this->enter(crl::Node::Type::THEN);
		if (accept(crl::Token::Type::LBRACK))
			this->block(crl::Token::Type::RBRACK);
		else
			this->statement();
		
		this->leave(); // LEAVE THEN

		if (accept(crl::Token::Type::ELSE)){
			this->enter(crl::Node::Type::ELSE);
			if (accept(crl::Token::Type::LBRACK))
				this->block(crl::Token::Type::RBRACK);
			else
				this->statement();
			this->leave();
		}
	}else if (accept(crl::Token::Type::WHILE)){
		this->enter(crl::Node::Type::WHILE);

		this->expect(crl::Token::Type::LPAREN);
		this->casted_expression();	
		this->expect(crl::Token::Type::RPAREN);

		if (accept(crl::Token::Type::LBRACK))
			this->block(crl::Token::Type::RBRACK);
		else
			this->statement();
	}else if (accept(crl::Token::Type::FOR)){
		this->enter(crl::Node::Type::FOR);
		this->expect(crl::Token::Type::LPAREN);
		this->statement();	
		if (this->previous().type != crl::Token::Type::SEMICLN)
			this->expect(crl::Token::Type::SEMICLN);

		this->expression();
		this->expect(crl::Token::Type::SEMICLN);
		this->expression();
		this->expect(crl::Token::Type::RPAREN);

		if (accept(crl::Token::Type::LBRACK))
			this->block(crl::Token::Type::RBRACK);
		else
			this->statement();
	}else if (accept(crl::Token::Type::RETURN)){
		this->enter(crl::Node::Type::RETURN);
		if (!accept(crl::Token::Type::SEMICLN)){
			this->expression();
			this->expect(crl::Token::Type::SEMICLN);
		}
	}else if (accept(crl::Token::Type::BREAK)){
		this->enter(crl::Node::Type::BREAK);
		this->expect(crl::Token::Type::SEMICLN);
	}else if (accept(crl::Token::Type::CONTINUE)){
		this->enter(crl::Node::Type::BREAK);
		this->annotate("continue");
		this->expect(crl::Token::Type::SEMICLN);
	}else if (accept(crl::Token::Type::IDENT)){
		if (this->current.type == crl::Token::Type::LPAREN){
			this->func_call();
			this->expect(crl::Token::Type::SEMICLN);
			return;
		}else if (this->current.type == crl::Token::Type::INC){
			this->enter(crl::Node::Type::INC);
			this->add(this->previous());
			this->next();
			this->expect(crl::Token::Type::SEMICLN);
		}else if (this->current.type == crl::Token::Type::DECR){
			this->enter(crl::Node::Type::DEC);
			this->add(this->previous());
			this->next();
			this->expect(crl::Token::Type::SEMICLN);
		}else if (this->current.type == crl::Token::Type::LSBR){
			this->enter(crl::Node::Type::ASSIGN);
			this->enter(crl::Node::Type::VECTOR);
			this->add(this->previous());
			this->next();
			EXP_AND_ADD(crl::Token::Type::INT);
			this->expect(crl::Token::Type::RSBR);
			this->leave();

			if (!IS_ASSIGN_TOK(this->current.type))
				throw crl::UnexpectedToken(this->current);

			this->annotate(parse_assign(this->current.type));
			this->next();
			this->expression();
			this->expect(crl::Token::Type::SEMICLN);
		}else if (IS_ASSIGN_TOK(this->current.type)){
			this->enter(crl::Node::Type::ASSIGN);
			this->annotate(parse_assign(this->current.type));
			this->add(this->previous());
			this->next();
			this->expression();
			this->expect(crl::Token::Type::SEMICLN);
		}else throw crl::UnexpectedToken(this->current);

	}else if (accept TYPE_SPEC()){
		this->enter(crl::Node::Type::INIT);
		if (this->current.type == crl::Token::Type::LSBR){
			this->enter(crl::Node::Type::VECTOR);
			this->add(this->previous());
			this->expect(crl::Token::Type::LSBR);
			EXP_AND_ADD(crl::Token::Type::INT);
			this->expect(crl::Token::Type::RSBR);
			this->leave();
		}else
			this->add(this->previous());

		// VAR INIT
		bool _mutable = accept(crl::Token::Type::MUT);
		if (_mutable)
			this->annotate("mut");

		EXP_AND_ADD(crl::Token::Type::IDENT);

		if (!_mutable){
			this->enter(crl::Node::Type::ASSIGN);
			expect(crl::Token::Type::BECOMES);
			if (accept(crl::Token::Type::LSBR)){
				this->enter(crl::Node::Type::VECTOR);
				if (!accept(crl::Token::Type::RSBR)){
					do{
						this->expression();
					}while(accept(crl::Token::Type::COMMA));
					expect(crl::Token::Type::RSBR);
				}
				this->leave();
			}else
				this->expression();
			this->leave();
		}else{
			if (accept(crl::Token::Type::BECOMES)){
				this->enter(crl::Node::Type::ASSIGN);
				this->expression();
				this->leave();
			}
		}
		
		expect(crl::Token::Type::SEMICLN);
	}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0x238, %rsp            # imm = 0x238
movq %rdi, %rbx
pushq $0x28
popq %rsi
callq 0xc450
testb %al, %al
je 0xd9fd
movq %rbx, %rdi
xorl %esi, %esi
callq 0xc678
movq 0x18(%rbx), %rax
movq 0x28(%rax), %rax
movq %rax, 0x18(%rbx)
addq $0x238, %rsp            # imm = 0x238
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
pushq $0x2
popq %rsi
movq %rbx, %rdi
callq 0xc450
testb %al, %al
je 0xda5c
pushq $0x7
popq %rsi
movq %rbx, %rdi
callq 0xc678
pushq $0x20
popq %rsi
movq %rbx, %rdi
callq 0xc522
movq %rbx, %rdi
callq 0xd052
pushq $0x21
popq %rsi
movq %rbx, %rdi
callq 0xc522
pushq $0x8
popq %rsi
movq %rbx, %rdi
callq 0xc678
pushq $0x24
popq %rsi
movq %rbx, %rdi
callq 0xc450
testb %al, %al
je 0xdab0
pushq $0x25
popq %rsi
movq %rbx, %rdi
callq 0xd97a
jmp 0xdab8
pushq $0x10
popq %rsi
movq %rbx, %rdi
callq 0xc450
testb %al, %al
je 0xdb05
pushq $0xb
popq %rsi
movq %rbx, %rdi
callq 0xc678
pushq $0x20
popq %rsi
movq %rbx, %rdi
callq 0xc522
movq %rbx, %rdi
callq 0xd052
pushq $0x21
popq %rsi
movq %rbx, %rdi
callq 0xc522
pushq $0x24
popq %rsi
movq %rbx, %rdi
callq 0xc450
testb %al, %al
je 0xdb95
jmp 0xdb85
movq %rbx, %rdi
callq 0xd9ba
movq 0x18(%rbx), %rax
movq 0x28(%rax), %rax
movq %rax, 0x18(%rbx)
pushq $0x3
popq %rsi
movq %rbx, %rdi
callq 0xc450
testb %al, %al
je 0xd9e3
pushq $0x9
popq %rsi
movq %rbx, %rdi
callq 0xc678
pushq $0x24
popq %rsi
movq %rbx, %rdi
callq 0xc450
testb %al, %al
je 0xdb97
pushq $0x25
popq %rsi
movq %rbx, %rdi
callq 0xd97a
jmp 0xdb9f
pushq $0xf
popq %rsi
movq %rbx, %rdi
callq 0xc450
testb %al, %al
je 0xdbb0
pushq $0xa
popq %rsi
movq %rbx, %rdi
callq 0xc678
pushq $0x20
popq %rsi
movq %rbx, %rdi
callq 0xc522
movq %rbx, %rdi
callq 0xd9ba
movq (%rbx), %rax
imulq $0x30, 0x28(%rbx), %rcx
cmpl $0x28, -0x10(%rax,%rcx)
je 0xdb50
pushq $0x28
popq %rsi
movq %rbx, %rdi
callq 0xc522
movq %rbx, %rdi
callq 0xc986
pushq $0x28
popq %rsi
movq %rbx, %rdi
callq 0xc522
movq %rbx, %rdi
callq 0xc986
pushq $0x21
popq %rsi
movq %rbx, %rdi
callq 0xc522
pushq $0x24
popq %rsi
movq %rbx, %rdi
callq 0xc450
testb %al, %al
je 0xdbea
pushq $0x25
popq %rsi
movq %rbx, %rdi
callq 0xd97a
jmp 0xd9e3
jmp 0xdbea
movq %rbx, %rdi
callq 0xd9ba
movq 0x18(%rbx), %rax
movq 0x28(%rax), %rax
movq %rax, 0x18(%rbx)
jmp 0xd9e3
pushq $0xc
popq %rsi
movq %rbx, %rdi
callq 0xc450
testb %al, %al
je 0xdbf7
pushq $0x16
popq %rsi
movq %rbx, %rdi
callq 0xc678
pushq $0x28
popq %rsi
movq %rbx, %rdi
callq 0xc450
testb %al, %al
jne 0xd9e3
movq %rbx, %rdi
callq 0xc986
jmp 0xdf98
movq %rbx, %rdi
callq 0xd9ba
jmp 0xd9e3
pushq $0xd
popq %rsi
movq %rbx, %rdi
callq 0xc450
testb %al, %al
je 0xdc16
pushq $0x17
popq %rsi
movq %rbx, %rdi
callq 0xc678
jmp 0xdf98
pushq $0xe
popq %rsi
movq %rbx, %rdi
callq 0xc450
testb %al, %al
je 0xdc5e
pushq $0x17
popq %rsi
movq %rbx, %rdi
callq 0xc678
leaq 0x7d49(%rip), %rsi      # 0x15980
leaq -0x60(%rbp), %rdi
leaq -0x19(%rbp), %rdx
callq 0x3be4
leaq -0x60(%rbp), %rsi
movq %rbx, %rdi
callq 0xc764
leaq -0x60(%rbp), %rdi
callq 0x3110
jmp 0xdf98
pushq $0x1
popq %rsi
movq %rbx, %rdi
callq 0xc450
testb %al, %al
je 0xdcf1
movl 0x58(%rbx), %eax
leal -0x2a(%rax), %ecx
cmpl $0x5, %ecx
jae 0xdf3d
pushq $0x6
popq %rsi
movq %rbx, %rdi
callq 0xc678
movl 0x58(%rbx), %esi
leaq -0x80(%rbp), %r14
movq %r14, %rdi
callq 0xe255
movq %rbx, %rdi
movq %r14, %rsi
callq 0xc764
leaq -0x80(%rbp), %rdi
callq 0x3110
movq (%rbx), %rax
imulq $0x30, 0x28(%rbx), %rcx
leaq (%rax,%rcx), %rsi
addq $-0x30, %rsi
leaq -0x190(%rbp), %r14
movq %r14, %rdi
callq 0xb24a
movq %rbx, %rdi
movq %r14, %rsi
callq 0xc776
leaq -0x190(%rbp), %rdi
callq 0x135f8
movq %rbx, %rdi
callq 0xc3e0
jmp 0xdbdd
subq $0x8, %rsp
pushq $0x5
popq %rdx
pushq $0x6
popq %rcx
pushq $0x7
popq %rsi
pushq $0x9
popq %r9
movq %rbx, %rdi
movl %esi, %r8d
xorl %eax, %eax
pushq $0xb
pushq $0xa
pushq $0x8
callq 0xc472
addq $0x20, %rsp
testb %al, %al
je 0xe11d
pushq $0x4
popq %rsi
movq %rbx, %rdi
callq 0xc678
cmpl $0x22, 0x58(%rbx)
jne 0xdddc
pushq $0x19
popq %rsi
movq %rbx, %rdi
callq 0xc678
movq (%rbx), %rax
imulq $0x30, 0x28(%rbx), %rcx
leaq (%rax,%rcx), %rsi
addq $-0x30, %rsi
leaq -0x160(%rbp), %r14
movq %r14, %rdi
callq 0xb24a
movq %rbx, %rdi
movq %r14, %rsi
callq 0xc776
leaq -0x160(%rbp), %rdi
callq 0x135f8
pushq $0x22
popq %rsi
movq %rbx, %rdi
callq 0xc522
pushq $0x13
popq %rsi
movq %rbx, %rdi
callq 0xc522
movq (%rbx), %rax
imulq $0x30, 0x28(%rbx), %rcx
leaq (%rax,%rcx), %rsi
addq $-0x30, %rsi
leaq -0x130(%rbp), %r14
movq %r14, %rdi
callq 0xb24a
movq %rbx, %rdi
movq %r14, %rsi
callq 0xc776
leaq -0x130(%rbp), %rdi
callq 0x135f8
pushq $0x23
popq %rsi
movq %rbx, %rdi
callq 0xc522
movq 0x18(%rbx), %rax
movq 0x28(%rax), %rax
movq %rax, 0x18(%rbx)
jmp 0xde12
movq (%rbx), %rax
imulq $0x30, 0x28(%rbx), %rcx
leaq (%rax,%rcx), %rsi
addq $-0x30, %rsi
leaq -0x100(%rbp), %r14
movq %r14, %rdi
callq 0xb24a
movq %rbx, %rdi
movq %r14, %rsi
callq 0xc776
leaq -0x100(%rbp), %rdi
callq 0x135f8
pushq $0x4
popq %rsi
movq %rbx, %rdi
callq 0xc450
movl %eax, %r14d
testb %al, %al
je 0xde4d
leaq 0x7625(%rip), %rsi      # 0x15450
leaq -0x40(%rbp), %rdi
leaq -0x19(%rbp), %rdx
callq 0x3be4
leaq -0x40(%rbp), %rsi
movq %rbx, %rdi
callq 0xc764
leaq -0x40(%rbp), %rdi
callq 0x3110
pushq $0x1
popq %rsi
movq %rbx, %rdi
callq 0xc522
movq (%rbx), %rax
imulq $0x30, 0x28(%rbx), %rcx
leaq (%rax,%rcx), %rsi
addq $-0x30, %rsi
leaq -0xd0(%rbp), %r15
movq %r15, %rdi
callq 0xb24a
movq %rbx, %rdi
movq %r15, %rsi
callq 0xc776
leaq -0xd0(%rbp), %rdi
callq 0x135f8
testb %r14b, %r14b
je 0xdec6
pushq $0x2a
popq %rsi
movq %rbx, %rdi
callq 0xc450
testb %al, %al
je 0xdf98
pushq $0x6
popq %rsi
movq %rbx, %rdi
callq 0xc678
movq %rbx, %rdi
callq 0xc986
leaq 0x18(%rbx), %rcx
movq 0x18(%rbx), %rax
jmp 0xdf91
pushq $0x6
popq %rsi
movq %rbx, %rdi
callq 0xc678
pushq $0x2a
popq %rsi
movq %rbx, %rdi
callq 0xc522
pushq $0x22
popq %rsi
movq %rbx, %rdi
callq 0xc450
testb %al, %al
je 0xdf81
pushq $0x19
popq %rsi
movq %rbx, %rdi
callq 0xc678
pushq $0x23
popq %rsi
movq %rbx, %rdi
callq 0xc450
testb %al, %al
jne 0xdf2f
pushq $0x29
popq %r14
movq %rbx, %rdi
callq 0xc986
movq %rbx, %rdi
movl %r14d, %esi
callq 0xc450
testb %al, %al
jne 0xdf0d
pushq $0x23
popq %rsi
movq %rbx, %rdi
callq 0xc522
movq 0x18(%rbx), %rax
movq 0x28(%rax), %rax
movq %rax, 0x18(%rbx)
jmp 0xdf8d
cmpl $0x18, %eax
je 0xe0cf
cmpl $0x19, %eax
je 0xdfa8
leaq 0x38(%rbx), %r14
cmpl $0x22, %eax
je 0xdfe9
cmpl $0x20, %eax
jne 0xe165
movq %rbx, %rdi
callq 0xc80a
pushq $0x28
popq %rsi
movq %rbx, %rdi
addq $0x238, %rsp            # imm = 0x238
popq %rbx
popq %r14
popq %r15
popq %rbp
jmp 0xc522
movq %rbx, %rdi
callq 0xc986
movq 0x18(%rbx), %rax
leaq 0x18(%rbx), %rcx
movq 0x28(%rax), %rax
movq %rax, (%rcx)
pushq $0x28
popq %rsi
movq %rbx, %rdi
callq 0xc522
jmp 0xd9e3
pushq $0x14
popq %rsi
movq %rbx, %rdi
callq 0xc678
movq (%rbx), %rax
imulq $0x30, 0x28(%rbx), %rcx
leaq (%rax,%rcx), %rsi
addq $-0x30, %rsi
leaq -0x220(%rbp), %r14
movq %r14, %rdi
callq 0xb24a
movq %rbx, %rdi
movq %r14, %rsi
callq 0xc776
leaq -0x220(%rbp), %rdi
jmp 0xe10b
pushq $0x6
popq %rsi
movq %rbx, %rdi
callq 0xc678
pushq $0x19
popq %rsi
movq %rbx, %rdi
callq 0xc678
movq (%rbx), %rax
imulq $0x30, 0x28(%rbx), %rcx
leaq (%rax,%rcx), %rsi
addq $-0x30, %rsi
leaq -0x1f0(%rbp), %r15
movq %r15, %rdi
callq 0xb24a
movq %rbx, %rdi
movq %r15, %rsi
callq 0xc776
leaq -0x1f0(%rbp), %rdi
callq 0x135f8
movq %rbx, %rdi
callq 0xc3e0
pushq $0x13
popq %rsi
movq %rbx, %rdi
callq 0xc522
movq (%rbx), %rax
imulq $0x30, 0x28(%rbx), %rcx
leaq (%rax,%rcx), %rsi
addq $-0x30, %rsi
leaq -0x1c0(%rbp), %r15
movq %r15, %rdi
callq 0xb24a
movq %rbx, %rdi
movq %r15, %rsi
callq 0xc776
leaq -0x1c0(%rbp), %rdi
callq 0x135f8
pushq $0x23
popq %rsi
movq %rbx, %rdi
callq 0xc522
movq 0x18(%rbx), %rax
movq 0x28(%rax), %rax
movq %rax, 0x18(%rbx)
movl 0x58(%rbx), %esi
leal -0x2a(%rsi), %eax
cmpl $0x5, %eax
jae 0xe14d
leaq -0xa0(%rbp), %r14
movq %r14, %rdi
callq 0xe255
movq %rbx, %rdi
movq %r14, %rsi
callq 0xc764
leaq -0xa0(%rbp), %rdi
callq 0x3110
jmp 0xdce4
pushq $0x13
popq %rsi
movq %rbx, %rdi
callq 0xc678
movq (%rbx), %rax
imulq $0x30, 0x28(%rbx), %rcx
leaq (%rax,%rcx), %rsi
addq $-0x30, %rsi
leaq -0x250(%rbp), %r14
movq %r14, %rdi
callq 0xb24a
movq %rbx, %rdi
movq %r14, %rsi
callq 0xc776
leaq -0x250(%rbp), %rdi
callq 0x135f8
movq %rbx, %rdi
callq 0xc3e0
jmp 0xdf98
pushq $0x50
popq %rdi
callq 0x3140
movq %rax, %r14
addq $0x38, %rbx
movq %rax, %rdi
movq %rbx, %rsi
callq 0x4de0
leaq 0xfc22(%rip), %rsi      # 0x1dd60
leaq -0x920d(%rip), %rdx     # 0x4f38
movq %r14, %rdi
callq 0x33f0
pushq $0x50
popq %rdi
callq 0x3140
movq %rax, %r15
movq %rax, %rdi
movq %r14, %rsi
callq 0x4de0
jmp 0xe17b
pushq $0x50
popq %rdi
callq 0x3140
movq %rax, %r15
movq %rax, %rdi
movq %r14, %rsi
callq 0x4de0
leaq 0xfbde(%rip), %rsi      # 0x1dd60
leaq -0x9251(%rip), %rdx     # 0x4f38
movq %r15, %rdi
callq 0x33f0
jmp 0xe193
movq %rax, %rbx
movq %r15, %rdi
jmp 0xe20f
movq %rax, %rbx
leaq -0xa0(%rbp), %rdi
jmp 0xe243
movq %rax, %rbx
leaq -0x1c0(%rbp), %rdi
jmp 0xe235
movq %rax, %rbx
leaq -0x250(%rbp), %rdi
jmp 0xe235
movq %rax, %rbx
leaq -0x1f0(%rbp), %rdi
jmp 0xe235
movq %rax, %rbx
leaq -0x220(%rbp), %rdi
jmp 0xe235
movq %rax, %rbx
leaq -0x40(%rbp), %rdi
jmp 0xe243
jmp 0xe24a
movq %rax, %rbx
leaq -0x130(%rbp), %rdi
jmp 0xe235
movq %rax, %rbx
leaq -0x100(%rbp), %rdi
jmp 0xe235
movq %rax, %rbx
leaq -0x160(%rbp), %rdi
jmp 0xe235
movq %rax, %rbx
movq %r14, %rdi
callq 0x31b0
jmp 0xe24d
movq %rax, %rbx
leaq -0x190(%rbp), %rdi
jmp 0xe235
movq %rax, %rbx
leaq -0x80(%rbp), %rdi
jmp 0xe243
movq %rax, %rbx
leaq -0xd0(%rbp), %rdi
callq 0x135f8
jmp 0xe24d
movq %rax, %rbx
leaq -0x60(%rbp), %rdi
callq 0x3110
jmp 0xe24d
movq %rax, %rbx
movq %rbx, %rdi
callq 0x3410