From d303b70eed900050fd89252c36c6863fea06f1da Mon Sep 17 00:00:00 2001 From: Arash Partow Date: Tue, 21 Apr 2015 09:51:02 +1000 Subject: [PATCH] C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html --- exprtk.hpp | 78 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 28 deletions(-) diff --git a/exprtk.hpp b/exprtk.hpp index fa85910..395da9d 100644 --- a/exprtk.hpp +++ b/exprtk.hpp @@ -15668,7 +15668,7 @@ namespace exprtk t.mode = mode; t.token.type = lexer::token::e_error; t.diagnostic = diagnostic; - exprtk_debug(((diagnostic + "\n").c_str())); + exprtk_debug(("%s\n",diagnostic .c_str())); return t; } @@ -15678,7 +15678,7 @@ namespace exprtk t.mode = mode; t.token = tk; t.diagnostic = diagnostic; - exprtk_debug(((diagnostic + "\n").c_str())); + exprtk_debug(("%s\n",diagnostic .c_str())); return t; } @@ -16608,6 +16608,20 @@ namespace exprtk 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_break_stmt; 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())); - 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]); } - if ( - return_node_present || - side_effect_list.back() || - (expression_list.size() > 1) - ) - state_.side_effect_present = true; - if (!return_node_present) { tmp_expression_list.push_back(expression_list.back()); @@ -19593,6 +19600,13 @@ namespace exprtk static_cast(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()) return expression_list[0]; else @@ -20580,6 +20594,8 @@ namespace exprtk } } + state_.activate_side_effect("parse_break_statement()"); + return node_allocator_.allocate >(return_expr); } else @@ -20598,7 +20614,10 @@ namespace exprtk if (!brkcnt_list_.empty()) { next_token(); + brkcnt_list_.front() = true; + state_.activate_side_effect("parse_continue_statement()"); + return node_allocator_.allocate >(); } else @@ -20853,10 +20872,10 @@ namespace exprtk exprtk_debug(("parse_define_vector_statement() - INFO - Added new local vector: %s[%d]\n", nse.name.c_str(), static_cast(nse.size))); - - state_.side_effect_present = true; } + state_.activate_side_effect("parse_define_vector_statement()"); + lodge_symbol(vec_name,e_st_local_vector); expression_node_ptr result = @@ -20929,12 +20948,12 @@ namespace exprtk str_node = nse.str_node; 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); + state_.activate_side_effect("parse_define_string_statement()"); + expression_node_ptr branch[2] = {0}; branch[0] = str_node; @@ -21115,10 +21134,10 @@ namespace exprtk var_node = nse.var_node; 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); expression_node_ptr branch[2] = {0}; @@ -21200,13 +21219,14 @@ namespace exprtk return error_node(); } - exprtk_debug(("parse_uninitialised_var_statement() - INFO - Added new local variable: %s\n",nse.name.c_str())); - - state_.side_effect_present = true; + exprtk_debug(("parse_uninitialised_var_statement() - INFO - Added new local variable: %s\n", + nse.name.c_str())); } lodge_symbol(var_name,e_st_local_variable); + state_.activate_side_effect("parse_uninitialised_var_statement()"); + return expression_generator_(T(0)); } @@ -21427,7 +21447,7 @@ namespace exprtk else result = node_allocator_.allocate >(variable0,variable1); - state_.side_effect_present = true; + state_.activate_side_effect("parse_swap_statement()"); return result; } @@ -21513,6 +21533,8 @@ namespace exprtk state_.return_stmt_present = true; + state_.activate_side_effect("parse_return_statement()"); + return result; } @@ -23785,7 +23807,7 @@ namespace exprtk result = node_allocator_->allocate(v); } - parser_->state_.side_effect_present = true; + parser_->state_.activate_side_effect("vararg_function_call()"); return result; } @@ -23827,7 +23849,7 @@ namespace exprtk } else if (genfunc_node_ptr->init_branches()) { - parser_->state_.side_effect_present = true; + parser_->state_.activate_side_effect("generic_function_call()"); return result; } else @@ -23875,7 +23897,7 @@ namespace exprtk } else if (strfunc_node_ptr->init_branches()) { - parser_->state_.side_effect_present = true; + parser_->state_.activate_side_effect("string_function_call()"); return result; } else @@ -23903,7 +23925,7 @@ namespace exprtk if (return_node_ptr->init_branches()) { - parser_->state_.side_effect_present = true; + parser_->state_.activate_side_effect("return_call()"); return result; } else @@ -23962,7 +23984,7 @@ namespace exprtk 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; } @@ -24007,7 +24029,7 @@ namespace exprtk 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()) return; @@ -24367,7 +24389,7 @@ namespace exprtk return error_node(); } - parser_->state_.side_effect_present = true; + parser_->state_.activate_side_effect("synthesize_swap_expression()"); return result; } @@ -30344,7 +30366,7 @@ namespace exprtk return node_allocator_->allocate(v); } - parser_->state_.side_effect_present = true; + parser_->state_.activate_side_effect("synthesize_expression(function)"); return expression_point; }