// File: ArashPartow[P]exprtk/./exprtk.hpp
// Function: exprtk::parser<double>::parse_string()
inline expression_node_ptr parse_string()
      {
         const std::string symbol = current_token().value;

         typedef details::stringvar_node<T>* strvar_node_t;

         expression_node_ptr result   = error_node();
         strvar_node_t const_str_node = static_cast<strvar_node_t>(0);

         scope_element& se = sem_.get_active_element(symbol);

         if (scope_element::e_string == se.type)
         {
            se.active = true;
            result    = se.str_node;
            lodge_symbol(symbol, e_st_local_string);
         }
         else
         {
            typedef typename symtab_store::string_context str_ctxt_t;
            str_ctxt_t str_ctx = symtab_store_.get_string_context(symbol);

            if ((0 == str_ctx.str_var) || !symtab_store_.is_conststr_stringvar(symbol))
            {
               set_error(make_error(
                  parser_error::e_syntax,
                  current_token(),
                  "ERR121 - Unknown string symbol",
                  exprtk_error_location));

               return error_node();
            }

            assert(str_ctx.str_var != 0);
            assert(str_ctx.symbol_table != 0);

            result = str_ctx.str_var;

            if (symtab_store_.is_constant_string(symbol))
            {
               const_str_node = static_cast<strvar_node_t>(result);
               result = expression_generator_(const_str_node->str());
            }
            else if (symbol_table_t::e_immutable == str_ctx.symbol_table->mutability())
            {
               lodge_immutable_symbol(
                  current_token(),
                  make_memory_range(str_ctx.str_var->base(), str_ctx.str_var->size()));
            }

            lodge_symbol(symbol, e_st_string);
         }

         if (peek_token_is(token_t::e_lsqrbracket))
         {
            next_token();

            if (peek_token_is(token_t::e_rsqrbracket))
            {
               next_token();
               next_token();

               if (const_str_node)
               {
                  free_node(node_allocator_, result);

                  return expression_generator_(T(const_str_node->size()));
               }
               else
                  return node_allocator_.allocate<details::stringvar_size_node<T> >
                            (static_cast<details::stringvar_node<T>*>(result)->ref());
            }

            range_t rp;

            if (!parse_range(rp))
            {
               free_node(node_allocator_, result);

               return error_node();
            }
            else if (const_str_node)
            {
               free_node(node_allocator_, result);
               result = expression_generator_(const_str_node->ref(),rp);
            }
            else
               result = expression_generator_(static_cast<details::stringvar_node<T>*>
                           (result)->ref(), rp);

            if (result)
               rp.clear();
         }
         else
            next_token();

         return result;
      }

