C++ Mathematical Expression Library (ExprTk)  http://www.partow.net/programming/exprtk/index.html
diff --git a/exprtk.hpp b/exprtk.hpp
index fffffc2..5fe6d0a 100644
--- a/exprtk.hpp
+++ b/exprtk.hpp
@@ -3753,24 +3753,35 @@
             return current_token_;
          }
 
-         inline bool token_is(const token_t::token_type& ttype, const bool advance_token = true)
+         enum token_advance_mode
+         {
+            e_hold    = 0,
+            e_advance = 1
+         };
+
+         inline void advance_token(const token_advance_mode mode)
+         {
+            if (e_advance == mode)
+            {
+               next_token();
+            }
+         }
+
+         inline bool token_is(const token_t::token_type& ttype, const token_advance_mode mode = e_advance)
          {
             if (current_token().type != ttype)
             {
                return false;
             }
 
-            if (advance_token)
-            {
-               next_token();
-            }
+            advance_token(mode);
 
             return true;
          }
 
          inline bool token_is(const token_t::token_type& ttype,
                               const std::string& value,
-                              const bool advance_token = true)
+                              const token_advance_mode mode = e_advance)
          {
             if (
                  (current_token().type != ttype) ||
@@ -3780,17 +3791,14 @@
                return false;
             }
 
-            if (advance_token)
-            {
-               next_token();
-            }
+            advance_token(mode);
 
             return true;
          }
 
          inline bool token_is_then_assign(const token_t::token_type& ttype,
                                           std::string& token,
-                                          const bool advance_token = true)
+                                          const token_advance_mode mode = e_advance)
          {
             if (current_token_.type != ttype)
             {
@@ -3799,10 +3807,7 @@
 
             token = current_token_.value;
 
-            if (advance_token)
-            {
-               next_token();
-            }
+            advance_token(mode);
 
             return true;
          }
@@ -16439,6 +16444,8 @@
 
       typedef results_context<T> results_context_t;
 
+      typedef parser_helper prsrhlpr_t;
+
       struct scope_element
       {
          enum element_type
@@ -18498,7 +18505,7 @@
 
             if (lexer().finished())
                break;
-            else if (token_is(token_t::e_eof,false))
+            else if (token_is(token_t::e_eof,prsrhlpr_t::e_hold))
             {
                if (lexer().finished())
                   break;
@@ -18774,7 +18781,10 @@
             {
                expression = new_expression;
 
-               if (token_is(token_t::e_ternary,false) && (precedence == e_level00))
+               if (
+                    token_is(token_t::e_ternary,prsrhlpr_t::e_hold) &&
+                    (precedence == e_level00)
+                  )
                {
                   expression = parse_ternary_conditional_statement(expression);
                }
@@ -19342,7 +19352,7 @@
 
          bool result = true;
 
-         if (token_is(token_t::e_lcrlbracket,false))
+         if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold))
          {
             if (0 == (consequent = parse_multi_sequence("if-statement-01")))
             {
@@ -19357,7 +19367,7 @@
          {
             if (
                  settings_.commutative_check_enabled() &&
-                 token_is(token_t::e_mul,false)
+                 token_is(token_t::e_mul,prsrhlpr_t::e_hold)
                )
             {
                next_token();
@@ -19390,7 +19400,7 @@
             {
                next_token();
 
-               if (token_is(token_t::e_lcrlbracket,false))
+               if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold))
                {
                   if (0 == (alternative = parse_multi_sequence("else-statement-01")))
                   {
@@ -19495,7 +19505,7 @@
 
             return error_node();
          }
-         else if (token_is(token_t::e_comma,false))
+         else if (token_is(token_t::e_comma,prsrhlpr_t::e_hold))
          {
             // if (x,y,z)
             return parse_conditional_statement_01(condition);
@@ -19873,13 +19883,13 @@
          if (!token_is(token_t::e_eof))
          {
             if (
-                 !token_is(token_t::e_symbol,false) &&
+                 !token_is(token_t::e_symbol,prsrhlpr_t::e_hold) &&
                  details::imatch(current_token().value,"var")
                )
             {
                next_token();
 
-               if (!token_is(token_t::e_symbol,false))
+               if (!token_is(token_t::e_symbol,prsrhlpr_t::e_hold))
                {
                   set_error(
                      make_error(parser_error::e_syntax,
@@ -20161,7 +20171,7 @@
 
                expression_node_ptr default_statement = error_node();
 
-               if (token_is(token_t::e_lcrlbracket,false))
+               if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold))
                   default_statement = parse_multi_sequence("switch-default");
                else
                   default_statement = parse_expression();
@@ -20290,7 +20300,7 @@
                arg_list.push_back(consequent);
             }
 
-            if (token_is(token_t::e_rcrlbracket,false))
+            if (token_is(token_t::e_rcrlbracket,prsrhlpr_t::e_hold))
             {
                break;
             }
@@ -20352,6 +20362,7 @@
          lodge_symbol(symbol,e_st_function);
 
          next_token();
+
          if (!token_is(token_t::e_lbracket))
          {
             set_error(
@@ -20450,11 +20461,11 @@
 
          while
             (
-              (0 != expression)                      &&
-              (i++ < max_rangesize_parses)           &&
-              error_list_.empty()                    &&
-              token_is(token_t::e_lsqrbracket,false) &&
-              is_generally_string_node(expression)
+              (0 != expression)                     &&
+              (i++ < max_rangesize_parses)          &&
+              error_list_.empty()                   &&
+              is_generally_string_node(expression)  &&
+              token_is(token_t::e_lsqrbracket,prsrhlpr_t::e_hold)
             )
          {
             expression = parse_string_range_statement(expression);
@@ -21798,9 +21809,9 @@
             }
 
             if (
-                 !token_is(token_t::e_rbracket   ,false) &&
-                 !token_is(token_t::e_rcrlbracket,false) &&
-                 !token_is(token_t::e_rsqrbracket,false)
+                 !token_is(token_t::e_rbracket   ,prsrhlpr_t::e_hold) &&
+                 !token_is(token_t::e_rcrlbracket,prsrhlpr_t::e_hold) &&
+                 !token_is(token_t::e_rsqrbracket,prsrhlpr_t::e_hold)
                )
             {
                if (!token_is(token_t::e_eof))
@@ -22043,11 +22054,11 @@
 
             return error_node();
          }
-         else if (token_is(token_t::e_lsqrbracket,false))
+         else if (token_is(token_t::e_lsqrbracket,prsrhlpr_t::e_hold))
          {
             return parse_define_vector_statement(var_name);
          }
-         else if (token_is(token_t::e_lcrlbracket,false))
+         else if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold))
          {
             return parse_uninitialised_var_statement(var_name);
          }
@@ -22065,12 +22076,12 @@
          }
 
          if (
-              !token_is(token_t::e_rbracket   ,false) &&
-              !token_is(token_t::e_rcrlbracket,false) &&
-              !token_is(token_t::e_rsqrbracket,false)
+              !token_is(token_t::e_rbracket   ,prsrhlpr_t::e_hold) &&
+              !token_is(token_t::e_rcrlbracket,prsrhlpr_t::e_hold) &&
+              !token_is(token_t::e_rsqrbracket,prsrhlpr_t::e_hold)
             )
          {
-            if (!token_is(token_t::e_eof,false))
+            if (!token_is(token_t::e_eof,prsrhlpr_t::e_hold))
             {
                set_error(
                   make_error(parser_error::e_syntax,
@@ -22173,7 +22184,7 @@
 
             return error_node();
          }
-         else if (!token_is(token_t::e_eof,false))
+         else if (!token_is(token_t::e_eof,prsrhlpr_t::e_hold))
          {
             set_error(
                make_error(parser_error::e_syntax,
@@ -22268,7 +22279,7 @@
 
          const std::string var0_name = current_token().value;
 
-         if (!token_is(token_t::e_symbol,false))
+         if (!token_is(token_t::e_symbol,prsrhlpr_t::e_hold))
          {
             set_error(
                make_error(parser_error::e_syntax,
@@ -22341,7 +22352,7 @@
 
          const std::string var1_name = current_token().value;
 
-         if (!token_is(token_t::e_symbol,false))
+         if (!token_is(token_t::e_symbol,prsrhlpr_t::e_hold))
          {
             set_error(
                make_error(parser_error::e_syntax,
@@ -22604,21 +22615,23 @@
          if (is_generally_string_node(branch))
             return true;
 
+         const lexer::parser_helper::token_advance_mode hold = prsrhlpr_t::e_hold;
+
          switch (token)
          {
-            case token_t::e_lcrlbracket : implied_mul = token_is(token_t::e_lbracket   ,false) ||
-                                                        token_is(token_t::e_lcrlbracket,false) ||
-                                                        token_is(token_t::e_lsqrbracket,false) ;
+            case token_t::e_lcrlbracket : implied_mul = token_is(token_t::e_lbracket   ,hold) ||
+                                                        token_is(token_t::e_lcrlbracket,hold) ||
+                                                        token_is(token_t::e_lsqrbracket,hold) ;
                                           break;
 
-            case token_t::e_lbracket    : implied_mul = token_is(token_t::e_lbracket   ,false) ||
-                                                        token_is(token_t::e_lcrlbracket,false) ||
-                                                        token_is(token_t::e_lsqrbracket,false) ;
+            case token_t::e_lbracket    : implied_mul = token_is(token_t::e_lbracket   ,hold) ||
+                                                        token_is(token_t::e_lcrlbracket,hold) ||
+                                                        token_is(token_t::e_lsqrbracket,hold) ;
                                           break;
 
-            case token_t::e_lsqrbracket : implied_mul = token_is(token_t::e_lbracket   ,false) ||
-                                                        token_is(token_t::e_lcrlbracket,false) ||
-                                                        token_is(token_t::e_lsqrbracket,false) ;
+            case token_t::e_lsqrbracket : implied_mul = token_is(token_t::e_lbracket   ,hold) ||
+                                                        token_is(token_t::e_lcrlbracket,hold) ||
+                                                        token_is(token_t::e_lsqrbracket,hold) ;
                                           break;
 
             default                     : return true;
@@ -23151,7 +23164,7 @@
          if (
               branch                    &&
               (e_level00 == precedence) &&
-              token_is(token_t::e_ternary,false)
+              token_is(token_t::e_ternary,prsrhlpr_t::e_hold)
             )
          {
             branch = parse_ternary_conditional_statement(branch);
@@ -33724,8 +33737,8 @@
    namespace information
    {
       static const char* library = "Mathematical Expression Toolkit";
-      static const char* version = "2.718281828459045235360287471352662"
-                                   "49775724709369995957496696762772407";
+      static const char* version = "2.7182818284590452353602874713526624"
+                                   "977572470936999595749669676277240766";
       static const char* date    = "20160606";
 
       static inline std::string data()
diff --git a/readme.txt b/readme.txt
index badb629..224da97 100644
--- a/readme.txt
+++ b/readme.txt
@@ -291,7 +291,7 @@
 | nequal   | Not-equal test between x and y using normalized epsilon |
 +----------+---------------------------------------------------------+
 | root     | Nth-Root of x. where n is a positive integer.           |
-|          | (eg: root(x,3))                                         |
+|          | (eg: root(x,3) == x^(1/3))                              |
 +----------+---------------------------------------------------------+
 | round    | Round x to the nearest integer.  (eg: round(x))         |
 +----------+---------------------------------------------------------+
@@ -302,7 +302,7 @@
 | sgn      | Sign of x, -1 where x < 0, +1 where x > 0, else zero.   |
 |          | (eg: sgn(x))                                            |
 +----------+---------------------------------------------------------+
-| sqrt     | Square root of x, where x > 0.  (eg: sqrt(x))           |
+| sqrt     | Square root of x, where x >= 0.  (eg: sqrt(x))          |
 +----------+---------------------------------------------------------+
 | sum      | Sum of all the inputs.                                  |
 |          | (eg: sum(x,y,z,w,u,v,t) == (x + y + z + w + u + v + t)) |