mirror of
https://github.com/ArashPartow/exprtk.git
synced 2025-06-12 16:27:23 +00:00
C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html
This commit is contained in:
145
exprtk.hpp
145
exprtk.hpp
@ -18792,20 +18792,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
|
||||
@ -19948,6 +19970,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;
|
||||
@ -24539,63 +24566,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;
|
||||
|
||||
default : create_result = false;
|
||||
}
|
||||
|
||||
if (create_result)
|
||||
{
|
||||
expression_node_ptr var = symtab_store_.get_variable(symbol);
|
||||
|
||||
if (var)
|
||||
switch (usr_symbol_type)
|
||||
{
|
||||
if (symtab_store_.is_constant_node(symbol))
|
||||
case unknown_symbol_resolver::e_usr_variable_type : create_result = symtab.create_variable(symbol, default_value);
|
||||
break;
|
||||
|
||||
case unknown_symbol_resolver::e_usr_constant_type : create_result = symtab.add_constant(symbol, default_value);
|
||||
break;
|
||||
|
||||
default : create_result = false;
|
||||
}
|
||||
|
||||
if (create_result)
|
||||
{
|
||||
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);
|
||||
|
||||
if (!post_variable_process(symbol))
|
||||
return error_node();
|
||||
|
||||
next_token();
|
||||
|
||||
return var;
|
||||
}
|
||||
|
||||
lodge_symbol(symbol,e_st_variable);
|
||||
|
||||
if (!post_variable_process(symbol))
|
||||
return error_node();
|
||||
|
||||
next_token();
|
||||
|
||||
return var;
|
||||
}
|
||||
}
|
||||
|
||||
set_error(
|
||||
make_error(parser_error::e_symtab,
|
||||
current_token(),
|
||||
"ERR183 - Failed to create variable: '" + symbol + "'"));
|
||||
"ERR183 - 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(),
|
||||
"ERR184 - 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 + "'"));
|
||||
"ERR185 - Undefined symbol: '" + symbol + "'"));
|
||||
|
||||
return error_node();
|
||||
}
|
||||
@ -24701,7 +24758,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));
|
||||
"ERR186 - Variable or function detected, yet symbol-table is invalid, Symbol: " + current_token().value));
|
||||
|
||||
return error_node();
|
||||
}
|
||||
@ -24726,7 +24783,7 @@ namespace exprtk
|
||||
set_error(
|
||||
make_error(parser_error::e_numeric,
|
||||
current_token(),
|
||||
"ERR186 - Failed to convert '" + current_token().value + "' to a number"));
|
||||
"ERR187 - Failed to convert '" + current_token().value + "' to a number"));
|
||||
|
||||
return error_node();
|
||||
}
|
||||
@ -24752,7 +24809,7 @@ namespace exprtk
|
||||
set_error(
|
||||
make_error(parser_error::e_syntax,
|
||||
current_token(),
|
||||
"ERR187 - Expected ')' instead of: '" + current_token().value + "'"));
|
||||
"ERR188 - Expected ')' instead of: '" + current_token().value + "'"));
|
||||
|
||||
free_node(node_allocator_,branch);
|
||||
|
||||
@ -24776,7 +24833,7 @@ namespace exprtk
|
||||
set_error(
|
||||
make_error(parser_error::e_syntax,
|
||||
current_token(),
|
||||
"ERR188 - Expected ']' instead of: '" + current_token().value + "'"));
|
||||
"ERR189 - Expected ']' instead of: '" + current_token().value + "'"));
|
||||
|
||||
free_node(node_allocator_,branch);
|
||||
|
||||
@ -24800,7 +24857,7 @@ namespace exprtk
|
||||
set_error(
|
||||
make_error(parser_error::e_syntax,
|
||||
current_token(),
|
||||
"ERR189 - Expected '}' instead of: '" + current_token().value + "'"));
|
||||
"ERR190 - Expected '}' instead of: '" + current_token().value + "'"));
|
||||
|
||||
free_node(node_allocator_,branch);
|
||||
|
||||
@ -24839,7 +24896,7 @@ namespace exprtk
|
||||
set_error(
|
||||
make_error(parser_error::e_syntax,
|
||||
current_token(),
|
||||
"ERR190 - Premature end of expression[1]"));
|
||||
"ERR191 - Premature end of expression[1]"));
|
||||
|
||||
return error_node();
|
||||
}
|
||||
@ -24848,7 +24905,7 @@ namespace exprtk
|
||||
set_error(
|
||||
make_error(parser_error::e_syntax,
|
||||
current_token(),
|
||||
"ERR191 - Premature end of expression[2]"));
|
||||
"ERR192 - Premature end of expression[2]"));
|
||||
|
||||
return error_node();
|
||||
}
|
||||
|
Reference in New Issue
Block a user