C++ Mathematical Expression Library (ExprTk)  http://www.partow.net/programming/exprtk/index.html
diff --git a/exprtk.hpp b/exprtk.hpp
index 0854400..98e8eac 100644
--- a/exprtk.hpp
+++ b/exprtk.hpp
@@ -2125,6 +2125,16 @@
             return std::string(begin_itr,end_itr);
          }
 
+         inline std::string remaining() const
+         {
+            if (finished())
+               return "";
+            else if (token_list_.begin() != token_itr_)
+               return std::string(base_itr_ + (token_itr_ - 1)->position,s_end_);
+            else
+               return std::string(base_itr_ + token_itr_->position,s_end_);
+         }
+
       private:
 
          inline bool is_end(const char* itr)
@@ -3602,8 +3612,10 @@
          };
       }
 
-      struct parser_helper
+      class parser_helper
       {
+      public:
+
          typedef token         token_t;
          typedef generator generator_t;
 
@@ -3621,6 +3633,28 @@
             return true;
          }
 
+         inline generator_t& lexer()
+         {
+            return lexer_;
+         }
+
+         inline const generator_t& lexer() const
+         {
+            return lexer_;
+         }
+
+         inline void store_token()
+         {
+            lexer_.store();
+            store_current_token_ = current_token_;
+         }
+
+         inline void restore_token()
+         {
+            lexer_.restore();
+            current_token_ = store_current_token_;
+         }
+
          inline void next_token()
          {
             current_token_ = lexer_.next_token();
@@ -3633,7 +3667,7 @@
 
          inline bool token_is(const token_t::token_type& ttype, const bool advance_token = true)
          {
-            if (current_token_.type != ttype)
+            if (current_token().type != ttype)
             {
                return false;
             }
@@ -3651,7 +3685,7 @@
                               const bool advance_token = true)
          {
             if (
-                 (current_token_.type != ttype) ||
+                 (current_token().type != ttype) ||
                  !exprtk::details::imatch(value,current_token().value)
                )
             {
@@ -3666,6 +3700,46 @@
             return true;
          }
 
+         inline bool token_is_then_assign(const token_t::token_type& ttype,
+                                          std::string& token,
+                                          const bool advance_token = true)
+         {
+            if (current_token_.type != ttype)
+            {
+               return false;
+            }
+
+            token = current_token_.value;
+
+            if (advance_token)
+            {
+               next_token();
+            }
+
+            return true;
+         }
+
+         template <typename Allocator,
+                   template <typename,typename> class Container>
+         inline bool token_is_then_assign(const token_t::token_type& ttype,
+                                          Container<std::string,Allocator>& token_list,
+                                          const bool advance_token = true)
+         {
+            if (current_token_.type != ttype)
+            {
+               return false;
+            }
+
+            token_list.push_back(current_token_.value);
+
+            if (advance_token)
+            {
+               next_token();
+            }
+
+            return true;
+         }
+
          inline bool peek_token_is(const token_t::token_type& ttype)
          {
             return (lexer_.peek_next_token().type == ttype);
@@ -3676,8 +3750,11 @@
             return (exprtk::details::imatch(lexer_.peek_next_token().value,s));
          }
 
+      private:
+
          generator_t lexer_;
          token_t     current_token_;
+         token_t     store_current_token_;
       };
    }
 
@@ -5038,8 +5115,6 @@
             switch (operation_)
             {
                case e_inrange : return (arg1 < arg0) ? T(0) : ((arg1 > arg2) ? T(0) : T(1));
-               case e_min     : return std::min<T>(std::min<T>(arg0,arg1),arg2);
-               case e_max     : return std::max<T>(std::max<T>(arg0,arg1),arg2);
                case e_clamp   : return (arg1 < arg0) ? arg0 : (arg1 > arg2 ? arg2 : arg1);
                case e_iclamp  : if ((arg1 <= arg0) || (arg1 >= arg2))
                                    return arg1;
@@ -15712,7 +15787,7 @@
    }
 
    template <typename T>
-   class parser
+   class parser : public lexer::parser_helper
    {
    private:
 
@@ -17202,13 +17277,13 @@
             return false;
          }
 
-         if (!lexer_.process(expression_string))
+         if (!init(expression_string))
          {
             process_lexer_errors();
             return false;
          }
 
