// File: ArashPartow[P]exprtk/./exprtk.hpp
// Function: exprtk::parser<double>::parse_while_loop()
inline expression_node_ptr parse_while_loop()
      {
         // Parse: [while][(][test expr][)][{][expression][}]
         expression_node_ptr condition   = error_node();
         expression_node_ptr branch      = error_node();
         expression_node_ptr result_node = error_node();

         bool result = true;

         next_token();

         if (!token_is(token_t::e_lbracket))
         {
            set_error(make_error(
               parser_error::e_syntax,
               current_token(),
               "ERR064 - Expected '(' at start of while-loop condition statement",
               exprtk_error_location));

            return error_node();
         }
         else if (0 == (condition = parse_expression()))
         {
            set_error(make_error(
               parser_error::e_syntax,
               current_token(),
               "ERR065 - Failed to parse condition for while-loop",
               exprtk_error_location));

            return error_node();
         }
         else if (!token_is(token_t::e_rbracket))
         {
            set_error(make_error(
               parser_error::e_syntax,
               current_token(),
               "ERR066 - Expected ')' at end of while-loop condition statement",
               exprtk_error_location));

            result = false;
         }

         brkcnt_list_.push_front(false);

         if (result)
         {
            scoped_inc_dec sid(state_.parsing_loop_stmt_count);

            if (0 == (branch = parse_multi_sequence("while-loop", true)))
            {
               set_error(make_error(
                  parser_error::e_syntax,
                  current_token(),
                  "ERR067 - Failed to parse body of while-loop"));
               result = false;
            }
            else if (0 == (result_node = expression_generator_.while_loop(condition,
                                                                          branch,
                                                                          brkcnt_list_.front())))
            {
               set_error(make_error(
                  parser_error::e_syntax,
                  current_token(),
                  "ERR068 - Failed to synthesize while-loop",
                  exprtk_error_location));

               result = false;
            }
         }

         handle_brkcnt_scope_exit();

         if (!result)
         {
            free_node(node_allocator_, branch     );
            free_node(node_allocator_, condition  );
            free_node(node_allocator_, result_node);

            return error_node();
         }

         if (result_node && result_node->valid())
         {
            return result_node;
         }

         set_error(make_error(
            parser_error::e_synthesis,
            current_token(),
            "ERR069 - Failed to synthesize 'valid' while-loop",
            exprtk_error_location));

         free_node(node_allocator_, result_node);

         return error_node();
      }

