diff --git a/resources/3rdparty/exprtk/exprtk.hpp b/resources/3rdparty/exprtk/exprtk.hpp index 4cb3a776a..e8c156596 100755 --- a/resources/3rdparty/exprtk/exprtk.hpp +++ b/resources/3rdparty/exprtk/exprtk.hpp @@ -4483,14 +4483,14 @@ namespace exprtk } } - static inline control_block* create(const std::size_t& size, data_t data_ptr = data_t(0), bool dstrct = false) + static inline control_block* create(const std::size_t& dsize, data_t data_ptr = data_t(0), bool dstrct = false) { - if (size) + if (dsize) { if (0 == data_ptr) - return new control_block(size); + return new control_block(dsize); else - return new control_block(size, data_ptr, dstrct); + return new control_block(dsize, data_ptr, dstrct); } else return new control_block; @@ -18811,20 +18811,42 @@ namespace exprtk e_usr_constant_type = 1 }; + enum usr_mode + { + e_usrmode_default = 0, + e_usrmode_extended = 1 + }; + + usr_mode mode; + + unknown_symbol_resolver(const usr_mode m = e_usrmode_default) + : mode(m) + {} + virtual ~unknown_symbol_resolver() {} virtual bool process(const std::string& /*unknown_symbol*/, - usr_symbol_type& st, - T& default_value, - std::string& error_message) + usr_symbol_type& st, + T& default_value, + std::string& error_message) { + if (e_usrmode_default != mode) + return false; + st = e_usr_variable_type; default_value = T(0); error_message.clear(); return true; } + + virtual bool process(const std::string& /* unknown_symbol */, + symbol_table_t& /* symbol_table */, + std::string& /* error_message */) + { + return false; + } }; enum collect_type @@ -19971,6 +19993,11 @@ namespace exprtk unknown_symbol_resolver_ = &default_usr_; } + inline void enable_unknown_symbol_resolver(unknown_symbol_resolver& usr) + { + enable_unknown_symbol_resolver(&usr); + } + inline void disable_unknown_symbol_resolver() { resolve_unknown_symbol_ = false; @@ -22628,6 +22655,26 @@ namespace exprtk return error_node(); } + // Perform compile-time range check + if (details::is_constant_node(index_expr)) + { + const std::size_t index = std::size_t(index_expr->value()); + const std::size_t vec_size = vec->size(); + + if (index >= vec_size) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR106 - Index of " + details::to_str(index) + " out of range for " + "vector '" + symbol + "' of size " + details::to_str(vec_size))); + + free_node(node_allocator_,index_expr); + + return error_node(); + } + } + return expression_generator_.vector_element(symbol,vec,index_expr); } @@ -22649,7 +22696,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR106 - Zero parameter call to vararg function: " + "ERR107 - Zero parameter call to vararg function: " + vararg_function_name + " not allowed")); return error_node(); @@ -22673,7 +22720,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR107 - Expected ',' for call to vararg function: " + "ERR108 - Expected ',' for call to vararg function: " + vararg_function_name)); return error_node(); @@ -22686,7 +22733,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR108 - Zero parameter call to vararg function: " + "ERR109 - Zero parameter call to vararg function: " + vararg_function_name + " not allowed")); return error_node(); @@ -22697,7 +22744,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR109 - Invalid number of parameters to call to vararg function: " + "ERR110 - Invalid number of parameters to call to vararg function: " + vararg_function_name + ", require at least " + details::to_str(static_cast(vararg_function->min_num_args())) + " parameters")); @@ -22708,7 +22755,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR110 - Invalid number of parameters to call to vararg function: " + "ERR111 - Invalid number of parameters to call to vararg function: " + vararg_function_name + ", require no more than " + details::to_str(static_cast(vararg_function->max_num_args())) + " parameters")); @@ -22770,7 +22817,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, parser_.current_token(), - "ERR111 - Failed parameter type check for function '" + function_name_ + "', " + "ERR112 - Failed parameter type check for function '" + function_name_ + "', " "Expected '" + param_seq_list_[0] + "' call set: '" + param_seq +"'")); } else @@ -22790,7 +22837,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, parser_.current_token(), - "ERR112 - Failed parameter type check for function '" + function_name_ + "', " + "ERR113 - Failed parameter type check for function '" + function_name_ + "', " "Best match: '" + param_seq_list_[max_diff_index] + "' call set: '" + param_seq +"'")); } @@ -22874,7 +22921,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, parser_.current_token(), - "ERR113 - Invalid parameter sequence of '" + err_param_seq + + "ERR114 - Invalid parameter sequence of '" + err_param_seq + "' for function: " + function_name_)); return; @@ -22895,7 +22942,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, parser_.current_token(), - "ERR114 - Invalid parameter sequence of '" + err_param_seq + + "ERR115 - Invalid parameter sequence of '" + err_param_seq + "' for function: " + function_name_)); return; } @@ -22928,7 +22975,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR115 - Type checker instantiation failure for generic function: " + function_name)); + "ERR116 - Type checker instantiation failure for generic function: " + function_name)); return error_node(); } @@ -22942,7 +22989,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR116 - Mismatch in zero parameter condition for generic function: " + "ERR117 - Mismatch in zero parameter condition for generic function: " + function_name)); return error_node(); @@ -22960,7 +23007,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR117 - Zero parameter call to generic function: " + "ERR118 - Zero parameter call to generic function: " + function_name + " not allowed")); return error_node(); @@ -22991,7 +23038,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR118 - Expected ',' for call to generic function: " + function_name)); + "ERR119 - Expected ',' for call to generic function: " + function_name)); return error_node(); } @@ -23007,7 +23054,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR119 - Zero parameter call to generic function: " + "ERR120 - Zero parameter call to generic function: " + function_name + " not allowed")); return error_node(); @@ -23023,7 +23070,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR120 - Expected ',' for call to generic function: " + function_name)); + "ERR121 - Expected ',' for call to generic function: " + function_name)); return error_node(); } @@ -23090,7 +23137,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR121 - Expected ',' for call to string function: " + function_name)); + "ERR122 - Expected ',' for call to string function: " + function_name)); return error_node(); } @@ -23105,7 +23152,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR122 - Expected ',' for call to string function: " + function_name)); + "ERR123 - Expected ',' for call to string function: " + function_name)); return error_node(); } @@ -23142,7 +23189,7 @@ namespace exprtk p.set_error( make_error(parser_error::e_syntax, p.current_token(), - "ERR123 - Expected '(' for special function")); + "ERR124 - Expected '(' for special function")); return error_node(); } @@ -23162,7 +23209,7 @@ namespace exprtk p.set_error( make_error(parser_error::e_syntax, p.current_token(), - "ERR124 - Expected ',' before next parameter of special function")); + "ERR125 - Expected ',' before next parameter of special function")); return p.error_node(); } @@ -23191,7 +23238,7 @@ namespace exprtk set_error( make_error(parser_error::e_token, current_token(), - "ERR125 - Invalid special function[1]: " + current_token().value)); + "ERR126 - Invalid special function[1]: " + current_token().value)); return error_node(); } @@ -23203,7 +23250,7 @@ namespace exprtk set_error( make_error(parser_error::e_token, current_token(), - "ERR126 - Invalid special function[2]: " + current_token().value)); + "ERR127 - Invalid special function[2]: " + current_token().value)); return error_node(); } @@ -23234,7 +23281,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR127 - Break call within a break call is not allowed")); + "ERR128 - Break call within a break call is not allowed")); return error_node(); } @@ -23256,7 +23303,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR128 - Failed to parse return expression for 'break' statement")); + "ERR129 - Failed to parse return expression for 'break' statement")); return error_node(); } @@ -23265,7 +23312,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR129 - Expected ']' at the completion of break's return expression")); + "ERR130 - Expected ']' at the completion of break's return expression")); free_node(node_allocator_,return_expr); @@ -23282,7 +23329,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR130 - Invalid use of 'break', allowed only in the scope of a loop")); + "ERR131 - Invalid use of 'break', allowed only in the scope of a loop")); } return error_node(); @@ -23304,7 +23351,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR131 - Invalid use of 'continue', allowed only in the scope of a loop")); + "ERR132 - Invalid use of 'continue', allowed only in the scope of a loop")); return error_node(); } @@ -23320,7 +23367,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR132 - Expected '[' as part of vector size definition")); + "ERR133 - Expected '[' as part of vector size definition")); return error_node(); } @@ -23329,7 +23376,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR133 - Failed to determine size of vector '" + vec_name + "'")); + "ERR134 - Failed to determine size of vector '" + vec_name + "'")); return error_node(); } @@ -23340,7 +23387,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR134 - Expected a literal number as size of vector '" + vec_name + "'")); + "ERR135 - Expected a literal number as size of vector '" + vec_name + "'")); return error_node(); } @@ -23358,7 +23405,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR135 - Invalid vector size. Must be an integer greater than zero, size: " + + "ERR136 - Invalid vector size. Must be an integer greater than zero, size: " + details::to_str(details::numeric::to_int32(vector_size)))); return error_node(); @@ -23377,7 +23424,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR136 - Expected ']' as part of vector size definition")); + "ERR137 - Expected ']' as part of vector size definition")); return error_node(); } @@ -23388,7 +23435,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR137 - Expected ':=' as part of vector definition")); + "ERR138 - Expected ':=' as part of vector definition")); return error_node(); } @@ -23401,7 +23448,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR138 - Failed to parse single vector initialiser")); + "ERR139 - Failed to parse single vector initialiser")); return error_node(); } @@ -23413,7 +23460,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR139 - Expected ']' to close single value vector initialiser")); + "ERR140 - Expected ']' to close single value vector initialiser")); return error_node(); } @@ -23459,7 +23506,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR140 - Expected '{' as part of vector initialiser list")); + "ERR141 - Expected '{' as part of vector initialiser list")); return error_node(); } @@ -23478,7 +23525,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR141 - Expected '{' as part of vector initialiser list")); + "ERR142 - Expected '{' as part of vector initialiser list")); return error_node(); } @@ -23495,7 +23542,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR142 - Expected ',' between vector initialisers")); + "ERR143 - Expected ',' between vector initialisers")); return error_node(); } @@ -23516,7 +23563,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR143 - Expected ';' at end of vector definition")); + "ERR144 - Expected ';' at end of vector definition")); return error_node(); } @@ -23527,7 +23574,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR144 - Initialiser list larger than the number of elements in the vector: '" + vec_name + "'")); + "ERR145 - Initialiser list larger than the number of elements in the vector: '" + vec_name + "'")); return error_node(); } @@ -23546,7 +23593,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR145 - Illegal redefinition of local vector: '" + vec_name + "'")); + "ERR146 - Illegal redefinition of local vector: '" + vec_name + "'")); return error_node(); } @@ -23579,7 +23626,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR146 - Failed to add new local vector '" + vec_name + "' to SEM")); + "ERR147 - Failed to add new local vector '" + vec_name + "' to SEM")); sem_.free_element(nse); @@ -23633,7 +23680,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR147 - Illegal redefinition of local variable: '" + str_name + "'")); + "ERR148 - Illegal redefinition of local variable: '" + str_name + "'")); free_node(node_allocator_,initialisation_expression); @@ -23664,7 +23711,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR148 - Failed to add new local string variable '" + str_name + "' to SEM")); + "ERR149 - Failed to add new local string variable '" + str_name + "' to SEM")); free_node(node_allocator_,initialisation_expression); @@ -23709,7 +23756,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR149 - Illegal variable definition")); + "ERR150 - Illegal variable definition")); return error_node(); } @@ -23729,7 +23776,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR150 - Expected a symbol for variable definition")); + "ERR151 - Expected a symbol for variable definition")); return error_node(); } @@ -23738,7 +23785,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR151 - Illegal redefinition of reserved keyword: '" + var_name + "'")); + "ERR152 - Illegal redefinition of reserved keyword: '" + var_name + "'")); return error_node(); } @@ -23747,7 +23794,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR152 - Illegal redefinition of variable '" + var_name + "'")); + "ERR153 - Illegal redefinition of variable '" + var_name + "'")); return error_node(); } @@ -23756,7 +23803,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR153 - Illegal redefinition of local variable: '" + var_name + "'")); + "ERR154 - Illegal redefinition of local variable: '" + var_name + "'")); return error_node(); } @@ -23775,7 +23822,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR154 - Failed to parse initialisation expression")); + "ERR155 - Failed to parse initialisation expression")); return error_node(); } @@ -23792,7 +23839,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR155 - Expected ';' after variable definition")); + "ERR156 - Expected ';' after variable definition")); free_node(node_allocator_,initialisation_expression); @@ -23819,7 +23866,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR156 - Illegal redefinition of local variable: '" + var_name + "'")); + "ERR157 - Illegal redefinition of local variable: '" + var_name + "'")); free_node(node_allocator_,initialisation_expression); @@ -23850,7 +23897,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR157 - Failed to add new local variable '" + var_name + "' to SEM")); + "ERR158 - Failed to add new local variable '" + var_name + "' to SEM")); free_node(node_allocator_,initialisation_expression); @@ -23886,7 +23933,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR158 - Expected a '{}' for uninitialised var definition")); + "ERR159 - Expected a '{}' for uninitialised var definition")); return error_node(); } @@ -23895,7 +23942,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR159 - Expected ';' after uninitialised variable definition")); + "ERR160 - Expected ';' after uninitialised variable definition")); return error_node(); } @@ -23911,7 +23958,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR160 - Illegal redefinition of local variable: '" + var_name + "'")); + "ERR161 - Illegal redefinition of local variable: '" + var_name + "'")); return error_node(); } @@ -23940,7 +23987,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR161 - Failed to add new local variable '" + var_name + "' to SEM")); + "ERR162 - Failed to add new local variable '" + var_name + "' to SEM")); sem_.free_element(nse); @@ -23972,7 +24019,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR162 - Expected '(' at start of swap statement")); + "ERR163 - Expected '(' at start of swap statement")); return error_node(); } @@ -23990,7 +24037,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR163 - Expected a symbol for variable or vector element definition")); + "ERR164 - Expected a symbol for variable or vector element definition")); return error_node(); } @@ -24001,7 +24048,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR164 - First parameter to swap is an invalid vector element: '" + var0_name + "'")); + "ERR165 - First parameter to swap is an invalid vector element: '" + var0_name + "'")); return error_node(); } @@ -24033,7 +24080,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR165 - First parameter to swap is an invalid variable: '" + var0_name + "'")); + "ERR166 - First parameter to swap is an invalid variable: '" + var0_name + "'")); return error_node(); } @@ -24046,7 +24093,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR166 - Expected ',' between parameters to swap")); + "ERR167 - Expected ',' between parameters to swap")); if (variable0_generated) { @@ -24063,7 +24110,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR167 - Expected a symbol for variable or vector element definition")); + "ERR168 - Expected a symbol for variable or vector element definition")); if (variable0_generated) { @@ -24079,7 +24126,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR168 - Second parameter to swap is an invalid vector element: '" + var1_name + "'")); + "ERR169 - Second parameter to swap is an invalid vector element: '" + var1_name + "'")); if (variable0_generated) { @@ -24116,7 +24163,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR169 - Second parameter to swap is an invalid variable: '" + var1_name + "'")); + "ERR170 - Second parameter to swap is an invalid variable: '" + var1_name + "'")); if (variable0_generated) { @@ -24134,7 +24181,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR170 - Expected ')' at end of swap statement")); + "ERR171 - Expected ')' at end of swap statement")); if (variable0_generated) { @@ -24188,7 +24235,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR171 - Return call within a return call is not allowed")); + "ERR172 - Return call within a return call is not allowed")); return error_node(); } @@ -24211,7 +24258,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR172 - Expected '[' at start of return statement")); + "ERR173 - Expected '[' at start of return statement")); return error_node(); } @@ -24233,7 +24280,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR173 - Expected ',' between values during call to return")); + "ERR174 - Expected ',' between values during call to return")); return error_node(); } @@ -24244,7 +24291,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR174 - Zero parameter return statement not allowed")); + "ERR175 - Zero parameter return statement not allowed")); return error_node(); } @@ -24258,7 +24305,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, prev_token, - "ERR175 - Invalid ']' found during return call")); + "ERR176 - Invalid ']' found during return call")); return error_node(); } @@ -24310,7 +24357,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR176 - Invalid sequence of variable '"+ symbol + "' and bracket")); + "ERR177 - Invalid sequence of variable '"+ symbol + "' and bracket")); return false; } @@ -24357,7 +24404,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR177 - Invalid sequence of brackets")); + "ERR178 - Invalid sequence of brackets")); return false; } @@ -24453,7 +24500,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR178 - Failed to generate node for function: '" + symbol + "'")); + "ERR179 - Failed to generate node for function: '" + symbol + "'")); return error_node(); } @@ -24478,7 +24525,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR179 - Failed to generate node for vararg function: '" + symbol + "'")); + "ERR180 - Failed to generate node for vararg function: '" + symbol + "'")); return error_node(); } @@ -24503,7 +24550,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR180 - Failed to generate node for generic function: '" + symbol + "'")); + "ERR181 - Failed to generate node for generic function: '" + symbol + "'")); return error_node(); } @@ -24529,7 +24576,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR181 - Failed to generate node for string function: '" + symbol + "'")); + "ERR182 - Failed to generate node for string function: '" + symbol + "'")); return error_node(); } @@ -24551,7 +24598,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR182 - Invalid use of reserved symbol '" + symbol + "'")); + "ERR183 - Invalid use of reserved symbol '" + symbol + "'")); return error_node(); } @@ -24562,63 +24609,93 @@ namespace exprtk { if (!(settings_.rsrvd_sym_usr_disabled() && details::is_reserved_symbol(symbol))) { - T default_value = T(0); + symbol_table_t& symtab = symtab_store_.get_symbol_table(); std::string error_message; - typename unknown_symbol_resolver::usr_symbol_type usr_symbol_type; - if (unknown_symbol_resolver_->process(symbol,usr_symbol_type,default_value,error_message)) + if (unknown_symbol_resolver::e_usrmode_default == unknown_symbol_resolver_->mode) { - bool create_result = false; + T default_value = T(0); + typename unknown_symbol_resolver::usr_symbol_type usr_symbol_type; - symbol_table_t& symtab = symtab_store_.get_symbol_table(); - - switch (usr_symbol_type) + if (unknown_symbol_resolver_->process(symbol, usr_symbol_type, default_value, error_message)) { - case unknown_symbol_resolver::e_usr_variable_type : create_result = symtab.create_variable(symbol,default_value); - break; + bool create_result = false; - case unknown_symbol_resolver::e_usr_constant_type : create_result = symtab.add_constant(symbol,default_value); - break; + switch (usr_symbol_type) + { + case unknown_symbol_resolver::e_usr_variable_type : create_result = symtab.create_variable(symbol, default_value); + break; - default : create_result = false; - } + case unknown_symbol_resolver::e_usr_constant_type : create_result = symtab.add_constant(symbol, default_value); + break; - if (create_result) - { - expression_node_ptr var = symtab_store_.get_variable(symbol); + default : create_result = false; + } - if (var) + if (create_result) { - if (symtab_store_.is_constant_node(symbol)) + expression_node_ptr var = symtab_store_.get_variable(symbol); + + if (var) { - var = expression_generator_(var->value()); - } + if (symtab_store_.is_constant_node(symbol)) + { + var = expression_generator_(var->value()); + } - lodge_symbol(symbol,e_st_variable); + lodge_symbol(symbol,e_st_variable); - if (!post_variable_process(symbol)) - return error_node(); + if (!post_variable_process(symbol)) + return error_node(); - next_token(); + next_token(); - return var; + return var; + } } } set_error( make_error(parser_error::e_symtab, current_token(), - "ERR183 - Failed to create variable: '" + symbol + "'")); + "ERR184 - Failed to create variable: '" + symbol + "'" + + (error_message.empty() ? "" : " - " + error_message))); - return error_node(); } + else if (unknown_symbol_resolver::e_usrmode_extended == unknown_symbol_resolver_->mode) + { + if (unknown_symbol_resolver_->process(symbol, symtab, error_message)) + { + static bool usr_extmode_active = false; + + if (!usr_extmode_active) + { + usr_extmode_active = true; + expression_node_ptr result = parse_symtab_symbol(); + usr_extmode_active = false; + + if (result) + { + return result; + } + } + } + + set_error( + make_error(parser_error::e_symtab, + current_token(), + "ERR185 - Failed to resolve symbol: '" + symbol + "'" + + (error_message.empty() ? "" : " - " + error_message))); + } + + return error_node(); } } set_error( make_error(parser_error::e_syntax, current_token(), - "ERR184 - Undefined symbol: '" + symbol + "'")); + "ERR186 - Undefined symbol: '" + symbol + "'")); return error_node(); } @@ -24724,7 +24801,7 @@ namespace exprtk set_error( make_error(parser_error::e_symtab, current_token(), - "ERR185 - Variable or function detected, yet symbol-table is invalid, Symbol: " + current_token().value)); + "ERR187 - Variable or function detected, yet symbol-table is invalid, Symbol: " + current_token().value)); return error_node(); } @@ -24749,7 +24826,7 @@ namespace exprtk set_error( make_error(parser_error::e_numeric, current_token(), - "ERR186 - Failed to convert '" + current_token().value + "' to a number")); + "ERR188 - Failed to convert '" + current_token().value + "' to a number")); return error_node(); } @@ -24775,7 +24852,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR187 - Expected ')' instead of: '" + current_token().value + "'")); + "ERR189 - Expected ')' instead of: '" + current_token().value + "'")); free_node(node_allocator_,branch); @@ -24799,7 +24876,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR188 - Expected ']' instead of: '" + current_token().value + "'")); + "ERR190 - Expected ']' instead of: '" + current_token().value + "'")); free_node(node_allocator_,branch); @@ -24823,7 +24900,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR189 - Expected '}' instead of: '" + current_token().value + "'")); + "ERR191 - Expected '}' instead of: '" + current_token().value + "'")); free_node(node_allocator_,branch); @@ -24862,7 +24939,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR190 - Premature end of expression[1]")); + "ERR192 - Premature end of expression[1]")); return error_node(); } @@ -24871,7 +24948,7 @@ namespace exprtk set_error( make_error(parser_error::e_syntax, current_token(), - "ERR191 - Premature end of expression[2]")); + "ERR193 - Premature end of expression[2]")); return error_node(); } @@ -26517,12 +26594,14 @@ namespace exprtk else if (all_nodes_variables(arg_list)) return varnode_optimise_varargfunc(operation,arg_list); + #ifndef exprtk_disable_string_capabilities if (details::e_smulti == operation) { return node_allocator_-> allocate > >(arg_list); } else + #endif { switch (operation) {