-         if (lexer_.empty())
+         if (lexer().empty())
          {
             set_error(
                make_error(parser_error::e_syntax,
@@ -17225,12 +17300,13 @@
          symtab_store_.symtab_list_ = expr.get_symbol_table_list();
          dec_.clear();
 
-         lexer_.begin();
+         lexer().begin();
+
          next_token();
 
          expression_node_ptr e = parse_corpus();
 
-         if ((0 != e) && (token_t::e_eof == current_token_.type))
+         if ((0 != e) && (token_t::e_eof == current_token().type))
          {
             if (state_.return_stmt_present)
             {
@@ -17249,7 +17325,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR02 - Invalid expression encountered"));
             }
 
@@ -17268,13 +17344,13 @@
 
       void process_lexer_errors()
       {
-         for (std::size_t i = 0; i < lexer_.size(); ++i)
+         for (std::size_t i = 0; i < lexer().size(); ++i)
          {
-            if (lexer_[i].is_error())
+            if (lexer()[i].is_error())
             {
                std::string diagnostic = "ERR03 - ";
 
-               switch (lexer_[i].type)
+               switch (lexer()[i].type)
                {
                   case lexer::token::e_error      : diagnostic += "General token error";
                                                     break;
@@ -17296,8 +17372,8 @@
 
                set_error(
                   make_error(parser_error::e_lexer,
-                             lexer_[i],
-                             diagnostic + ": " + lexer_[i].value));
+                             lexer()[i],
+                             diagnostic + ": " + lexer()[i].value));
             }
          }
       }
@@ -17306,17 +17382,17 @@
       {
          if (settings_.commutative_check_enabled())
          {
-            helper_assembly_.run_inserters(lexer_);
+            helper_assembly_.run_inserters(lexer());
          }
 
          if (settings_.joiner_enabled())
          {
-            helper_assembly_.run_joiners(lexer_);
+            helper_assembly_.run_joiners(lexer());
          }
 
          if (settings_.replacer_enabled())
          {
-            helper_assembly_.run_modifiers(lexer_);
+            helper_assembly_.run_modifiers(lexer());
          }
 
          if (
@@ -17325,7 +17401,7 @@
               settings_.sequence_check_enabled()
             )
          {
-            if (!helper_assembly_.run_scanners(lexer_))
+            if (!helper_assembly_.run_scanners(lexer()))
             {
                if (helper_assembly_.error_token_scanner)
                {
@@ -17344,7 +17420,7 @@
                   {
                      for (std::size_t i = 0; i < numeric_checker_ptr->error_count(); ++i)
                      {
-                        lexer::token error_token = lexer_[numeric_checker_ptr->error_index(i)];
+                        lexer::token error_token = lexer()[numeric_checker_ptr->error_index(i)];
 
                         set_error(
                            make_error(parser_error::e_token,
@@ -17497,42 +17573,20 @@
                settings_.function_enabled(symbol);
       }
 
-      inline void store_token()
-      {
-         lexer_.store();
-         store_current_token_ = current_token_;
-      }
-
-      inline void restore_token()
-      {
-         lexer_.restore();
-         current_token_ = store_current_token_;
-      }
-
-      #ifndef exprtk_enable_debugging
+      #ifdef exprtk_enable_debugging
       inline void next_token()
       {
-         current_token_ = lexer_.next_token();
-      }
-      #else
-      inline void next_token()
-      {
-         std::string ct_str = current_token_.value;
-         current_token_ = lexer_.next_token();
+         std::string ct_str = current_token().value;
+         parser_helper::next_token();
          std::string depth(2 * state_.scope_depth,' ');
          exprtk_debug(("%s"
                        "prev[%s] --> curr[%s]\n",
                        depth.c_str(),
                        ct_str.c_str(),
-                       current_token_.value.c_str()));
+                       current_token().value.c_str()));
       }
       #endif
 
-      inline const lexer::token& current_token() const
-      {
-         return current_token_;
-      }
-
       inline expression_node_ptr parse_corpus()
       {
          std::vector<expression_node_ptr> arg_list;
@@ -17559,7 +17613,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR07 - Invalid expression encountered"));
                }
 
@@ -17586,11 +17640,11 @@
                exprtk_debug(("-------------------------------------------------\n"));
             }
 
-            if (lexer_.finished())
+            if (lexer().finished())
                break;
             else if (token_is(token_t::e_eof,false))
             {
-               if (lexer_.finished())
+               if (lexer().finished())
                   break;
                else
                   next_token();
@@ -17606,7 +17660,7 @@
 
       std::string construct_subexpr(lexer::token& begin_token, lexer::token& end_token)
       {
-         std::string result = lexer_.substr(begin_token.position,end_token.position);
+         std::string result = lexer().substr(begin_token.position,end_token.position);
 
          for (std::size_t i = 0; i < result.size(); ++i)
          {
@@ -17657,7 +17711,7 @@
          {
             current_state.reset();
 
-            switch (current_token_.type)
+            switch (current_token().type)
             {
                case token_t::e_assign : current_state.set(e_level00,e_level00,details::e_assign); break;
                case token_t::e_addass : current_state.set(e_level00,e_level00,details::e_addass); break;
@@ -17678,7 +17732,7 @@
                case token_t::e_mul    : current_state.set(e_level10,e_level11,details::   e_mul); break;
                case token_t::e_mod    : current_state.set(e_level10,e_level11,details::   e_mod); break;
                case token_t::e_pow    : current_state.set(e_level12,e_level12,details::   e_pow); break;
-               default                : if (token_t::e_symbol == current_token_.type)
+               default                : if (token_t::e_symbol == current_token().type)
                                         {
                                            static const std::string s_and   =   "and";
                                            static const std::string s_nand  =  "nand";
@@ -17692,12 +17746,12 @@
                                            static const std::string s_and1  =     "&";
                                            static const std::string s_or1   =     "|";
 
-                                           if (details::imatch(current_token_.value,s_and))
+                                           if (details::imatch(current_token().value,s_and))
                                            {
                                               current_state.set(e_level03,e_level04,details::e_and);
                                               break;
                                            }
-                                           else if (details::imatch(current_token_.value,s_and1))
+                                           else if (details::imatch(current_token().value,s_and1))
                                            {
                                               #ifndef exprtk_disable_sc_andor
                                               current_state.set(e_level03,e_level04,details::e_scand);
@@ -17706,17 +17760,17 @@
                                               #endif
                                               break;
                                            }
-                                           else if (details::imatch(current_token_.value,s_nand))
+                                           else if (details::imatch(current_token().value,s_nand))
                                            {
                                               current_state.set(e_level03,e_level04,details::e_nand);
                                               break;
                                            }
-                                           else if (details::imatch(current_token_.value,s_or))
+                                           else if (details::imatch(current_token().value,s_or))
                                            {
                                               current_state.set(e_level01,e_level02,details::e_or);
                                               break;
                                            }
-                                           else if (details::imatch(current_token_.value,s_or1))
+                                           else if (details::imatch(current_token().value,s_or1))
                                            {
                                               #ifndef exprtk_disable_sc_andor
                                               current_state.set(e_level01,e_level02,details::e_scor);
@@ -17725,32 +17779,32 @@
                                               #endif
                                               break;
                                            }
-                                           else if (details::imatch(current_token_.value,s_nor))
+                                           else if (details::imatch(current_token().value,s_nor))
                                            {
                                               current_state.set(e_level01,e_level02,details::e_nor);
                                               break;
                                            }
-                                           else if (details::imatch(current_token_.value,s_xor))
+                                           else if (details::imatch(current_token().value,s_xor))
                                            {
                                               current_state.set(e_level01,e_level02,details::e_xor);
                                               break;
                                            }
-                                           else if (details::imatch(current_token_.value,s_xnor))
+                                           else if (details::imatch(current_token().value,s_xnor))
                                            {
                                               current_state.set(e_level01,e_level02,details::e_xnor);
                                               break;
                                            }
-                                           else if (details::imatch(current_token_.value,s_in))
+                                           else if (details::imatch(current_token().value,s_in))
                                            {
                                               current_state.set(e_level03,e_level04,details::e_in);
                                               break;
                                            }
-                                           else if (details::imatch(current_token_.value,s_like))
+                                           else if (details::imatch(current_token().value,s_like))
                                            {
                                               current_state.set(e_level03,e_level04,details::e_like);
                                               break;
                                            }
-                                           else if (details::imatch(current_token_.value,s_ilike))
+                                           else if (details::imatch(current_token().value,s_ilike))
                                            {
                                               current_state.set(e_level03,e_level04,details::e_ilike);
                                               break;
@@ -17768,7 +17822,7 @@
             else if (current_state.left < precedence)
                break;
 
-            lexer::token prev_token = current_token_;
+            lexer::token prev_token = current_token();
 
             next_token();
 
@@ -17874,7 +17928,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR10 - Failed to find variable node in symbol table"));
                   free_node(node_allocator_,node);
 
@@ -18052,7 +18106,7 @@
             default : {
                          set_error(
                             make_error(parser_error::e_syntax,
-                                       current_token_,
+                                       current_token(),
                                        "ERR11 - Invalid number of parameters for function: '" + function_name + "'"));
 
                          return error_node();
@@ -18065,7 +18119,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR12 - Failed to generate call to function: '" + function_name + "'"));
 
             return error_node();
@@ -18079,7 +18133,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR13 - Expecting ifunction '" + function_name + "' to have non-zero parameter count"));
 
             return error_node();
@@ -18097,7 +18151,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR14 - Expecting argument list for function: '" + function_name + "'"));
 
             return error_node();
@@ -18111,7 +18165,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR15 - Failed to parse argument " + details::to_str(i) + " for function: '" + function_name + "'"));
 
                return error_node();
@@ -18122,7 +18176,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR16 - Invalid number of arguments for function: '" + function_name + "'"));
 
                   return error_node();
@@ -18134,7 +18188,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR17 - Invalid number of arguments for function: '" + function_name + "'"));
 
             return error_node();
@@ -18162,7 +18216,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR18 - Expecting '()' to proceed call to function: '" + function_name + "'"));
 
             free_node(node_allocator_,result);
@@ -18186,8 +18240,8 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
-                          "ERR19 - Expected a '(' at start of function call, instead got: '" + current_token_.value + "'"));
+                          current_token(),
+                          "ERR19 - Expected a '(' at start of function call, instead got: '" + current_token().value + "'"));
 
             return 0;
          }
@@ -18210,8 +18264,8 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
-                             "ERR20 - Expected a ',' between function input parameters, instead got: '" + current_token_.value + "'"));
+                             current_token(),
+                             "ERR20 - Expected a ',' between function input parameters, instead got: '" + current_token().value + "'"));
 
                return 0;
             }
@@ -18226,14 +18280,14 @@
       {
          typedef std::pair<base_ops_map_t::iterator,base_ops_map_t::iterator> map_range_t;
 
-         const std::string operation_name = current_token_.value;
+         const std::string operation_name = current_token().value;
          map_range_t itr_range = base_ops_map_.equal_range(operation_name);
 
          if (0 == std::distance(itr_range.first,itr_range.second))
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR21 - No entry found for base operation: " + operation_name));
 
             return error_node();
@@ -18283,7 +18337,7 @@
 
          set_error(
             make_error(parser_error::e_syntax,
-                       current_token_,
+                       current_token(),
                        "ERR22 - Invalid number of parameters for call to function: '" + operation_name + "'"));
 
          return error_node();
@@ -18302,7 +18356,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR23 - Expected ',' between if-statement condition and consequent"));
             result = false;
          }
@@ -18310,7 +18364,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR24 - Failed to parse consequent for if-statement"));
             result = false;
          }
@@ -18318,7 +18372,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR25 - Expected ',' between if-statement consequent and alternative"));
             result = false;
          }
@@ -18326,7 +18380,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR26 - Failed to parse alternative for if-statement"));
             result = false;
          }
@@ -18334,7 +18388,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR27 - Expected ')' at the end of if-statement"));
             result = false;
          }
@@ -18355,7 +18409,7 @@
 
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR28 - Return types of ternary if-statement differ"));
 
                result = false;
@@ -18389,7 +18443,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR29 - Failed to parse body of consequent for if-statement"));
                result = false;
             }