// Assembly:
subq $0x758, %rsp            # imm = 0x758
movq %rdi, 0x748(%rsp)
movq 0x748(%rsp), %rax
movq %rax, 0x88(%rsp)
callq 0x2821f0
movq %rax, 0x740(%rsp)
callq 0x2821f0
movq %rax, 0x738(%rsp)
callq 0x2821f0
movq 0x88(%rsp), %rdi
movq %rax, 0x730(%rsp)
movb $0x1, 0x72f(%rsp)
callq 0x373690
movq 0x88(%rsp), %rdi
movl $0x28, 0x728(%rsp)
leaq 0x728(%rsp), %rsi
movl $0x1, %edx
callq 0x37d640
xorb $-0x1, %al
testb $0x1, %al
jne 0x3870db
jmp 0x38729a
movq 0x88(%rsp), %rdi
callq 0x373e90
movq %rax, 0x78(%rsp)
leaq 0x65f(%rsp), %rdi
movq %rdi, 0x80(%rsp)
callq 0x11b6f0
movq 0x80(%rsp), %rdx
leaq 0x22153a(%rip), %rsi    # 0x5a864b
leaq 0x660(%rsp), %rdi
callq 0x134520
jmp 0x387120
leaq 0x608(%rsp), %rdi
movl $0x682d, %esi           # imm = 0x682D
callq 0x371f20
jmp 0x387134
leaq 0x21fdd8(%rip), %rsi    # 0x5a6f13
leaq 0x628(%rsp), %rdi
leaq 0x608(%rsp), %rdx
callq 0x29dd70
jmp 0x387152
movq 0x78(%rsp), %rdx
leaq 0x680(%rsp), %rdi
movl $0x1, %esi
leaq 0x660(%rsp), %rcx
leaq 0x628(%rsp), %r8
callq 0x3741e0
jmp 0x38717b
movq 0x88(%rsp), %rdi
leaq 0x680(%rsp), %rsi
callq 0x371e40
jmp 0x387192
leaq 0x680(%rsp), %rdi
callq 0x371330
leaq 0x628(%rsp), %rdi
callq 0x11b838
leaq 0x608(%rsp), %rdi
callq 0x11b838
leaq 0x660(%rsp), %rdi
callq 0x11b838
leaq 0x65f(%rsp), %rdi
callq 0x11b820
callq 0x2821f0
movq %rax, 0x750(%rsp)
jmp 0x387de5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x387288
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x38727b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x38726e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x387261
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
leaq 0x680(%rsp), %rdi
callq 0x371330
leaq 0x628(%rsp), %rdi
callq 0x11b838
leaq 0x608(%rsp), %rdi
callq 0x11b838
leaq 0x660(%rsp), %rdi
callq 0x11b838
leaq 0x65f(%rsp), %rdi
callq 0x11b820
jmp 0x387df5
movq 0x88(%rsp), %rdi
xorl %esi, %esi
callq 0x379940
movq %rax, %rcx
movq %rcx, 0x740(%rsp)
xorl %eax, %eax
cmpq %rcx, %rax
jne 0x387478
movq 0x88(%rsp), %rdi
callq 0x373e90
movq %rax, 0x68(%rsp)
leaq 0x53f(%rsp), %rdi
movq %rdi, 0x70(%rsp)
callq 0x11b6f0
movq 0x70(%rsp), %rdx
leaq 0x22139d(%rip), %rsi    # 0x5a868c
leaq 0x540(%rsp), %rdi
callq 0x134520
jmp 0x3872fe
leaq 0x4f8(%rsp), %rdi
movl $0x6837, %esi           # imm = 0x6837
callq 0x371f20
jmp 0x387312
leaq 0x21fbfa(%rip), %rsi    # 0x5a6f13
leaq 0x518(%rsp), %rdi
leaq 0x4f8(%rsp), %rdx
callq 0x29dd70
jmp 0x387330
movq 0x68(%rsp), %rdx
leaq 0x560(%rsp), %rdi
movl $0x1, %esi
leaq 0x540(%rsp), %rcx
leaq 0x518(%rsp), %r8
callq 0x3741e0
jmp 0x387359
movq 0x88(%rsp), %rdi
leaq 0x560(%rsp), %rsi
callq 0x371e40
jmp 0x387370
leaq 0x560(%rsp), %rdi
callq 0x371330
leaq 0x518(%rsp), %rdi
callq 0x11b838
leaq 0x4f8(%rsp), %rdi
callq 0x11b838
leaq 0x540(%rsp), %rdi
callq 0x11b838
leaq 0x53f(%rsp), %rdi
callq 0x11b820
callq 0x2821f0
movq %rax, 0x750(%rsp)
jmp 0x387de5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x387466
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x387459
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x38744c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x38743f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
leaq 0x560(%rsp), %rdi
callq 0x371330
leaq 0x518(%rsp), %rdi
callq 0x11b838
leaq 0x4f8(%rsp), %rdi
callq 0x11b838
leaq 0x540(%rsp), %rdi
callq 0x11b838
leaq 0x53f(%rsp), %rdi
callq 0x11b820
jmp 0x387df5
movq 0x88(%rsp), %rdi
movl $0x29, 0x4f4(%rsp)
leaq 0x4f4(%rsp), %rsi
movl $0x1, %edx
callq 0x37d640
xorb $-0x1, %al
testb $0x1, %al
jne 0x3874a8
jmp 0x38765c
movq 0x88(%rsp), %rdi
callq 0x373e90
movq %rax, 0x58(%rsp)
leaq 0x427(%rsp), %rdi
movq %rdi, 0x60(%rsp)
callq 0x11b6f0
movq 0x60(%rsp), %rdx
leaq 0x2211e6(%rip), %rsi    # 0x5a86be
leaq 0x428(%rsp), %rdi
callq 0x134520
jmp 0x3874e7
leaq 0x3e0(%rsp), %rdi
movl $0x6841, %esi           # imm = 0x6841
callq 0x371f20
jmp 0x3874fb
leaq 0x21fa11(%rip), %rsi    # 0x5a6f13
leaq 0x400(%rsp), %rdi
leaq 0x3e0(%rsp), %rdx
callq 0x29dd70
jmp 0x387519
movq 0x58(%rsp), %rdx
leaq 0x448(%rsp), %rdi
movl $0x1, %esi
leaq 0x428(%rsp), %rcx
leaq 0x400(%rsp), %r8
callq 0x3741e0
jmp 0x387542
movq 0x88(%rsp), %rdi
leaq 0x448(%rsp), %rsi
callq 0x371e40
jmp 0x387559
leaq 0x448(%rsp), %rdi
callq 0x371330
leaq 0x400(%rsp), %rdi
callq 0x11b838
leaq 0x3e0(%rsp), %rdi
callq 0x11b838
leaq 0x428(%rsp), %rdi
callq 0x11b838
leaq 0x427(%rsp), %rdi
callq 0x11b820
movb $0x0, 0x72f(%rsp)
jmp 0x38765c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x38764a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x38763d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x387630
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x387623
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
leaq 0x448(%rsp), %rdi
callq 0x371330
leaq 0x400(%rsp), %rdi
callq 0x11b838
leaq 0x3e0(%rsp), %rdi
callq 0x11b838
leaq 0x428(%rsp), %rdi
callq 0x11b838
leaq 0x427(%rsp), %rdi
callq 0x11b820
jmp 0x387df5
jmp 0x38765e
jmp 0x387660
movq 0x88(%rsp), %rdi
addq $0x358, %rdi            # imm = 0x358
movb $0x0, 0x3df(%rsp)
leaq 0x3df(%rsp), %rsi
callq 0x4e5b60
testb $0x1, 0x72f(%rsp)
je 0x387b64
movq 0x88(%rsp), %rsi
addq $0x3c0, %rsi            # imm = 0x3C0
leaq 0x3d0(%rsp), %rdi
callq 0x4e5b90
leaq 0x3af(%rsp), %rdi
movq %rdi, 0x50(%rsp)
callq 0x11b6f0
movq 0x50(%rsp), %rdx
leaq 0x2210ac(%rip), %rsi    # 0x5a8778
leaq 0x3b0(%rsp), %rdi
callq 0x134520
jmp 0x3876db
movq 0x88(%rsp), %rdi
leaq 0x3b0(%rsp), %rsi
movl $0x1, %edx
callq 0x399340
movq %rax, 0x48(%rsp)
jmp 0x3876fc
movq 0x48(%rsp), %rax
movq %rax, 0x738(%rsp)
leaq 0x3b0(%rsp), %rdi
callq 0x11b838
leaq 0x3af(%rsp), %rdi
callq 0x11b820
movq 0x48(%rsp), %rcx
xorl %eax, %eax
cmpq %rcx, %rax
jne 0x38792d
movq 0x88(%rsp), %rdi
callq 0x373e90
movq %rax, 0x40(%rsp)
jmp 0x387747
leaq 0x2df(%rsp), %rdi
movq %rdi, 0x38(%rsp)
callq 0x11b6f0
movq 0x38(%rsp), %rdx
leaq 0x220f98(%rip), %rsi    # 0x5a86fd
leaq 0x2e0(%rsp), %rdi
callq 0x134520
jmp 0x387774
leaq 0x2b7(%rsp), %rdi
movq %rdi, 0x30(%rsp)
callq 0x11b6f0
movq 0x30(%rsp), %rdx
leaq 0x22e4b6(%rip), %rsi    # 0x5b5c48
leaq 0x2b8(%rsp), %rdi
callq 0x134520
jmp 0x3877a1
movq 0x40(%rsp), %rdx
leaq 0x300(%rsp), %rdi
movl $0x1, %esi
leaq 0x2e0(%rsp), %rcx
leaq 0x2b8(%rsp), %r8
callq 0x3741e0
jmp 0x3877ca
movq 0x88(%rsp), %rdi
leaq 0x300(%rsp), %rsi
callq 0x371e40
jmp 0x3877e1
leaq 0x300(%rsp), %rdi
callq 0x371330
leaq 0x2b8(%rsp), %rdi
callq 0x11b838
leaq 0x2b7(%rsp), %rdi
callq 0x11b820
leaq 0x2e0(%rsp), %rdi
callq 0x11b838
leaq 0x2df(%rsp), %rdi
callq 0x11b820
movb $0x0, 0x72f(%rsp)
jmp 0x387b43
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x387866
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
leaq 0x3b0(%rsp), %rdi
callq 0x11b838
leaq 0x3af(%rsp), %rdi
callq 0x11b820
jmp 0x387b52
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x387b52
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x38791b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x387901
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x3878f4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
leaq 0x300(%rsp), %rdi
callq 0x371330
leaq 0x2b8(%rsp), %rdi
callq 0x11b838
leaq 0x2b7(%rsp), %rdi
callq 0x11b820
leaq 0x2e0(%rsp), %rdi
callq 0x11b838
leaq 0x2df(%rsp), %rdi
callq 0x11b820
jmp 0x387b52
movq 0x88(%rsp), %rdi
movq %rdi, %rax
addq $0x220, %rax            # imm = 0x220
movq %rax, 0x20(%rsp)
addq $0x358, %rdi            # imm = 0x358
callq 0x4e5f90
movq 0x20(%rsp), %rdi
movzbl (%rax), %ecx
andl $0x1, %ecx
leaq 0x740(%rsp), %rsi
leaq 0x738(%rsp), %rdx
callq 0x4e5bc0
movq %rax, 0x28(%rsp)
jmp 0x387976
movq 0x28(%rsp), %rcx
movq %rcx, 0x730(%rsp)
xorl %eax, %eax
cmpq %rcx, %rax
jne 0x387b41
movq 0x88(%rsp), %rdi
callq 0x373e90
movq %rax, 0x18(%rsp)
jmp 0x3879a2
leaq 0x1e7(%rsp), %rdi
movq %rdi, 0x10(%rsp)
callq 0x11b6f0
movq 0x10(%rsp), %rdx
leaq 0x220d69(%rip), %rsi    # 0x5a8729
leaq 0x1e8(%rsp), %rdi
callq 0x134520
jmp 0x3879cf
leaq 0x1a0(%rsp), %rdi
movl $0x685c, %esi           # imm = 0x685C
callq 0x371f20
jmp 0x3879e3
leaq 0x21f529(%rip), %rsi    # 0x5a6f13
leaq 0x1c0(%rsp), %rdi
leaq 0x1a0(%rsp), %rdx
callq 0x29dd70
jmp 0x387a01
movq 0x18(%rsp), %rdx
leaq 0x208(%rsp), %rdi
movl $0x1, %esi
leaq 0x1e8(%rsp), %rcx
leaq 0x1c0(%rsp), %r8
callq 0x3741e0
jmp 0x387a2a
movq 0x88(%rsp), %rdi
leaq 0x208(%rsp), %rsi
callq 0x371e40
jmp 0x387a41
leaq 0x208(%rsp), %rdi
callq 0x371330
leaq 0x1c0(%rsp), %rdi
callq 0x11b838
leaq 0x1a0(%rsp), %rdi
callq 0x11b838
leaq 0x1e8(%rsp), %rdi
callq 0x11b838
leaq 0x1e7(%rsp), %rdi
callq 0x11b820
movb $0x0, 0x72f(%rsp)
jmp 0x387b41
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x387b32
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x387b25
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x387b18
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x387b0b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
leaq 0x208(%rsp), %rdi
callq 0x371330
leaq 0x1c0(%rsp), %rdi
callq 0x11b838
leaq 0x1a0(%rsp), %rdi
callq 0x11b838
leaq 0x1e8(%rsp), %rdi
callq 0x11b838
leaq 0x1e7(%rsp), %rdi
callq 0x11b820
jmp 0x387b52
jmp 0x387b43
leaq 0x3d0(%rsp), %rdi
callq 0x4e5fc0
jmp 0x387b64
leaq 0x3d0(%rsp), %rdi
callq 0x4e5fc0
jmp 0x387df5
movq 0x88(%rsp), %rdi
callq 0x4e5fe0
testb $0x1, 0x72f(%rsp)
jne 0x387be1
movq 0x88(%rsp), %rdi
addq $0x290, %rdi            # imm = 0x290
leaq 0x738(%rsp), %rsi
callq 0x284bd0
movq 0x88(%rsp), %rdi
addq $0x290, %rdi            # imm = 0x290
leaq 0x740(%rsp), %rsi
callq 0x284bd0
movq 0x88(%rsp), %rdi
addq $0x290, %rdi            # imm = 0x290
leaq 0x730(%rsp), %rsi
callq 0x284bd0
callq 0x2821f0
movq %rax, 0x750(%rsp)
jmp 0x387de5
cmpq $0x0, 0x730(%rsp)
je 0x387c15
movq 0x730(%rsp), %rdi
movq (%rdi), %rax
callq *0x30(%rax)
testb $0x1, %al
jne 0x387c00
jmp 0x387c15
movq 0x730(%rsp), %rax
movq %rax, 0x750(%rsp)
jmp 0x387de5
movq 0x88(%rsp), %rdi
callq 0x373e90
movq %rax, (%rsp)
leaq 0xd7(%rsp), %rdi
movq %rdi, 0x8(%rsp)
callq 0x11b6f0
movq 0x8(%rsp), %rdx
leaq 0x220b0e(%rip), %rsi    # 0x5a8752
leaq 0xd8(%rsp), %rdi
callq 0x134520
jmp 0x387c53
leaq 0x90(%rsp), %rdi
movl $0x6876, %esi           # imm = 0x6876
callq 0x371f20
jmp 0x387c67
leaq 0x21f2a5(%rip), %rsi    # 0x5a6f13
leaq 0xb0(%rsp), %rdi
leaq 0x90(%rsp), %rdx
callq 0x29dd70
jmp 0x387c85
movq (%rsp), %rdx
leaq 0xf8(%rsp), %rdi
movl $0x7, %esi
leaq 0xd8(%rsp), %rcx
leaq 0xb0(%rsp), %r8
callq 0x3741e0
jmp 0x387cad
movq 0x88(%rsp), %rdi
leaq 0xf8(%rsp), %rsi
callq 0x371e40
jmp 0x387cc4
leaq 0xf8(%rsp), %rdi
callq 0x371330
leaq 0xb0(%rsp), %rdi
callq 0x11b838
leaq 0x90(%rsp), %rdi
callq 0x11b838
leaq 0xd8(%rsp), %rdi
callq 0x11b838
leaq 0xd7(%rsp), %rdi
callq 0x11b820
movq 0x88(%rsp), %rdi
addq $0x290, %rdi            # imm = 0x290
leaq 0x730(%rsp), %rsi
callq 0x284bd0
callq 0x2821f0
movq %rax, 0x750(%rsp)
jmp 0x387de5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x387dd6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x387dc9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x387dbc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
jmp 0x387daf
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x650(%rsp)
movl %eax, 0x64c(%rsp)
leaq 0xf8(%rsp), %rdi
callq 0x371330
leaq 0xb0(%rsp), %rdi
callq 0x11b838
leaq 0x90(%rsp), %rdi
callq 0x11b838
leaq 0xd8(%rsp), %rdi
callq 0x11b838
leaq 0xd7(%rsp), %rdi
callq 0x11b820
jmp 0x387df5
movq 0x750(%rsp), %rax
addq $0x758, %rsp            # imm = 0x758
retq
movq 0x650(%rsp), %rdi
callq 0x11b4e0
nopw %cs:(%rax,%rax)
nopl (%rax)