// File: /workspace/github_cpp_makefile_star2_O2/araujoigor[P]ipp-compiler/./src/include/IWhile.hpp
// Function: IWhile::generateCode(std::basic_fstream<char, std::char_traits<char>>&)
void generateCode(std::fstream& fileStream) {
		//Variavel para armazenamento dos tokens que iremos gerar através da quebra
		//da expressao do if pelos tokens '&&' e '||'
		vector<string> tokens;

		//Armazenamos a expressao original temporariamente, para processamento
		string tempStr = *expression;

		//eliminamos todos os parenteses para analise
		boost::erase_all(tempStr, "(");
		boost::erase_all(tempStr, ")");

		//Quebramos a expressao pelos operadores || e &&
		boost::algorithm::split_regex(tokens, tempStr,
				boost::regex("&&|\\|\\|"));

		//Iteramos sobre as sub expressões para dividir os elementos da expressão e procurar por comparações
		//incorretas e/ou variaveis não declaradas
		for (auto it = tokens.begin(); it != tokens.end(); it++) {
			//Vetor de strings para armazenamento das subexpressões
			vector<string> varsExps;

			//Quebramos cada subexpressão pelos operadores de comparação
			boost::algorithm::split_regex(varsExps, *it,
					boost::regex("==|!=|<|>|<=|>="));
			string type[2];
			int i = 0;

			//Obtemos o tipo de cada operando das comparações
			for (auto it2 = varsExps.begin(); it2 != varsExps.end(); it2++) {
				//Se for um numeri=o
				if (IMath::isNumber(*it2)) {
					type[i] = IReal::myType;
					continue;
				}

				//Se for uma string
				if (it2->find("\"") != string::npos) {
					type[i] = IString::myType;
					continue;
				}

				IData *data = ownerBlock->getLocalVariable(*it2);

				//Se for uma variavel
				if (data == NULL) {
					//Variavel nao declarada, gera um erro
					throw ISourceErrorException(
							"Variavel " + *it2 + " nao declarada.", myLine);
				} else {
					type[0] = data->getType();
				}

				i++;
			}

			//Caso a comparação seja de tipagem errada, gera-se um erro
			if (type[0] != type[1]
					&& (type[0] == IString::myType || type[1] == IString::myType)) {
				throw ISourceErrorException(
						"Impossivel comparar uma variavel numerica com uma string.",
						myLine);
			}
		}

		fileStream << "while (" << *expression << "){" << endl;
		innerBlock->generateCode(fileStream);
		fileStream << "}" << endl;
	}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x158, %rsp            # imm = 0x158