@@ -18410,7 +18464,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR30 - Expected ';' at the end of the consequent for if-statement"));
                   result = false;
                }
@@ -18419,7 +18473,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR31 - Failed to parse body of consequent for if-statement"));
                result = false;
             }
@@ -18427,7 +18481,7 @@
 
          if (result)
          {
-            if (details::imatch(current_token_.value,"else"))
+            if (details::imatch(current_token().value,"else"))
             {
                next_token();
 
@@ -18437,18 +18491,18 @@
                   {
                      set_error(
                         make_error(parser_error::e_syntax,
-                                   current_token_,
+                                   current_token(),
                                    "ERR32 - Failed to parse body of the 'else' for if-statement"));
                      result = false;
                   }
                }
-               else if (details::imatch(current_token_.value,"if"))
+               else if (details::imatch(current_token().value,"if"))
                {
                   if (0 == (alternative = parse_conditional_statement()))
                   {
                      set_error(
                         make_error(parser_error::e_syntax,
-                                   current_token_,
+                                   current_token(),
                                    "ERR33 - Failed to parse body of if-else statement"));
                      result = false;
                   }
@@ -18459,7 +18513,7 @@
                   {
                      set_error(
                         make_error(parser_error::e_syntax,
-                                   current_token_,
+                                   current_token(),
                                    "ERR34 - Expected ';' at the end of the 'else-if' for the if-statement"));
                      result = false;
                   }
@@ -18468,7 +18522,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR35 - Failed to parse body of the 'else' for if-statement"));
                   result = false;
                }
@@ -18491,7 +18545,7 @@
 
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR36 - Return types of ternary if-statement differ"));
 
                result = false;
@@ -18522,8 +18576,8 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
-                          "ERR37 - Expected '(' at start of if-statement, instead got: '" + current_token_.value + "'"));
+                          current_token(),
+                          "ERR37 - Expected '(' at start of if-statement, instead got: '" + current_token().value + "'"));
 
             return error_node();
          }
@@ -18531,7 +18585,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR38 - Failed to parse condition for if-statement"));
 
             return error_node();
@@ -18562,7 +18616,7 @@
 
          set_error(
             make_error(parser_error::e_syntax,
-                       current_token_,
+                       current_token(),
                        "ERR39 - Invalid if-statement"));
 
          free_node(node_allocator_,condition);
@@ -18582,7 +18636,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR40 - Encountered invalid condition branch for ternary if-statement"));
 
             return error_node();
@@ -18591,7 +18645,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR41 - Expected '?' after condition of ternary if-statement"));
 
             result = false;
@@ -18600,7 +18654,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR42 - Failed to parse consequent for ternary if-statement"));
 
             result = false;
@@ -18609,7 +18663,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR43 - Expected ':' between ternary if-statement consequent and alternative"));
 
             result = false;
@@ -18618,7 +18672,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR44 - Failed to parse alternative for ternary if-statement"));
 
             result = false;
@@ -18640,7 +18694,7 @@
 
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR45 - Return types of ternary if-statement differ"));
 
                result = false;
@@ -18676,7 +18730,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR46 - Expected '(' at start of while-loop condition statement"));
 
             return error_node();
@@ -18685,7 +18739,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR47 - Failed to parse condition for while-loop"));
 
             return error_node();
@@ -18694,7 +18748,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR48 - Expected ')' at end of while-loop condition statement"));
             result = false;
          }
@@ -18707,7 +18761,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR49 - Failed to parse body of while-loop"));
                result = false;
             }
@@ -18717,7 +18771,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR50 - Failed to synthesize while-loop"));
                result = false;
             }
@@ -18751,7 +18805,7 @@
 
          brkcnt_list_.push_front(false);
 
-         if (details::imatch(current_token_.value,"until"))
+         if (details::imatch(current_token().value,"until"))
          {
             next_token();
             branch = node_allocator_.allocate<details::null_node<T> >();
@@ -18778,7 +18832,7 @@
                   side_effect_list.push_back(state_.side_effect_present);
                }
 
-               if (details::imatch(current_token_.value,"until"))
+               if (details::imatch(current_token().value,"until"))
                {
                   next_token();
                   break;
@@ -18791,13 +18845,13 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR51 - Expected '" + token_t::to_str(seperator) + "' in body of repeat until loop"));
 
                   return error_node();
                }
 
-               if (details::imatch(current_token_.value,"until"))
+               if (details::imatch(current_token().value,"until"))
                {
                   next_token();
                   break;
@@ -18812,7 +18866,7 @@
 
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR52 - Failed to parse body of repeat until loop"));
 
                return error_node();
@@ -18825,7 +18879,7 @@
 
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR53 - Expected '(' before condition statement of repeat until loop"));
 
             free_node(node_allocator_,branch);
@@ -18838,7 +18892,7 @@
 
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR54 - Failed to parse condition for repeat until loop"));
 
             free_node(node_allocator_,branch);
@@ -18849,7 +18903,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR55 - Expected ')' after condition of repeat until loop"));
 
             free_node(node_allocator_,    branch);
@@ -18869,7 +18923,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR56 - Failed to synthesize repeat until loop"));
 
             free_node(node_allocator_, condition);
@@ -18903,7 +18957,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR57 - Expected '(' at start of for-loop"));
 
             return error_node();
@@ -18913,7 +18967,7 @@
          {
             if (
                  !token_is(token_t::e_symbol,false) &&
-                 details::imatch(current_token_.value,"var")
+                 details::imatch(current_token().value,"var")
                )
             {
                next_token();
@@ -18922,7 +18976,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR58 - Expected a variable at the start of initialiser section of for-loop"));
 
                   return error_node();
@@ -18931,13 +18985,13 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR59 - Expected variable assignment of initialiser section of for-loop"));
 
                   return error_node();
                }
 
-               loop_counter_symbol = current_token_.value;
+               loop_counter_symbol = current_token().value;
 
                se = &sem_.get_element(loop_counter_symbol);
 
@@ -18945,7 +18999,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR60 - For-loop variable '" + loop_counter_symbol+ "' is being shadowed by a previous declaration"));
 
                   return error_node();
@@ -18976,7 +19030,7 @@
                      {
                         set_error(
                            make_error(parser_error::e_syntax,
-                                      current_token_,
+                                      current_token(),
                                       "ERR61 - Failed to add new local variable '" + loop_counter_symbol + "' to SEM"));
 
                         sem_.free_element(nse);
@@ -18997,7 +19051,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR62 - Failed to parse initialiser of for-loop"));
                result = false;
             }
@@ -19005,7 +19059,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR63 - Expected ';' after initialiser of for-loop"));
                result = false;
             }
@@ -19017,7 +19071,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR64 - Failed to parse condition of for-loop"));
                result = false;
             }
@@ -19025,7 +19079,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR65 - Expected ';' after condition section of for-loop"));
                result = false;
             }
@@ -19037,7 +19091,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR66 - Failed to parse incrementor of for-loop"));
                result = false;
             }
@@ -19045,7 +19099,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR67 - Expected ')' after incrementor section of for-loop"));
                result = false;
             }
@@ -19058,7 +19112,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR68 - Failed to parse body of for-loop"));
                result = false;
             }
@@ -19104,11 +19158,11 @@
          std::vector<expression_node_ptr> arg_list;
          expression_node_ptr result = error_node();
 
-         if (!details::imatch(current_token_.value,"switch"))
+         if (!details::imatch(current_token().value,"switch"))
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR69 - Expected keyword 'switch'"));
 
             return error_node();
@@ -19122,7 +19176,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR70 - Expected '{' for call to switch statement"));
 
             return error_node();
@@ -19130,11 +19184,11 @@
 
          for ( ; ; )
          {
-            if (!details::imatch("case",current_token_.value))
+            if (!details::imatch("case",current_token().value))
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR71 - Expected either a 'case' or 'default' statement"));
 
                return error_node();
@@ -19150,7 +19204,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR72 - Expected ':' for case of switch statement"));
 
                return error_node();
@@ -19164,7 +19218,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR73 - Expected ';' at end of case for switch statement"));
 
                return error_node();
@@ -19185,14 +19239,14 @@
                arg_list.push_back(consequent);
             }
 
