diff --git a/exprtk.hpp b/exprtk.hpp index fffffc2..5fe6d0a 100644 --- a/exprtk.hpp +++ b/exprtk.hpp @@ -3753,24 +3753,35 @@ namespace exprtk 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 @@ namespace exprtk 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 @@ namespace exprtk token = current_token_.value; - if (advance_token) - { - next_token(); - } + advance_token(mode); return true; } @@ -16439,6 +16444,8 @@ namespace exprtk typedef results_context results_context_t; + typedef parser_helper prsrhlpr_t; + struct scope_element { enum element_type @@ -18498,7 +18505,7 @@ namespace exprtk 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 @@ namespace exprtk { 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 @@ namespace exprtk 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 @@ namespace exprtk { 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 @@ namespace exprtk { 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 @@ namespace exprtk 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 @@ namespace exprtk 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 @@ namespace exprtk 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 @@ namespace exprtk 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 @@ namespace exprtk lodge_symbol(symbol,e_st_function); next_token(); + if (!token_is(token_t::e_lbracket)) { set_error( @@ -20450,11 +20461,11 @@ namespace exprtk 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 @@ namespace exprtk } 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 @@ namespace exprtk 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 @@ namespace exprtk } 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 @@ namespace exprtk 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 @@ namespace exprtk 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 @@ namespace exprtk 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 @@ namespace exprtk 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 @@ namespace exprtk 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 exprtk 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 @@ of C++ compilers: | 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 @@ of C++ compilers: | 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)) |