C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html

This commit is contained in:
Arash Partow 2015-04-21 09:51:02 +10:00
parent ef91ad59e9
commit d303b70eed
1 changed files with 50 additions and 28 deletions

View File

@ -15668,7 +15668,7 @@ namespace exprtk
t.mode = mode; t.mode = mode;
t.token.type = lexer::token::e_error; t.token.type = lexer::token::e_error;
t.diagnostic = diagnostic; t.diagnostic = diagnostic;
exprtk_debug(((diagnostic + "\n").c_str())); exprtk_debug(("%s\n",diagnostic .c_str()));
return t; return t;
} }
@ -15678,7 +15678,7 @@ namespace exprtk
t.mode = mode; t.mode = mode;
t.token = tk; t.token = tk;
t.diagnostic = diagnostic; t.diagnostic = diagnostic;
exprtk_debug(((diagnostic + "\n").c_str())); exprtk_debug(("%s\n",diagnostic .c_str()));
return t; return t;
} }
@ -16608,6 +16608,20 @@ namespace exprtk
scope_depth = 0; scope_depth = 0;
} }
#ifndef exprtk_enable_debugging
void activate_side_effect(const std::string&)
#else
void activate_side_effect(const std::string& source)
#endif
{
if (!side_effect_present)
{
side_effect_present = true;
exprtk_debug(("activate_side_effect() - caller: %s\n",source.c_str()));
}
}
bool parsing_return_stmt; bool parsing_return_stmt;
bool parsing_break_stmt; bool parsing_break_stmt;
bool return_stmt_present; bool return_stmt_present;
@ -19014,7 +19028,7 @@ namespace exprtk
{ {
exprtk_debug(("parse_for_loop() - INFO - Added new local variable: %s\n",nse.name.c_str())); exprtk_debug(("parse_for_loop() - INFO - Added new local variable: %s\n",nse.name.c_str()));
state_.side_effect_present = true; state_.activate_side_effect("parse_for_loop()");
} }
} }
} }
@ -19572,13 +19586,6 @@ namespace exprtk
tmp_expression_list.push_back(expression_list[i]); tmp_expression_list.push_back(expression_list[i]);
} }
if (
return_node_present ||
side_effect_list.back() ||
(expression_list.size() > 1)
)
state_.side_effect_present = true;
if (!return_node_present) if (!return_node_present)
{ {
tmp_expression_list.push_back(expression_list.back()); tmp_expression_list.push_back(expression_list.back());
@ -19593,6 +19600,13 @@ namespace exprtk
static_cast<int>(expression_list .size()))); static_cast<int>(expression_list .size())));
} }
if (
return_node_present ||
side_effect_list.back() ||
(expression_list.size() > 1)
)
state_.activate_side_effect("simplify()");
if (1 == expression_list.size()) if (1 == expression_list.size())
return expression_list[0]; return expression_list[0];
else else
@ -20580,6 +20594,8 @@ namespace exprtk
} }
} }
state_.activate_side_effect("parse_break_statement()");
return node_allocator_.allocate<details::break_node<T> >(return_expr); return node_allocator_.allocate<details::break_node<T> >(return_expr);
} }
else else
@ -20598,7 +20614,10 @@ namespace exprtk
if (!brkcnt_list_.empty()) if (!brkcnt_list_.empty())
{ {
next_token(); next_token();
brkcnt_list_.front() = true; brkcnt_list_.front() = true;
state_.activate_side_effect("parse_continue_statement()");
return node_allocator_.allocate<details::continue_node<T> >(); return node_allocator_.allocate<details::continue_node<T> >();
} }
else else
@ -20853,10 +20872,10 @@ namespace exprtk
exprtk_debug(("parse_define_vector_statement() - INFO - Added new local vector: %s[%d]\n", exprtk_debug(("parse_define_vector_statement() - INFO - Added new local vector: %s[%d]\n",
nse.name.c_str(), nse.name.c_str(),
static_cast<int>(nse.size))); static_cast<int>(nse.size)));
state_.side_effect_present = true;
} }
state_.activate_side_effect("parse_define_vector_statement()");
lodge_symbol(vec_name,e_st_local_vector); lodge_symbol(vec_name,e_st_local_vector);
expression_node_ptr result = expression_node_ptr result =
@ -20929,12 +20948,12 @@ namespace exprtk
str_node = nse.str_node; str_node = nse.str_node;
exprtk_debug(("parse_define_string_statement() - INFO - Added new local string variable: %s\n",nse.name.c_str())); exprtk_debug(("parse_define_string_statement() - INFO - Added new local string variable: %s\n",nse.name.c_str()));
state_.side_effect_present = true;
} }
lodge_symbol(str_name,e_st_local_string); lodge_symbol(str_name,e_st_local_string);
state_.activate_side_effect("parse_define_string_statement()");
expression_node_ptr branch[2] = {0}; expression_node_ptr branch[2] = {0};
branch[0] = str_node; branch[0] = str_node;
@ -21115,10 +21134,10 @@ namespace exprtk
var_node = nse.var_node; var_node = nse.var_node;
exprtk_debug(("parse_define_var_statement() - INFO - Added new local variable: %s\n",nse.name.c_str())); exprtk_debug(("parse_define_var_statement() - INFO - Added new local variable: %s\n",nse.name.c_str()));
state_.side_effect_present = true;
} }
state_.activate_side_effect("parse_define_var_statement()");
lodge_symbol(var_name,e_st_local_variable); lodge_symbol(var_name,e_st_local_variable);
expression_node_ptr branch[2] = {0}; expression_node_ptr branch[2] = {0};
@ -21200,13 +21219,14 @@ namespace exprtk
return error_node(); return error_node();
} }
exprtk_debug(("parse_uninitialised_var_statement() - INFO - Added new local variable: %s\n",nse.name.c_str())); exprtk_debug(("parse_uninitialised_var_statement() - INFO - Added new local variable: %s\n",
nse.name.c_str()));
state_.side_effect_present = true;
} }
lodge_symbol(var_name,e_st_local_variable); lodge_symbol(var_name,e_st_local_variable);
state_.activate_side_effect("parse_uninitialised_var_statement()");
return expression_generator_(T(0)); return expression_generator_(T(0));
} }
@ -21427,7 +21447,7 @@ namespace exprtk
else else
result = node_allocator_.allocate<details::swap_generic_node<T> >(variable0,variable1); result = node_allocator_.allocate<details::swap_generic_node<T> >(variable0,variable1);
state_.side_effect_present = true; state_.activate_side_effect("parse_swap_statement()");
return result; return result;
} }
@ -21513,6 +21533,8 @@ namespace exprtk
state_.return_stmt_present = true; state_.return_stmt_present = true;
state_.activate_side_effect("parse_return_statement()");
return result; return result;
} }
@ -23785,7 +23807,7 @@ namespace exprtk
result = node_allocator_->allocate<literal_node_t>(v); result = node_allocator_->allocate<literal_node_t>(v);
} }
parser_->state_.side_effect_present = true; parser_->state_.activate_side_effect("vararg_function_call()");
return result; return result;
} }
@ -23827,7 +23849,7 @@ namespace exprtk
} }
else if (genfunc_node_ptr->init_branches()) else if (genfunc_node_ptr->init_branches())
{ {
parser_->state_.side_effect_present = true; parser_->state_.activate_side_effect("generic_function_call()");
return result; return result;
} }
else else
@ -23875,7 +23897,7 @@ namespace exprtk
} }
else if (strfunc_node_ptr->init_branches()) else if (strfunc_node_ptr->init_branches())
{ {
parser_->state_.side_effect_present = true; parser_->state_.activate_side_effect("string_function_call()");
return result; return result;
} }
else else
@ -23903,7 +23925,7 @@ namespace exprtk
if (return_node_ptr->init_branches()) if (return_node_ptr->init_branches())
{ {
parser_->state_.side_effect_present = true; parser_->state_.activate_side_effect("return_call()");
return result; return result;
} }
else else
@ -23962,7 +23984,7 @@ namespace exprtk
exprtk_debug(("vector_element() - INFO - Added new local vector element: %s\n",nse.name.c_str())); exprtk_debug(("vector_element() - INFO - Added new local vector element: %s\n",nse.name.c_str()));
parser_->state_.side_effect_present = true; parser_->state_.activate_side_effect("vector_element()");
result = nse.var_node; result = nse.var_node;
} }
@ -24007,7 +24029,7 @@ namespace exprtk
void lodge_assignment(symbol_type cst, expression_node_ptr node) void lodge_assignment(symbol_type cst, expression_node_ptr node)
{ {
parser_->state_.side_effect_present = true; parser_->state_.activate_side_effect("lodge_assignment()");
if (!parser_->dec_.collect_assignments()) if (!parser_->dec_.collect_assignments())
return; return;
@ -24367,7 +24389,7 @@ namespace exprtk
return error_node(); return error_node();
} }
parser_->state_.side_effect_present = true; parser_->state_.activate_side_effect("synthesize_swap_expression()");
return result; return result;
} }
@ -30344,7 +30366,7 @@ namespace exprtk
return node_allocator_->allocate<literal_node_t>(v); return node_allocator_->allocate<literal_node_t>(v);
} }
parser_->state_.side_effect_present = true; parser_->state_.activate_side_effect("synthesize_expression(function<NT,N>)");
return expression_point; return expression_point;
} }