-            if (details::imatch("default",current_token_.value))
+            if (details::imatch("default",current_token().value))
             {
                next_token();
                if (!token_is(token_t::e_colon))
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR74 - Expected ':' for default of switch statement"));
 
                   return error_node();
@@ -19206,7 +19260,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR75 - Expected ';' at end of default for switch statement"));
 
                   return error_node();
@@ -19221,7 +19275,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR76 - Expected '}' at end of switch statement"));
 
             return error_node();
@@ -19239,11 +19293,11 @@
          std::vector<expression_node_ptr> arg_list;
          expression_node_ptr result = error_node();
 
-         if (!details::imatch(current_token_.value,"[*]"))
+         if (!details::imatch(current_token().value,"[*]"))
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR77 - Expected token '[*]'"));
 
             return error_node();
@@ -19257,7 +19311,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR78 - Expected '{' for call to [*] statement"));
 
             return error_node();
@@ -19265,11 +19319,11 @@
 
          for ( ; ; )
          {
-            if (!details::imatch("case",current_token_.value))
+            if (!details::imatch("case",current_token().value))
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR79 - Expected a 'case' statement for multi-switch"));
 
                return error_node();
@@ -19286,7 +19340,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR80 - Expected ':' for case of [*] statement"));
 
                return error_node();
@@ -19301,7 +19355,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR81 - Expected ';' at end of case for [*] statement"));
 
                return error_node();
@@ -19332,7 +19386,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR82 - Expected '}' at end of [*] statement"));
 
             return error_node();
@@ -19351,7 +19405,7 @@
          expression_node_ptr result = error_node();
 
          details::operator_type opt_type = details::e_default;
-         const std::string symbol = current_token_.value;
+         const std::string symbol = current_token().value;
 
          if (details::imatch(symbol,"~"))
          {
@@ -19373,7 +19427,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR83 - Unsupported vararg function: " + symbol));
 
             return error_node();
@@ -19388,7 +19442,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR84 - Expected '(' for call to vararg function: " + symbol));
 
             return error_node();
@@ -19409,7 +19463,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR85 - Expected ',' for call to vararg function: " + symbol));
 
                return error_node();
@@ -19429,7 +19483,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR86 - Expected '[' as start of string range definition"));
 
             free_node(node_allocator_,expression);
@@ -19456,7 +19510,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR87 - Failed to generate string range node"));
 
             free_node(node_allocator_,expression);
@@ -19588,7 +19642,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR88 - Expected '" + token_t::to_str(close_bracket) + "' for call to multi-sequence" +
                              ((!source.empty()) ? std::string(" section of " + source): "")));
 
@@ -19634,7 +19688,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR89 - Expected '" + details::to_str(seperator) + "' for call to multi-sequence section of " + source));
 
                return error_node();
@@ -19667,7 +19721,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR90 - Expected '[' for start of range"));
 
             return false;
@@ -19687,7 +19741,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR91 - Failed parse begin section of range"));
 
                return false;
@@ -19710,7 +19764,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR92 - Range lower bound less than zero! Constraint: r0 >= 0"));
 
                   return false;
@@ -19726,7 +19780,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR93 - Expected ':' for break  in range"));
 
                rp.free();
@@ -19747,7 +19801,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR94 - Failed parse end section of range"));
 
                rp.free();
@@ -19771,7 +19825,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR95 - Range upper bound less than zero! Constraint: r1 >= 0"));
 
                   return false;
@@ -19787,7 +19841,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR96 - Expected ']' for start of range"));
 
                rp.free();
@@ -19806,7 +19860,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR97 - Invalid range, Constraint: r0 <= r1"));
 
                return false;
@@ -19824,13 +19878,13 @@
 
       inline expression_node_ptr parse_string()
       {
-         const std::string symbol = current_token_.value;
+         const std::string symbol = current_token().value;
 
          if (!symtab_store_.is_conststr_stringvar(symbol))
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR98 - Unknown string symbol"));
 
             return error_node();
@@ -19898,7 +19952,7 @@
 
       inline expression_node_ptr parse_const_string()
       {
-         const std::string const_str = current_token_.value;
+         const std::string const_str = current_token().value;
          expression_node_ptr result = expression_generator_(const_str);
 
          if (peek_token_is(token_t::e_lsqrbracket))
@@ -19939,7 +19993,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR99 - Overflow in range for string: '" + const_str + "'[" +
                              (rp.n0_c.first ? details::to_str(rp.n0_c.second) : "?") + ":" +
                              (rp.n1_c.first ? details::to_str(rp.n1_c.second) : "?") + "]"));
@@ -19960,7 +20014,7 @@
 
       inline expression_node_ptr parse_vector()
       {
-         const std::string symbol = current_token_.value;
+         const std::string symbol = current_token().value;
 
          vector_holder_ptr vec = vector_holder_ptr(0);
 
@@ -19976,7 +20030,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR100 - Symbol '" + symbol+ " not a vector"));
 
                return error_node();
@@ -20001,7 +20055,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR101 - Failed to parse index for vector: '" + symbol + "'"));
 
             return error_node();
@@ -20010,7 +20064,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR102 - Expected ']' for index of vector: '" + symbol + "'"));
 
             free_node(node_allocator_,index_expr);
@@ -20049,7 +20103,7 @@
                   {
                      set_error(
                         make_error(parser_error::e_syntax,
-                                   current_token_,
+                                   current_token(),
                                    "ERR103 - Expected ',' for call to vararg function: " + vararg_function_name));
 
                      return error_node();
@@ -20257,7 +20311,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR108 - Type checker instantiation failure for generic function: " + function_name));
 
             return error_node();
@@ -20289,7 +20343,7 @@
                   {
                      set_error(
                         make_error(parser_error::e_syntax,
-                                   current_token_,
+                                   current_token(),
                                    "ERR109 - Expected ',' for call to generic function: " + function_name));
 
                      return error_node();
@@ -20304,7 +20358,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR110 - Expected ',' for call to generic function: " + function_name));
 
             return error_node();
@@ -20370,7 +20424,7 @@
                   {
                      set_error(
                         make_error(parser_error::e_syntax,
-                                   current_token_,
+                                   current_token(),
                                    "ERR111 - Expected ',' for call to string function: " + function_name));
 
                      return error_node();
@@ -20385,7 +20439,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR112 - Expected ',' for call to string function: " + function_name));
 
             return error_node();
@@ -20464,26 +20518,26 @@
       {
          // Expect: $fDD(expr0,expr1,expr2) or $fDD(expr0,expr1,expr2,expr3)
          if (
-              !details::is_digit(current_token_.value[2]) ||
-              !details::is_digit(current_token_.value[3])
+              !details::is_digit(current_token().value[2]) ||
+              !details::is_digit(current_token().value[3])
             )
          {
             set_error(
                make_error(parser_error::e_token,
-                          current_token_,
-                          "ERR115 - Invalid special function[1]: " + current_token_.value));
+                          current_token(),
+                          "ERR115 - Invalid special function[1]: " + current_token().value));
 
             return error_node();
          }
 
-         const unsigned int id = (current_token_.value[2] - '0') * 10 + (current_token_.value[3] - '0');
+         const unsigned int id = (current_token().value[2] - '0') * 10 + (current_token().value[3] - '0');
 
          if (id >= details::e_sffinal)
          {
             set_error(
                make_error(parser_error::e_token,
-                          current_token_,
-                          "ERR116 - Invalid special function[2]: " + current_token_.value));
+                          current_token(),
+                          "ERR116 - Invalid special function[2]: " + current_token().value));
 
             return error_node();
          }
@@ -20513,7 +20567,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR117 - Break call within a break call is not allowed"));
 
             return error_node();
@@ -20535,7 +20589,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR118 - Failed to parse return expression for 'break' statement"));
 
                   return error_node();
@@ -20544,7 +20598,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR119 - Expected ']' at the completion of break's return expression"));
 
                   free_node(node_allocator_,return_expr);
@@ -20561,7 +20615,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR120 - Invalid use of 'break', allowed only in the scope of a loop"));
          }
 
@@ -20583,7 +20637,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR121 - Invalid use of 'continue', allowed only in the scope of a loop"));
 
             return error_node();
@@ -20599,7 +20653,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR122 - Expected '[' as part of vector size definition"));
 
             return error_node();
@@ -20608,7 +20662,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR123 - Failed to determine size of vector '" + vec_name + "'"));
 
             return error_node();
@@ -20619,7 +20673,7 @@
 
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR124 - Expected a literal number as size of vector '" + vec_name + "'"));
 
             return error_node();
@@ -20637,7 +20691,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR125 - Invalid vector size. Must be an integer greater than zero, size: " +
                           details::to_str(details::numeric::to_int32(vector_size))));
 
