Browse Source

Minor updates to ExprTk

Updated unknown symbol resolver interface to handle all types (scalar, string and vector)
Added compile-time check for vector indexing when using constant values
Added return statement enable/disable via parser settings
Added exprtk_disable_return_statement macro for disabling return statements and associated exceptions at the source code level.
tempestpy_adaptions
ArashPartow 8 years ago
parent
commit
4c99790213
  1. 317
      resources/3rdparty/exprtk/exprtk.hpp

317
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<int>(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<int>(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<details::str_vararg_node<Type,details::vararg_multi_op<Type> > >(arg_list);
}
else
#endif
{
switch (operation)
{

Loading…
Cancel
Save