// Assembly:
subq $0x2e8, %rsp            # imm = 0x2E8
movq %rdi, 0x2d8(%rsp)
movq 0x2d8(%rsp), %rdi
movq %rdi, 0xb8(%rsp)
callq 0x373e90
movq %rax, %rsi
addq $0x8, %rsi
leaq 0x2b8(%rsp), %rdi
movq %rdi, 0xc8(%rsp)
callq 0x11b140
callq 0x2821f0
movq %rax, %rcx
movq 0xb8(%rsp), %rax
movq %rcx, 0x2b0(%rsp)
movq $0x0, 0x2a8(%rsp)
addq $0x530, %rax            # imm = 0x530
movq %rax, 0xc0(%rsp)
callq 0x237af0
movq 0xc0(%rsp), %rdi
movq 0xc8(%rsp), %rsi
movq %rax, %rdx
callq 0x513c70
movq %rax, 0xd0(%rsp)
jmp 0x529409
movq 0xd0(%rsp), %rax
movq %rax, 0x2a0(%rsp)
movq 0x2a0(%rsp), %rcx
movl $0x5, %eax
cmpl 0x48(%rcx), %eax
jne 0x529485
movq 0xb8(%rsp), %rdi
movq 0x2a0(%rsp), %rax
movb $0x1, 0x4c(%rax)
movq 0x2a0(%rsp), %rax
movq 0x68(%rax), %rax
movq %rax, 0x2b0(%rsp)
leaq 0x2b8(%rsp), %rsi
movl $0x8, %edx
callq 0x39aef0
jmp 0x529467
jmp 0x52989c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x298(%rsp)
movl %eax, 0x294(%rsp)
jmp 0x529bca
movq 0xb8(%rsp), %rdi
addq $0x298, %rdi            # imm = 0x298
leaq 0x2b8(%rsp), %rsi
callq 0x52da80
movq %rdx, 0xa8(%rsp)
movq %rax, 0xb0(%rsp)
jmp 0x5294b3
movq 0xa8(%rsp), %rax
movq 0xb0(%rsp), %rcx
movq %rcx, 0x280(%rsp)
movq %rax, 0x288(%rsp)
xorl %eax, %eax
cmpq 0x288(%rsp), %rax
je 0x529515
movq 0xb8(%rsp), %rdi
addq $0x298, %rdi            # imm = 0x298
leaq 0x2b8(%rsp), %rsi
callq 0x52db70
movb %al, 0xa7(%rsp)
jmp 0x529504
movb 0xa7(%rsp), %al
testb $0x1, %al
jne 0x5296e7
jmp 0x529515
movq 0xb8(%rsp), %rdi
callq 0x373e90
movq %rax, 0x98(%rsp)
jmp 0x52952c
leaq 0x1b7(%rsp), %rdi
movq %rdi, 0x90(%rsp)
callq 0x11b6f0
movq 0x90(%rsp), %rdx
leaq 0x81113(%rip), %rsi     # 0x5aa663
leaq 0x1b8(%rsp), %rdi
callq 0x134520
jmp 0x52955f
leaq 0x170(%rsp), %rdi
movl $0x6d98, %esi           # imm = 0x6D98
callq 0x371f20
jmp 0x529573
leaq 0x7d999(%rip), %rsi     # 0x5a6f13
leaq 0x190(%rsp), %rdi
leaq 0x170(%rsp), %rdx
callq 0x29dd70
jmp 0x529591
movq 0x98(%rsp), %rdx
leaq 0x1d8(%rsp), %rdi
movl $0x1, %esi
leaq 0x1b8(%rsp), %rcx
leaq 0x190(%rsp), %r8
callq 0x3741e0
jmp 0x5295bd
movq 0xb8(%rsp), %rdi
leaq 0x1d8(%rsp), %rsi
callq 0x371e40
jmp 0x5295d4
leaq 0x1d8(%rsp), %rdi
callq 0x371330
leaq 0x190(%rsp), %rdi
callq 0x11b838
leaq 0x170(%rsp), %rdi
callq 0x11b838
leaq 0x1b8(%rsp), %rdi
callq 0x11b838
leaq 0x1b7(%rsp), %rdi
callq 0x11b820
callq 0x2821f0
movq %rax, 0x2e0(%rsp)
movl $0x1, 0x16c(%rsp)
jmp 0x529bad
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x298(%rsp)
movl %eax, 0x294(%rsp)
jmp 0x5296d5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x298(%rsp)
movl %eax, 0x294(%rsp)
jmp 0x5296c8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x298(%rsp)
movl %eax, 0x294(%rsp)
jmp 0x5296bb
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x298(%rsp)
movl %eax, 0x294(%rsp)
jmp 0x5296ae
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x298(%rsp)
movl %eax, 0x294(%rsp)
leaq 0x1d8(%rsp), %rdi
callq 0x371330
leaq 0x190(%rsp), %rdi
callq 0x11b838
leaq 0x170(%rsp), %rdi
callq 0x11b838
leaq 0x1b8(%rsp), %rdi
callq 0x11b838
leaq 0x1b7(%rsp), %rdi
callq 0x11b820
jmp 0x529bca
movq 0xb8(%rsp), %rdi
movq 0x288(%rsp), %rax
movq %rax, 0x2b0(%rsp)
addq $0x298, %rdi            # imm = 0x298
leaq 0x2b8(%rsp), %rsi
callq 0x52dca0
movb %al, 0x8f(%rsp)
jmp 0x52971c
movb 0x8f(%rsp), %al
testb $0x1, %al
jne 0x52972c
jmp 0x5297ca
movq 0xb8(%rsp), %rax
movq 0x2b0(%rsp), %rcx
movq %rcx, 0x2a8(%rsp)
addq $0x220, %rax            # imm = 0x220
movq %rax, 0x80(%rsp)
movq 0x2a8(%rsp), %rsi
leaq 0x148(%rsp), %rdi
callq 0x3eed70
jmp 0x529769
movq 0x80(%rsp), %rdi
leaq 0x148(%rsp), %rsi
callq 0x52dda0
movq %rax, 0x78(%rsp)
jmp 0x529785
movq 0x78(%rsp), %rax
movq %rax, 0x2b0(%rsp)
leaq 0x148(%rsp), %rdi
callq 0x11b838
jmp 0x52987e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x298(%rsp)
movl %eax, 0x294(%rsp)
leaq 0x148(%rsp), %rdi
callq 0x11b838
jmp 0x529bca
movq 0x280(%rsp), %rdi
callq 0x517200
movl %eax, %ecx
movl $0x2, %eax
cmpl %ecx, %eax
jne 0x52987c
movq 0xb8(%rsp), %rdi
callq 0x373e90
movq %rax, 0x70(%rsp)
jmp 0x5297fa
movq 0x288(%rsp), %rdi
callq 0x3ea590
movq %rax, 0x68(%rsp)
jmp 0x52980e
movq 0x288(%rsp), %rdi
callq 0x3eedf0
movq 0xb8(%rsp), %rdi
movq 0x68(%rsp), %rsi
movq %rax, %rdx
callq 0x52ddd0
movq %rdx, 0x58(%rsp)
movq %rax, 0x60(%rsp)
jmp 0x52983c
movq 0x70(%rsp), %rsi
movq 0xb8(%rsp), %rdi
movq 0x58(%rsp), %rax
movq 0x60(%rsp), %rcx
movq %rcx, 0x138(%rsp)
movq %rax, 0x140(%rsp)
movq 0x138(%rsp), %rdx
movq 0x140(%rsp), %rcx
callq 0x517240
jmp 0x52987a
jmp 0x52987c
jmp 0x52987e
movq 0xb8(%rsp), %rdi
leaq 0x2b8(%rsp), %rsi
movl $0x4, %edx
callq 0x39aef0
jmp 0x52989a
jmp 0x52989c
movq 0xb8(%rsp), %rdi
movl $0x5b, 0x134(%rsp)
leaq 0x134(%rsp), %rsi
callq 0x39c870
movb %al, 0x57(%rsp)
jmp 0x5298c2
movb 0x57(%rsp), %al
testb $0x1, %al
jne 0x5298cf
jmp 0x529b81
movq 0xb8(%rsp), %rdi
callq 0x373690
jmp 0x5298de
movq 0xb8(%rsp), %rdi
movl $0x5d, 0x130(%rsp)
leaq 0x130(%rsp), %rsi
callq 0x39c870
movb %al, 0x56(%rsp)
jmp 0x529904
movb 0x56(%rsp), %al
testb $0x1, %al
jne 0x529911
jmp 0x529a33
movq 0xb8(%rsp), %rdi
callq 0x373690
jmp 0x529920
movq 0xb8(%rsp), %rdi
callq 0x373690
jmp 0x52992f
cmpq $0x0, 0x2a8(%rsp)
je 0x5299e2
movq 0xb8(%rsp), %rdi
addq $0x290, %rdi            # imm = 0x290
leaq 0x2b0(%rsp), %rsi
callq 0x284bd0
jmp 0x52995c
movq 0xb8(%rsp), %rax
addq $0x220, %rax            # imm = 0x220
movq %rax, 0x40(%rsp)
movq 0x2a8(%rsp), %rdi
callq 0x3eedf0
movq 0x40(%rsp), %rdi
movq %rax, %xmm0
movaps 0x71813(%rip), %xmm1    # 0x59b1a0
punpckldq %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
movapd 0x71817(%rip), %xmm1    # 0x59b1b0
subpd %xmm1, %xmm0
movaps %xmm0, %xmm1
unpckhpd %xmm0, %xmm0            # xmm0 = xmm0[1,1]
addsd %xmm1, %xmm0
movsd %xmm0, 0x128(%rsp)
leaq 0x128(%rsp), %rsi
callq 0x284c20
movq %rax, 0x48(%rsp)
jmp 0x5299c5
movq 0x48(%rsp), %rax
movq %rax, 0x2e0(%rsp)
movl $0x1, 0x16c(%rsp)
jmp 0x529bad
movq 0xb8(%rsp), %rax
addq $0x290, %rax            # imm = 0x290
movq %rax, 0x30(%rsp)
movq 0x2b0(%rsp), %rdi
callq 0x3eed20
movq 0x30(%rsp), %rdi
movq %rax, %rsi
callq 0x52de20
movq %rax, 0x38(%rsp)
jmp 0x529a16
movq 0x38(%rsp), %rax
movq %rax, 0x2e0(%rsp)
movl $0x1, 0x16c(%rsp)
jmp 0x529bad
leaq 0xd8(%rsp), %rdi
callq 0x43b670
jmp 0x529a42
movq 0xb8(%rsp), %rdi
leaq 0xd8(%rsp), %rsi
xorl %edx, %edx
callq 0x52dea0
movb %al, 0x2f(%rsp)
jmp 0x529a5f
movb 0x2f(%rsp), %al
testb $0x1, %al
jne 0x529aa4
jmp 0x529a69
movq 0xb8(%rsp), %rdi
addq $0x290, %rdi            # imm = 0x290
leaq 0x2b0(%rsp), %rsi
callq 0x284bd0
jmp 0x529a87
callq 0x2821f0
movq %rax, 0x2e0(%rsp)
movl $0x1, 0x16c(%rsp)
jmp 0x529bad
cmpq $0x0, 0x2a8(%rsp)
je 0x529b18
movq 0xb8(%rsp), %rdi
addq $0x290, %rdi            # imm = 0x290
leaq 0x2b0(%rsp), %rsi
callq 0x284bd0
jmp 0x529acd
movq 0xb8(%rsp), %rax
addq $0x220, %rax            # imm = 0x220
movq %rax, 0x18(%rsp)
movq 0x2a8(%rsp), %rdi
callq 0x3eed20
movq 0x18(%rsp), %rdi
movq %rax, %rsi
leaq 0xd8(%rsp), %rdx
callq 0x52f120
movq %rax, 0x20(%rsp)
jmp 0x529b09
movq 0x20(%rsp), %rax
movq %rax, 0x2b0(%rsp)
jmp 0x529b61
movq 0xb8(%rsp), %rax
addq $0x220, %rax            # imm = 0x220
movq %rax, 0x8(%rsp)
movq 0x2b0(%rsp), %rdi
callq 0x3eed20
movq 0x8(%rsp), %rdi
movq %rax, %rsi
leaq 0xd8(%rsp), %rdx
callq 0x52f120
movq %rax, 0x10(%rsp)
jmp 0x529b54
movq 0x10(%rsp), %rax
movq %rax, 0x2b0(%rsp)
jmp 0x529b63
cmpq $0x0, 0x2b0(%rsp)
je 0x529b7f
leaq 0xd8(%rsp), %rdi
callq 0x443c00
jmp 0x529b7d
jmp 0x529b7f
jmp 0x529b92
movq 0xb8(%rsp), %rdi
callq 0x373690
jmp 0x529b90
jmp 0x529b92
movq 0x2b0(%rsp), %rax
movq %rax, 0x2e0(%rsp)
movl $0x1, 0x16c(%rsp)
leaq 0x2b8(%rsp), %rdi
callq 0x11b838
movq 0x2e0(%rsp), %rax
addq $0x2e8, %rsp            # imm = 0x2E8
retq
leaq 0x2b8(%rsp), %rdi
callq 0x11b838
movq 0x298(%rsp), %rdi
callq 0x11b4e0
nopw %cs:(%rax,%rax)
nop