@@ -20654,7 +20708,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR126 - Expected ']' as part of vector size definition"));
 
             return error_node();
@@ -20665,7 +20719,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR127 - Expected ':=' as part of vector definition"));
 
                return error_node();
@@ -20678,7 +20732,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR128 - Failed to parse single vector initialiser"));
 
                   return error_node();
@@ -20690,7 +20744,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR129 - Expected ']' to close single value vector initialiser"));
 
                   return error_node();
@@ -20702,7 +20756,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR130 - Expected '{' as part of vector initialiser list"));
 
                return error_node();
@@ -20717,7 +20771,7 @@
                   {
                      set_error(
                         make_error(parser_error::e_syntax,
-                                   current_token_,
+                                   current_token(),
                                    "ERR131 - Expected '{' as part of vector initialiser list"));
 
                      return error_node();
@@ -20734,7 +20788,7 @@
                   {
                      set_error(
                         make_error(parser_error::e_syntax,
-                                   current_token_,
+                                   current_token(),
                                    "ERR132 - Expected ',' between vector initialisers"));
 
                      return error_node();
@@ -20755,7 +20809,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR133 - Expected ';' at end of vector definition"));
 
                   return error_node();
@@ -20766,7 +20820,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR134 - Initialiser list larger than the number of elements in the vector: '" + vec_name + "'"));
 
                return error_node();
@@ -20785,7 +20839,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR135 - Illegal redefinition of local vector: '" + vec_name + "'"));
 
                return error_node();
@@ -20818,7 +20872,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR136 - Failed to add new local vector '" + vec_name + "' to SEM"));
 
                sem_.free_element(nse);
@@ -20863,7 +20917,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR137 - Illegal redefinition of local variable: '" + str_name + "'"));
 
                free_node(node_allocator_,initialisation_expression);
@@ -20894,7 +20948,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR138 - Failed to add new local string variable '" + str_name + "' to SEM"));
 
                free_node(node_allocator_,initialisation_expression);
@@ -20939,19 +20993,19 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR139 - Illegal variable definition"));
 
             return error_node();
          }
-         else if (!details::imatch(current_token_.value,"var"))
+         else if (!details::imatch(current_token().value,"var"))
          {
             return error_node();
          }
          else
             next_token();
 
-         const std::string var_name = current_token_.value;
+         const std::string var_name = current_token().value;
 
          expression_node_ptr initialisation_expression = error_node();
 
@@ -20959,7 +21013,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR140 - Expected a symbol for variable definition"));
 
             return error_node();
@@ -20968,7 +21022,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR141 - Illegal redefinition of reserved keyword: '" + var_name + "'"));
 
             return error_node();
@@ -20977,7 +21031,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR142 - Illegal redefinition of variable '" + var_name + "'"));
 
             return error_node();
@@ -20986,7 +21040,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR143 - Illegal redefinition of local variable: '" + var_name + "'"));
 
             return error_node();
@@ -21005,7 +21059,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR144 - Failed to parse initialisation expression"));
 
                return error_node();
@@ -21022,7 +21076,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR145 - Expected ';' after variable definition"));
 
                free_node(node_allocator_,initialisation_expression);
@@ -21049,7 +21103,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR146 - Illegal redefinition of local variable: '" + var_name + "'"));
 
                free_node(node_allocator_,initialisation_expression);
@@ -21080,7 +21134,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR147 - Failed to add new local variable '" + var_name + "' to SEM"));
 
                free_node(node_allocator_,initialisation_expression);
@@ -21116,7 +21170,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR148 - Expected a '{}' for uninitialised var definition"));
 
             return error_node();
@@ -21125,7 +21179,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR149 - Expected ';' after uninitialised variable definition"));
 
             return error_node();
@@ -21141,7 +21195,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR150 - Illegal redefinition of local variable: '" + var_name + "'"));
 
                return error_node();
@@ -21170,7 +21224,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR151 - Failed to add new local variable '" + var_name + "' to SEM"));
 
                sem_.free_element(nse);
@@ -21191,7 +21245,7 @@
 
       inline expression_node_ptr parse_swap_statement()
       {
-         if (!details::imatch(current_token_.value,"swap"))
+         if (!details::imatch(current_token().value,"swap"))
          {
             return error_node();
          }
@@ -21202,7 +21256,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR152 - Expected '(' at start of swap statement"));
 
             return error_node();
@@ -21214,13 +21268,13 @@
          bool variable0_generated = false;
          bool variable1_generated = false;
 
-         const std::string var0_name = current_token_.value;
+         const std::string var0_name = current_token().value;
 
          if (!token_is(token_t::e_symbol,false))
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR153 - Expected a symbol for variable or vector element definition"));
 
             return error_node();
@@ -21231,7 +21285,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR154 - First parameter to swap is an invalid vector element: '" + var0_name + "'"));
 
                return error_node();
@@ -21263,7 +21317,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR155 - First parameter to swap is an invalid variable: '" + var0_name + "'"));
 
                return error_node();
@@ -21287,13 +21341,13 @@
             return error_node();
          }
 
-         const std::string var1_name = current_token_.value;
+         const std::string var1_name = current_token().value;
 
          if (!token_is(token_t::e_symbol,false))
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR157 - Expected a symbol for variable or vector element definition"));
 
             if (variable0_generated)
@@ -21309,7 +21363,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR158 - Second parameter to swap is an invalid vector element: '" + var1_name + "'"));
 
                if (variable0_generated)
@@ -21346,7 +21400,7 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR159 - Second parameter to swap is an invalid variable: '" + var1_name + "'"));
 
                if (variable0_generated)
@@ -21364,7 +21418,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR160 - Expected ')' at end of swap statement"));
 
             if (variable0_generated)
@@ -21417,7 +21471,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR161 - Return call within a return call is not allowed"));
 
             return error_node();
@@ -21429,7 +21483,7 @@
 
          scoped_vec_delete<expression_node_t> sdd(*this,arg_list);
 
-         if (!details::imatch(current_token_.value,"return"))
+         if (!details::imatch(current_token().value,"return"))
          {
             return error_node();
          }
@@ -21440,7 +21494,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR162 - Expected '[' at start of return statement"));
 
             return error_node();
@@ -21463,7 +21517,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR163 - Expected ',' between values during call to return"));
 
                   return error_node();
@@ -21471,7 +21525,7 @@
             }
          }
 
-         lexer::token prev_token = current_token_;
+         lexer::token prev_token = current_token();
 
          if (token_is(token_t::e_rsqrbracket))
          {
@@ -21509,13 +21563,13 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR165 - Invalid sequence of variable '"+ symbol + "' and bracket"));
 
                return false;
             }
 
-            lexer_.insert_front(token_t::e_mul);
+            lexer().insert_front(token_t::e_mul);
          }
 
          return true;
@@ -21554,15 +21608,15 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
+                             current_token(),
                              "ERR166 - Invalid sequence of brackets"));
 
                return false;
             }
-            else if (token_t::e_eof != current_token_.type)
+            else if (token_t::e_eof != current_token().type)
             {
-               lexer_.insert_front(current_token_.type);
-               lexer_.insert_front(token_t::e_mul);
+               lexer().insert_front(current_token().type);
+               lexer().insert_front(token_t::e_mul);
                next_token();
             }
          }