movq %rsi, %rbx
xorps %xmm0, %xmm0
movaps %xmm0, -0x70(%rbp)
andq $0x0, -0x60(%rbp)
movq %rdi, -0x30(%rbp)
movq 0x18(%rdi), %rsi
leaq -0xe0(%rbp), %rdi
callq 0x85b0
leaq 0x38a3(%rip), %rsi      # 0x28243
leaq -0xe0(%rbp), %rdi
callq 0xf49a
leaq 0x50ec(%rip), %rsi      # 0x29a9f
leaq -0xe0(%rbp), %rdi
callq 0xf49a
leaq 0x3d88(%rip), %rsi      # 0x2874e
leaq -0xb0(%rbp), %rdi
xorl %edx, %edx
callq 0xf4d6
movq %rbx, -0xb8(%rbp)
leaq -0x70(%rbp), %rdi
leaq -0xe0(%rbp), %rsi
leaq -0xb0(%rbp), %rdx
xorl %ecx, %ecx
callq 0x11aa6
leaq -0xa8(%rbp), %rdi
callq 0x16ef0
movq -0x70(%rbp), %rbx
leaq -0x160(%rbp), %r14
leaq 0x17ae6(%rip), %r12     # 0x3c4f8
cmpq -0x68(%rbp), %rbx
je 0x24bf3
xorps %xmm0, %xmm0
movaps %xmm0, -0x50(%rbp)
andq $0x0, -0x40(%rbp)
leaq -0xb0(%rbp), %r15
movq %r15, %rdi
leaq 0x3d1d(%rip), %rsi      # 0x28756
xorl %edx, %edx
callq 0xf4d6
leaq -0x50(%rbp), %rdi
movq %rbx, %rsi
movq %r15, %rdx
xorl %ecx, %ecx
callq 0x11aa6
movq %rbx, -0xc0(%rbp)
leaq -0xa8(%rbp), %rdi
callq 0x16ef0
pushq $0x10
popq %rax
leaq (%rax,%rbp), %rcx
addq $-0xb0, %rcx
movq %rcx, -0x10(%rcx)
andq $0x0, -0x8(%rcx)
movb $0x0, (%rcx)
addq $0x20, %rax
cmpq $0x50, %rax
jne 0x24a67
xorl %r15d, %r15d
movq -0x50(%rbp), %rbx
cmpq -0x48(%rbp), %rbx
je 0x24b70
movq %r14, %rdi
movq %rbx, %rsi
callq 0x85b0
movq %r14, %rdi
callq 0xa89e
movl %eax, %r13d
movq %r14, %rdi
callq 0x8930
movq %r12, %rsi
testb %r13b, %r13b
jne 0x24add
movq %rbx, %rdi
leaq 0x35d5(%rip), %rsi      # 0x2809e
xorl %edx, %edx
callq 0x88f0
leaq 0x17a01(%rip), %rsi     # 0x3c4d8
cmpq $-0x1, %rax
je 0x24afa
movslq %r15d, %rax
shlq $0x5, %rax
leaq (%rax,%rbp), %rdi
addq $-0xb0, %rdi
callq 0x8240
addq $0x20, %rbx
jmp 0x24a8f
movq %r12, %r14
movq -0x30(%rbp), %rax
movq 0x10(%rax), %r13
leaq -0x180(%rbp), %r12
movq %r12, %rdi
movq %rbx, %rsi
callq 0x85b0
movq %r13, %rdi
movq %r12, %rsi
callq 0xc772
movq %rax, %r13
movq %r12, %rdi
callq 0x8930
testq %r13, %r13
je 0x24c82
movq (%r13), %rax
leaq -0x100(%rbp), %r12
movq %r12, %rdi
movq %r13, %rsi
callq *0x10(%rax)
leaq -0xb0(%rbp), %rdi
movq %r12, %rsi
callq 0x84d0
movq %r12, %rdi
callq 0x8930
incl %r15d
movq %r14, %r12
leaq -0x160(%rbp), %r14
jmp 0x24af4
leaq -0xb0(%rbp), %rdi
leaq -0x90(%rbp), %rsi
callq 0xc8fa
testb %al, %al
je 0x24bbd
leaq -0xb0(%rbp), %rdi
leaq 0x17943(%rip), %rsi     # 0x3c4d8
callq 0xce8f
testb %al, %al
jne 0x24cf1
leaq -0x90(%rbp), %rdi
leaq 0x17928(%rip), %rsi     # 0x3c4d8
callq 0xce8f
testb %al, %al
jne 0x24cf1
pushq $0x20
popq %rbx
leaq (%rbx,%rbp), %rdi
addq $-0xb0, %rdi
callq 0x8930
addq $-0x20, %rbx
cmpq $-0x20, %rbx
jne 0x24bc0
leaq -0x50(%rbp), %rdi
callq 0xdb90
movq -0xc0(%rbp), %rbx
addq $0x20, %rbx
jmp 0x24a12
movq -0xb8(%rbp), %r14
leaq 0x10(%r14), %rbx
leaq 0x7a23(%rip), %rsi      # 0x2c628
movq %rbx, %rdi
callq 0x8390
movq -0x30(%rbp), %rcx
movq 0x18(%rcx), %rsi
movq %rax, %rdi
callq 0x8340
leaq 0x7b10(%rip), %rsi      # 0x2c734
movq %rax, %rdi
callq 0x8390
movq %rax, %rdi
callq 0x81f0
movq -0x30(%rbp), %rax
movq 0x20(%rax), %rdi
movq (%rdi), %rax
movq %r14, %rsi
callq *(%rax)
leaq 0x7c57(%rip), %rsi      # 0x2c8a2
movq %rbx, %rdi
callq 0x8390
movq %rax, %rdi
callq 0x81f0
leaq -0xe0(%rbp), %rdi
callq 0x8930
leaq -0x70(%rbp), %rdi
callq 0xdb90
addq $0x158, %rsp            # imm = 0x158
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
pushq $0x28
popq %rdi
callq 0x8200
movq %rax, %r14
leaq 0x358d(%rip), %rsi      # 0x28221
leaq -0x100(%rbp), %rdi
movq %rbx, %rdx
callq 0xc83b
leaq 0x7aab(%rip), %rdx      # 0x2c755
leaq -0x140(%rbp), %rdi
leaq -0x100(%rbp), %rsi
callq 0xc63c
movq -0x30(%rbp), %rax
movl 0x8(%rax), %edx
movb $0x1, %r15b
leaq -0x140(%rbp), %rsi
movq %r14, %rdi
callq 0xc8b2
xorl %r15d, %r15d
leaq 0x163d0(%rip), %rsi     # 0x3b0b0
leaq -0x183f7(%rip), %rdx    # 0xc8f0
movq %r14, %rdi
callq 0x87a0
jmp 0x24d48
pushq $0x28
popq %rdi
callq 0x8200
movq %rax, %r14
leaq 0x3a63(%rip), %rsi      # 0x28766
leaq -0x120(%rbp), %rdi
leaq -0x100(%rbp), %rdx
callq 0x8180
movq -0x30(%rbp), %rax
movl 0x8(%rax), %edx
movb $0x1, %r15b
leaq -0x120(%rbp), %rsi
movq %r14, %rdi
callq 0xc8b2
xorl %r15d, %r15d
leaq 0x16377(%rip), %rsi     # 0x3b0b0
leaq -0x18450(%rip), %rdx    # 0xc8f0
movq %r14, %rdi
callq 0x87a0
movq %rax, %rbx
leaq -0xa8(%rbp), %rdi
callq 0x16ef0
jmp 0x24e17
jmp 0x24d66
movq %rax, %rbx
jmp 0x24e23
movq %rax, %rbx
jmp 0x24e17
movq %rax, %rbx
leaq -0x120(%rbp), %rdi
jmp 0x24db3
jmp 0x24dbf
movq %rax, %rbx
jmp 0x24e0e
movq %rax, %rbx
leaq -0xa8(%rbp), %rdi
callq 0x16ef0
jmp 0x24e0e
movq %rax, %rbx
leaq -0x140(%rbp), %rdi
callq 0x8930
jmp 0x24dac
movq %rax, %rbx
movb $0x1, %r15b
leaq -0x100(%rbp), %rdi
callq 0x8930
testb %r15b, %r15b
jne 0x24dc2
jmp 0x24df0
movq %rax, %rbx
movq %r14, %rdi
callq 0x82f0
jmp 0x24df0
jmp 0x24ded
movq %rax, %rbx
leaq -0x180(%rbp), %rdi
jmp 0x24de6
jmp 0x24ded
movq %rax, %rbx
leaq -0x160(%rbp), %rdi
callq 0x8930
jmp 0x24df0
movq %rax, %rbx
pushq $0x20
popq %r14
leaq (%r14,%rbp), %rdi
addq $-0xb0, %rdi
callq 0x8930
addq $-0x20, %r14
cmpq $-0x20, %r14
jne 0x24df4
leaq -0x50(%rbp), %rdi
callq 0xdb90
leaq -0xe0(%rbp), %rdi
callq 0x8930
leaq -0x70(%rbp), %rdi
callq 0xdb90
movq %rbx, %rdi
callq 0x87e0