@@ -21572,7 +21626,7 @@
 
       inline expression_node_ptr parse_symtab_symbol()
       {
-         const std::string symbol = current_token_.value;
+         const std::string symbol = current_token().value;
 
          // Are we dealing with a variable or a special constant?
          expression_node_ptr variable = symtab_store_.get_variable(symbol);
@@ -21655,7 +21709,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR167 - Failed to generate node for function: '" + symbol + "'"));
 
                   return error_node();
@@ -21680,7 +21734,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR168 - Failed to generate node for vararg function: '" + symbol + "'"));
 
                   return error_node();
@@ -21705,7 +21759,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR169 - Failed to generate node for generic function: '" + symbol + "'"));
 
                   return error_node();
@@ -21730,7 +21784,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR170 - Failed to generate node for string function: '" + symbol + "'"));
 
                   return error_node();
@@ -21751,7 +21805,7 @@
                {
                   set_error(
                      make_error(parser_error::e_syntax,
-                                current_token_,
+                                current_token(),
                                 "ERR171 - Invalid use of reserved symbol '" + symbol + "'"));
 
                   return error_node();
@@ -21808,7 +21862,7 @@
 
                   set_error(
                      make_error(parser_error::e_symtab,
-                                current_token_,
+                                current_token(),
                                 "ERR172 - Failed to create variable: '" + symbol + "'"));
 
                   return error_node();
@@ -21818,7 +21872,7 @@
 
          set_error(
             make_error(parser_error::e_syntax,
-                       current_token_,
+                       current_token(),
                        "ERR173 - Undefined symbol: '" + symbol + "'"));
 
          return error_node();
@@ -21838,76 +21892,76 @@
          static const std::string symbol_swap     = "swap"    ;
          static const std::string symbol_return   = "return"  ;
 
-         if (valid_vararg_operation(current_token_.value))
+         if (valid_vararg_operation(current_token().value))
          {
             return parse_vararg_function();
          }
-         else if (valid_base_operation(current_token_.value))
+         else if (valid_base_operation(current_token().value))
          {
             return parse_base_operation();
          }
          else if (
-                   details::imatch(current_token_.value,symbol_if) &&
-                   settings_.control_struct_enabled(current_token_.value)
+                   details::imatch(current_token().value,symbol_if) &&
+                   settings_.control_struct_enabled(current_token().value)
                  )
          {
             return parse_conditional_statement();
          }
          else if (
-                   details::imatch(current_token_.value,symbol_while) &&
-                   settings_.control_struct_enabled(current_token_.value)
+                   details::imatch(current_token().value,symbol_while) &&
+                   settings_.control_struct_enabled(current_token().value)
                  )
          {
             return parse_while_loop();
          }
          else if (
-                   details::imatch(current_token_.value,symbol_repeat) &&
-                   settings_.control_struct_enabled(current_token_.value)
+                   details::imatch(current_token().value,symbol_repeat) &&
+                   settings_.control_struct_enabled(current_token().value)
                  )
          {
             return parse_repeat_until_loop();
          }
          else if (
-                   details::imatch(current_token_.value,symbol_for) &&
-                   settings_.control_struct_enabled(current_token_.value)
+                   details::imatch(current_token().value,symbol_for) &&
+                   settings_.control_struct_enabled(current_token().value)
                  )
          {
             return parse_for_loop();
          }
          else if (
-                   details::imatch(current_token_.value,symbol_switch) &&
-                   settings_.control_struct_enabled(current_token_.value)
+                   details::imatch(current_token().value,symbol_switch) &&
+                   settings_.control_struct_enabled(current_token().value)
                  )
          {
             return parse_switch_statement();
          }
-         else if (details::is_valid_sf_symbol(current_token_.value))
+         else if (details::is_valid_sf_symbol(current_token().value))
          {
             return parse_special_function();
          }
-         else if (details::imatch(current_token_.value,symbol_null))
+         else if (details::imatch(current_token().value,symbol_null))
          {
             return parse_null_statement();
          }
          #ifndef exprtk_disable_break_continue
-         else if (details::imatch(current_token_.value,symbol_break))
+         else if (details::imatch(current_token().value,symbol_break))
          {
             return parse_break_statement();
          }
-         else if (details::imatch(current_token_.value,symbol_continue))
+         else if (details::imatch(current_token().value,symbol_continue))
          {
             return parse_continue_statement();
          }
          #endif
-         else if (details::imatch(current_token_.value,symbol_var))
+         else if (details::imatch(current_token().value,symbol_var))
          {
             return parse_define_var_statement();
          }
-         else if (details::imatch(current_token_.value,symbol_swap))
+         else if (details::imatch(current_token().value,symbol_swap))
          {
             return parse_swap_statement();
          }
-         else if (details::imatch(current_token_.value,symbol_return))
+         else if (details::imatch(current_token().value,symbol_return))
          {
             return parse_return_statement();
          }
@@ -21919,8 +21973,8 @@
          {
             set_error(
                make_error(parser_error::e_symtab,
-                          current_token_,
-                          "ERR174 - Variable or function detected, yet symbol-table is invalid, Symbol: " + current_token_.value));
+                          current_token(),
+                          "ERR174 - Variable or function detected, yet symbol-table is invalid, Symbol: " + current_token().value));
 
             return error_node();
          }
@@ -21930,11 +21984,11 @@
       {
          expression_node_ptr branch = error_node();
 
-         if (token_t::e_number == current_token_.type)
+         if (token_t::e_number == current_token().type)
          {
             T numeric_value = T(0);
 
-            if (details::string_to_real(current_token_.value,numeric_value))
+            if (details::string_to_real(current_token().value,numeric_value))
             {
                expression_node_ptr literal_exp = expression_generator_(numeric_value);
                next_token();
@@ -21944,23 +21998,23 @@
             {
                set_error(
                   make_error(parser_error::e_numeric,
-                             current_token_,
-                             "ERR175 - Failed to convert '" + current_token_.value + "' to a number"));
+                             current_token(),
+                             "ERR175 - Failed to convert '" + current_token().value + "' to a number"));
 
                return error_node();
             }
          }
-         else if (token_t::e_symbol == current_token_.type)
+         else if (token_t::e_symbol == current_token().type)
          {
             branch = parse_symbol();
          }
          #ifndef exprtk_disable_string_capabilities
-         else if (token_t::e_string == current_token_.type)
+         else if (token_t::e_string == current_token().type)
          {
             branch = parse_const_string();
          }
          #endif
-         else if (token_t::e_lbracket == current_token_.type)
+         else if (token_t::e_lbracket == current_token().type)
          {
             next_token();
 
@@ -21970,8 +22024,8 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
-                             "ERR176 - Expected ')' instead of: '" + current_token_.value + "'"));
+                             current_token(),
+                             "ERR176 - Expected ')' instead of: '" + current_token().value + "'"));
 
                free_node(node_allocator_,branch);
 
@@ -21984,7 +22038,7 @@
                return error_node();
             }
          }
-         else if (token_t::e_lsqrbracket == current_token_.type)
+         else if (token_t::e_lsqrbracket == current_token().type)
          {
             next_token();
 
@@ -21994,8 +22048,8 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
-                             "ERR177 - Expected ']' instead of: '" + current_token_.value + "'"));
+                             current_token(),
+                             "ERR177 - Expected ']' instead of: '" + current_token().value + "'"));
 
                free_node(node_allocator_,branch);
 
@@ -22008,7 +22062,7 @@
                return error_node();
             }
          }
-         else if (token_t::e_lcrlbracket == current_token_.type)
+         else if (token_t::e_lcrlbracket == current_token().type)
          {
             next_token();
 
@@ -22018,8 +22072,8 @@
             {
                set_error(
                   make_error(parser_error::e_syntax,
-                             current_token_,
-                             "ERR178 - Expected '}' instead of: '" + current_token_.value + "'"));
+                             current_token(),
+                             "ERR178 - Expected '}' instead of: '" + current_token().value + "'"));
 
                free_node(node_allocator_,branch);
 
@@ -22032,7 +22086,7 @@
                return error_node();
             }
          }
-         else if (token_t::e_sub == current_token_.type)
+         else if (token_t::e_sub == current_token().type)
          {
             next_token();
             branch = parse_expression(e_level11);
@@ -22048,16 +22102,16 @@
                branch = expression_generator_(details::e_neg,branch);
             }
          }
-         else if (token_t::e_add == current_token_.type)
+         else if (token_t::e_add == current_token().type)
          {
             next_token();
             branch = parse_expression(e_level13);
          }
-         else if (token_t::e_eof == current_token_.type)
+         else if (token_t::e_eof == current_token().type)
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR179 - Premature end of expression[1]"));
 
             return error_node();
@@ -22066,7 +22120,7 @@
          {
             set_error(
                make_error(parser_error::e_syntax,
-                          current_token_,
+                          current_token(),
                           "ERR180 - Premature end of expression[2]"));
 
             return error_node();
@@ -22086,31 +22140,6 @@
          return branch;
       }
 
-      inline bool token_is(const typename token_t::token_type& ttype, const bool advance_token = true)
-      {
-         if (current_token_.type != ttype)
-         {
-            return false;
-         }
-
-         if (advance_token)
-         {
-            next_token();
-         }
-
-         return true;
-      }
-
-      inline bool peek_token_is(const typename token_t::token_type& ttype)
-      {
-         return (lexer_.peek_next_token().type == ttype);
-      }
-
-      inline bool peek_token_is(const std::string& s)
-      {
-         return (details::imatch(lexer_.peek_next_token().value,s));
-      }
-
       template <typename Type>
       class expression_generator
       {
@@ -30604,9 +30633,6 @@
       parser<T>& operator=(const parser<T>&);
 
       settings_store settings_;
-      lexer::generator lexer_;
-      lexer::token current_token_;
-      lexer::token store_current_token_;
       expression_generator<T> expression_generator_;
       details::node_allocator node_allocator_;
       symtab_store symtab_store_;
diff --git a/exprtk_test.cpp b/exprtk_test.cpp
index 8880684..4fb297a 100644
--- a/exprtk_test.cpp
+++ b/exprtk_test.cpp
@@ -1035,30 +1035,30 @@
                     test_t("((1 + 1) < (3 + 3) ? 7 : 9) == 7",1.0),
                     test_t("(min(1,2) ? 1 + 3 : 1 + 4) == 4",1.0),
                     test_t("(min(0,1) ? 1 + 3 : 1 + 4) == 5",1.0),
-                    test_t("if(1 < 2) 3; == 3",1.0),
-                    test_t("if(1 > 2) 3; == null",1.0),
-                    test_t("if(1 < 2) 3; else 4; == 3",1.0),
-                    test_t("if(1 > 2) 3; else 4; == 4",1.0),
-                    test_t("if(1 < 2) 3; else {1+2; 4;} == 3",1.0),
-                    test_t("if(1 > 2) 3; else {1+2; 4;} == 4",1.0),
-                    test_t("if(1 < 2) 3; else if (1 < 2) 4; == 3",1.0),
-                    test_t("if(1 > 2) 3; else if (1 < 2) 4; == 4",1.0),
-                    test_t("if(1 > 2) 3; else if (1 > 2) 4; == null",1.0),
-                    test_t("if(1 < 2) 3; else if (1 < 2) {1+2; 4;} == 3",1.0),
-                    test_t("if(1 > 2) 3; else if (1 < 2) {1+2; 4;} == 4",1.0),
-                    test_t("if(1 > 2) 3; else if (1 > 2) {1+2; 4;} == null",1.0),
-                    test_t("if(1 < 2) { 1+2; 3;} == 3",1.0),
-                    test_t("if(1 > 2) { 1+2; 3;} == null",1.0),
-                    test_t("if(1 < 2) { 1+2; 3;} else 4; == 3",1.0),
-                    test_t("if(1 > 2) { 1+2; 3;} else 4; == 4",1.0),
-                    test_t("if(1 < 2) { 1+2; 3;} else {1+2; 4;} == 3",1.0),
-                    test_t("if(1 > 2) { 1+2; 3;} else {1+2; 4;} == 4",1.0),
-                    test_t("if(1 < 2) { 1+2; 3;} else if (1 < 2) 4; == 3",1.0),
-                    test_t("if(1 > 2) { 1+2; 3;} else if (1 < 2) 4; == 4",1.0),
-                    test_t("if(1 > 2) { 1+2; 3;} else if (1 > 2) 4; == null",1.0),
-                    test_t("if(1 < 2) { 1+2; 3;} else if (1 < 2) {1+2; 4;} == 3",1.0),
-                    test_t("if(1 > 2) { 1+2; 3;} else if (1 < 2) {1+2; 4;} == 4",1.0),
-                    test_t("if(1 > 2) { 1+2; 3;} else if (1 > 2) {1+2; 4;} == null",1.0)
+                    test_t("if (1 < 2) 3; == 3",1.0),
+                    test_t("if (1 > 2) 3; == null",1.0),
+                    test_t("if (1 < 2) 3; else 4; == 3",1.0),
+                    test_t("if (1 > 2) 3; else 4; == 4",1.0),
+                    test_t("if (1 < 2) 3; else {1+2; 4;} == 3",1.0),
+                    test_t("if (1 > 2) 3; else {1+2; 4;} == 4",1.0),
+                    test_t("if (1 < 2) 3; else if (1 < 2) 4; == 3",1.0),
+                    test_t("if (1 > 2) 3; else if (1 < 2) 4; == 4",1.0),
+                    test_t("if (1 > 2) 3; else if (1 > 2) 4; == null",1.0),
+                    test_t("if (1 < 2) 3; else if (1 < 2) {1+2; 4;} == 3",1.0),
+                    test_t("if (1 > 2) 3; else if (1 < 2) {1+2; 4;} == 4",1.0),
+                    test_t("if (1 > 2) 3; else if (1 > 2) {1+2; 4;} == null",1.0),
+                    test_t("if (1 < 2) { 1+2; 3;} == 3",1.0),
+                    test_t("if (1 > 2) { 1+2; 3;} == null",1.0),
+                    test_t("if (1 < 2) { 1+2; 3;} else 4; == 3",1.0),
+                    test_t("if (1 > 2) { 1+2; 3;} else 4; == 4",1.0),
+                    test_t("if (1 < 2) { 1+2; 3;} else {1+2; 4;} == 3",1.0),
+                    test_t("if (1 > 2) { 1+2; 3;} else {1+2; 4;} == 4",1.0),
+                    test_t("if (1 < 2) { 1+2; 3;} else if (1 < 2) 4; == 3",1.0),
+                    test_t("if (1 > 2) { 1+2; 3;} else if (1 < 2) 4; == 4",1.0),
+                    test_t("if (1 > 2) { 1+2; 3;} else if (1 > 2) 4; == null",1.0),
+                    test_t("if (1 < 2) { 1+2; 3;} else if (1 < 2) {1+2; 4;} == 3",1.0),
+                    test_t("if (1 > 2) { 1+2; 3;} else if (1 < 2) {1+2; 4;} == 4",1.0),
+                    test_t("if (1 > 2) { 1+2; 3;} else if (1 > 2) {1+2; 4;} == null",1.0)
                   };
 
 static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_t);
@@ -1679,18 +1679,18 @@
                                 test_xyzw<T>("(4 + [3 / (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 + (3.0 / (std::min(5.0,7.0) + 9.0))))),
                                 test_xyzw<T>("(4 * [3 / (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 * (3.0 / (std::min(5.0,7.0) + 9.0))))),
                                 test_xyzw<T>("(4 / [3 / (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 / (3.0 / (std::min(5.0,7.0) + 9.0))))),
-                                test_xyzw<T>("if(x < y) { z+2; z;} == z"                             ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
-                                test_xyzw<T>("if(x > y) { z+2; z;} == null"                          ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
-                                test_xyzw<T>("if(x < y) { z+2; z;} else w; == z"                     ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
-                                test_xyzw<T>("if(x > y) { z+2; z;} else 1 + w; == (w + 1)"           ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
-                                test_xyzw<T>("if(x < y) { z+2; z;} else {1+2; w;} == z"              ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
-                                test_xyzw<T>("if(x > y) { z+2; z;} else {1+2; w;} == w"              ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
-                                test_xyzw<T>("if(x < y) { z+2; z;} else if (x < y) w; == z"          ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
-                                test_xyzw<T>("if(x > y) { z+2; z;} else if (x < y) 1 + w; == w + 1"  ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
-                                test_xyzw<T>("if(x > y) { z+2; z;} else if (x > y) w; == null"       ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
-                                test_xyzw<T>("if(x < y) { z+2; z;} else if (x < y) {w+2; w;} == z"   ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
-                                test_xyzw<T>("if(x > y) { z+2; z;} else if (x < y) {w+2; w;} == w"   ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
-                                test_xyzw<T>("if(x > y) { z+2; z;} else if (x > y) {w+2; w;} == null",T(1.0),T(2.0),T(3.0),T(4.0),T(1.0))
+                                test_xyzw<T>("if (x < y) { z+2; z;} == z"                             ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
+                                test_xyzw<T>("if (x > y) { z+2; z;} == null"                          ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
+                                test_xyzw<T>("if (x < y) { z+2; z;} else w; == z"                     ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
+                                test_xyzw<T>("if (x > y) { z+2; z;} else 1 + w; == (w + 1)"           ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
+                                test_xyzw<T>("if (x < y) { z+2; z;} else {1+2; w;} == z"              ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
+                                test_xyzw<T>("if (x > y) { z+2; z;} else {1+2; w;} == w"              ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
+                                test_xyzw<T>("if (x < y) { z+2; z;} else if (x < y) w; == z"          ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
+                                test_xyzw<T>("if (x > y) { z+2; z;} else if (x < y) 1 + w; == w + 1"  ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
+                                test_xyzw<T>("if (x > y) { z+2; z;} else if (x > y) w; == null"       ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
+                                test_xyzw<T>("if (x < y) { z+2; z;} else if (x < y) {w+2; w;} == z"   ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
+                                test_xyzw<T>("if (x > y) { z+2; z;} else if (x < y) {w+2; w;} == w"   ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
+                                test_xyzw<T>("if (x > y) { z+2; z;} else if (x > y) {w+2; w;} == null",T(1.0),T(2.0),T(3.0),T(4.0),T(1.0))
                               };
 
       static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_xyzw<T>);
@@ -5917,16 +5917,16 @@
 
       compositor
          .add("is_prime_impl1",
-              "if(y == 1,true,                "
-              "   if(0 == (x % y),false,      "
-              "      is_prime_impl1(x,y - 1)))",
+              "if (y == 1,true,                "
+              "   if (0 == (x % y),false,      "
+              "      is_prime_impl1(x,y - 1))) ",
               "x","y");
 
       compositor
          .add("is_prime1",
-              "if(frac(x) != 0, false,                                "
-              "   if(x <= 0, false,                                   "
-              "      is_prime_impl1(x,min(x - 1,trunc(sqrt(x)) + 1))))",
+              "if (frac(x) != 0, false,                                "
+              "   if (x <= 0, false,                                   "
+              "      is_prime_impl1(x,min(x - 1,trunc(sqrt(x)) + 1)))) ",
               "x");
 
       compositor
@@ -6122,9 +6122,9 @@
 
       compositor
          .add("fibonacci1",
-              "if(x == 0,0,                                 "
-              "   if(x == 1,1,                              "
-              "      fibonacci1(x - 1) + fibonacci1(x - 2)))",
+              "if (x == 0,0,                                 "
+              "    if (x == 1,1,                             "
+              "       fibonacci1(x - 1) + fibonacci1(x - 2)))",
               "x");
 
       compositor
@@ -6139,19 +6139,19 @@
 
       compositor
          .add("fibonacci_impl3",
-              "switch                        "
-              "{                             "
-              "  case x == 0 : 0;            "
-              "  case x == 1 : 1;            "
-              "  default :                   "
-              "    while ((x := (x - 1)) > 0)"
-              "    {                         "
-              "      w := z;                 "
-              "      z := z + y;             "
-              "      y := w;                 "
-              "      z                       "
-              "    };                        "
-              "}                             ",
+              "switch                         "
+              "{                              "
+              "  case x == 0 : 0;             "
+              "  case x == 1 : 1;             "
+              "  default :                    "
+              "    while ((x := (x - 1)) > 0) "
+              "    {                          "
+              "      w := z;                  "
+              "      z := z + y;              "
+              "      y := w;                  "
+              "      z                        "
+              "    };                         "
+              "}                              ",
               "x","y","z","w");
 
       compositor
@@ -6161,19 +6161,19 @@
 
       compositor
          .add("fibonacci_impl4",
-              "switch             "
-              "{                  "
-              "  case x == 0 : 0; "
-              "  case x == 1 : 1; "
-              "  default :        "
-              "    repeat         "
-              "      w := z;      "
-              "      z := z + y;  "
-              "      y := w;      "
-              "      x := x - 1;  "
-              "      z            "
-              "    until (x <= 1);"
-              "}                  ",
+              "switch              "
+              "{                   "
+              "  case x == 0 : 0;  "
+              "  case x == 1 : 1;  "
+              "  default :         "
+              "    repeat          "
+              "      w := z;       "
+              "      z := z + y;   "
+              "      y := w;       "
+              "      x := x - 1;   "
+              "      z             "
+              "    until (x <= 1); "
+              "}                   ",
               "x","y","z","w");
 
       compositor
@@ -6731,21 +6731,21 @@
 
       static const std::string result_list[] =
          {
-           ""   ,
-           "T"  ,
-           "TT" ,
-           "TT" ,
-           "TTS",
-           "TS" ,
-           "TST",
-           "TS" ,
-           "TST",
-           "T"  ,
-           "TS" ,
-           "TST",
-           "TSTT",
+           ""     ,
+           "T"    ,
+           "TT"   ,
+           "TT"   ,
+           "TTS"  ,
+           "TS"   ,
+           "TST"  ,
+           "TS"   ,
+           "TST"  ,
+           "T"    ,
+           "TS"   ,
+           "TST"  ,
+           "TSTT" ,
            "TSTTT",
-           "TST",
+           "TST"  ,
            "TS"
          };
 
@@ -6793,13 +6793,13 @@
    {
       static const std::string expression_list[] =
          {
-           "x := 1; x + 1; x + 2; x + 3; x + 5; x + 7;  return [x + 1];",
-           "x := 1; x + 1; x + 2; x + 3; x + 5; return [x + 1]; x := 7;",
-           "x := 1; x + 1; x + 2; x + 3; return [x + 1]; x + 5; x := 7;",
-           "x := 1; x + 1; x + 2; return [x + 1]; x + 3; x + 5; x := 7;",
-           "x := 1; x + 1; return [x + 1]; x + 2; x + 3; x + 5; x := 7;",
-           "x := 1; return [x + 1]; x + 1; x + 2; x + 3; x + 5; x := 7;",
-           "return [x + 1]; x := 1; x + 1; x + 2; x + 3; x + 5; x := 7;",
+           "x := 1; x + 1; x + 2; x + 3; x + 5; x + 7;  return [x + 1];  ",
+           "x := 1; x + 1; x + 2; x + 3; x + 5; return [x + 1]; x := 7;  ",
+           "x := 1; x + 1; x + 2; x + 3; return [x + 1]; x + 5; x := 7;  ",
+           "x := 1; x + 1; x + 2; return [x + 1]; x + 3; x + 5; x := 7;  ",
+           "x := 1; x + 1; return [x + 1]; x + 2; x + 3; x + 5; x := 7;  ",
+           "x := 1; return [x + 1]; x + 1; x + 2; x + 3; x + 5; x := 7;  ",
+           "return [x + 1]; x := 1; x + 1; x + 2; x + 3; x + 5; x := 7;  ",
            "~{x := 1; x + 1; x + 2; x + 3; x + 5; x + 7;  return [x + 1]}",
            "~{x := 1; x + 1; x + 2; x + 3; x + 5; return [x + 1]; x := 7}",
            "~{x := 1; x + 1; x + 2; x + 3; return [x + 1]; x + 5; x := 7}",
diff --git a/readme.txt b/readme.txt
index 4d63914..2180522 100644
--- a/readme.txt
+++ b/readme.txt
@@ -93,7 +93,7 @@
 locations:
 
   (a) Download:   http://www.partow.net/programming/exprtk/index.html
-  (b) Repository: https://exprtk.googlecode.com/svn/
+  (b) Repository: https://github.com/ArashPartow/exprtk