C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html
This commit is contained in:
parent
060ac1140e
commit
6b98239580
98
exprtk.hpp
98
exprtk.hpp
|
@ -15984,7 +15984,7 @@ namespace exprtk
|
||||||
{
|
{
|
||||||
scope_element& se = element_[i];
|
scope_element& se = element_[i];
|
||||||
|
|
||||||
if (se.depth > parser_.scope_depth_)
|
if (se.depth > parser_.state_.scope_depth)
|
||||||
return null_element_;
|
return null_element_;
|
||||||
else if (
|
else if (
|
||||||
(se.name == var_name) &&
|
(se.name == var_name) &&
|
||||||
|
@ -16003,7 +16003,7 @@ namespace exprtk
|
||||||
{
|
{
|
||||||
scope_element& se = element_[i];
|
scope_element& se = element_[i];
|
||||||
|
|
||||||
if (se.depth > parser_.scope_depth_)
|
if (se.depth > parser_.state_.scope_depth)
|
||||||
return null_element_;
|
return null_element_;
|
||||||
else if (
|
else if (
|
||||||
(se.name == var_name) &&
|
(se.name == var_name) &&
|
||||||
|
@ -16041,7 +16041,8 @@ namespace exprtk
|
||||||
|
|
||||||
inline void deactivate(const std::size_t& scope_depth)
|
inline void deactivate(const std::size_t& scope_depth)
|
||||||
{
|
{
|
||||||
exprtk_debug(("deactivate() - Scope depth: %d\n",static_cast<int>(parser_.scope_depth_)));
|
exprtk_debug(("deactivate() - Scope depth: %d\n",
|
||||||
|
static_cast<int>(parser_.state_.scope_depth)));
|
||||||
|
|
||||||
for (std::size_t i = 0; i < element_.size(); ++i)
|
for (std::size_t i = 0; i < element_.size(); ++i)
|
||||||
{
|
{
|
||||||
|
@ -16137,20 +16138,24 @@ namespace exprtk
|
||||||
scope_handler(parser<T>& p)
|
scope_handler(parser<T>& p)
|
||||||
: parser_(p)
|
: parser_(p)
|
||||||
{
|
{
|
||||||
parser_.scope_depth_++;
|
parser_.state_.scope_depth++;
|
||||||
#ifdef exprtk_enable_debugging
|
#ifdef exprtk_enable_debugging
|
||||||
std::string depth(2 * parser_.scope_depth_,'-');
|
std::string depth(2 * parser_.state_.scope_depth,'-');
|
||||||
exprtk_debug(("%s> Scope Depth: %02d\n",depth.c_str(),static_cast<int>(parser_.scope_depth_)));
|
exprtk_debug(("%s> Scope Depth: %02d\n",
|
||||||
|
depth.c_str(),
|
||||||
|
static_cast<int>(parser_.state_.scope_depth)));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
~scope_handler()
|
~scope_handler()
|
||||||
{
|
{
|
||||||
parser_.sem_.deactivate(parser_.scope_depth_);
|
parser_.sem_.deactivate(parser_.state_.scope_depth);
|
||||||
parser_.scope_depth_--;
|
parser_.state_.scope_depth--;
|
||||||
#ifdef exprtk_enable_debugging
|
#ifdef exprtk_enable_debugging
|
||||||
std::string depth(2 * parser_.scope_depth_,'-');
|
std::string depth(2 * parser_.state_.scope_depth,'-');
|
||||||
exprtk_debug(("<%s Scope Depth: %02d\n",depth.c_str(),static_cast<int>(parser_.scope_depth_)));
|
exprtk_debug(("<%s Scope Depth: %02d\n",
|
||||||
|
depth.c_str(),
|
||||||
|
static_cast<int>(parser_.state_.scope_depth)));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16573,6 +16578,29 @@ namespace exprtk
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct parser_state
|
||||||
|
{
|
||||||
|
parser_state()
|
||||||
|
: parsing_return_stmt(false),
|
||||||
|
parsing_break_stmt (false),
|
||||||
|
return_stmt_present(false),
|
||||||
|
scope_depth(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void reset()
|
||||||
|
{
|
||||||
|
parsing_return_stmt = false;
|
||||||
|
parsing_break_stmt = false;
|
||||||
|
return_stmt_present = false;
|
||||||
|
scope_depth = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool parsing_return_stmt;
|
||||||
|
bool parsing_break_stmt;
|
||||||
|
bool return_stmt_present;
|
||||||
|
std::size_t scope_depth;
|
||||||
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
struct unknown_symbol_resolver
|
struct unknown_symbol_resolver
|
||||||
|
@ -17065,11 +17093,7 @@ namespace exprtk
|
||||||
|
|
||||||
parser(const settings_t& settings = settings_t())
|
parser(const settings_t& settings = settings_t())
|
||||||
: settings_(settings),
|
: settings_(settings),
|
||||||
parsing_return_stmt_ (false),
|
|
||||||
parsing_break_stmt_ (false),
|
|
||||||
return_stmt_present_ (false),
|
|
||||||
resolve_unknown_symbol_(false),
|
resolve_unknown_symbol_(false),
|
||||||
scope_depth_(0),
|
|
||||||
results_context_(0),
|
results_context_(0),
|
||||||
unknown_symbol_resolver_(reinterpret_cast<unknown_symbol_resolver*>(0)),
|
unknown_symbol_resolver_(reinterpret_cast<unknown_symbol_resolver*>(0)),
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
@ -17170,16 +17194,16 @@ namespace exprtk
|
||||||
|
|
||||||
inline bool compile(const std::string& expression_string, expression<T>& expr)
|
inline bool compile(const std::string& expression_string, expression<T>& expr)
|
||||||
{
|
{
|
||||||
|
state_ .reset();
|
||||||
error_list_ .clear();
|
error_list_ .clear();
|
||||||
brkcnt_list_ .clear();
|
brkcnt_list_ .clear();
|
||||||
synthesis_error_.clear();
|
synthesis_error_.clear();
|
||||||
sem_ .cleanup();
|
sem_ .cleanup();
|
||||||
|
|
||||||
return_cleanup();
|
return_cleanup();
|
||||||
|
|
||||||
expression_generator_.set_allocator(node_allocator_);
|
expression_generator_.set_allocator(node_allocator_);
|
||||||
|
|
||||||
scope_depth_ = 0;
|
|
||||||
|
|
||||||
if (expression_string.empty())
|
if (expression_string.empty())
|
||||||
{
|
{
|
||||||
set_error(
|
set_error(
|
||||||
|
@ -17219,7 +17243,7 @@ namespace exprtk
|
||||||
|
|
||||||
if ((0 != e) && (token_t::e_eof == current_token_.type))
|
if ((0 != e) && (token_t::e_eof == current_token_.type))
|
||||||
{
|
{
|
||||||
if (return_stmt_present_)
|
if (state_.return_stmt_present)
|
||||||
{
|
{
|
||||||
e = expression_generator_.return_envelope(e,results_context_);
|
e = expression_generator_.return_envelope(e,results_context_);
|
||||||
}
|
}
|
||||||
|
@ -17506,7 +17530,7 @@ namespace exprtk
|
||||||
{
|
{
|
||||||
std::string ct_str = current_token_.value;
|
std::string ct_str = current_token_.value;
|
||||||
current_token_ = lexer_.next_token();
|
current_token_ = lexer_.next_token();
|
||||||
std::string depth(2 * scope_depth_,' ');
|
std::string depth(2 * state_.scope_depth,' ');
|
||||||
exprtk_debug(("%s"
|
exprtk_debug(("%s"
|
||||||
"prev[%s] --> curr[%s]\n",
|
"prev[%s] --> curr[%s]\n",
|
||||||
depth.c_str(),
|
depth.c_str(),
|
||||||
|
@ -17560,6 +17584,7 @@ namespace exprtk
|
||||||
result = simplify(arg_list);
|
result = simplify(arg_list);
|
||||||
|
|
||||||
sdd.delete_ptr = (0 == result);
|
sdd.delete_ptr = (0 == result);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18888,7 +18913,7 @@ namespace exprtk
|
||||||
nse.active = true;
|
nse.active = true;
|
||||||
nse.ref_count = 1;
|
nse.ref_count = 1;
|
||||||
nse.type = scope_element::e_variable;
|
nse.type = scope_element::e_variable;
|
||||||
nse.depth = scope_depth_;
|
nse.depth = state_.scope_depth;
|
||||||
nse.data = new T(T(0));
|
nse.data = new T(T(0));
|
||||||
nse.var_node = new variable_node_t(*(T*)(nse.data));
|
nse.var_node = new variable_node_t(*(T*)(nse.data));
|
||||||
|
|
||||||
|
@ -19832,7 +19857,7 @@ namespace exprtk
|
||||||
|
|
||||||
if (
|
if (
|
||||||
(se.name != symbol) ||
|
(se.name != symbol) ||
|
||||||
(se.depth > scope_depth_) ||
|
(se.depth > state_.scope_depth) ||
|
||||||
(scope_element::e_vector != se.type)
|
(scope_element::e_vector != se.type)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
@ -20373,7 +20398,7 @@ namespace exprtk
|
||||||
#ifndef exprtk_disable_break_continue
|
#ifndef exprtk_disable_break_continue
|
||||||
inline expression_node_ptr parse_break_statement()
|
inline expression_node_ptr parse_break_statement()
|
||||||
{
|
{
|
||||||
if (parsing_break_stmt_)
|
if (state_.parsing_break_stmt)
|
||||||
{
|
{
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
|
@ -20383,7 +20408,7 @@ namespace exprtk
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
|
||||||
scoped_bool_negator sbn(parsing_break_stmt_);
|
scoped_bool_negator sbn(state_.parsing_break_stmt);
|
||||||
|
|
||||||
if (!brkcnt_list_.empty())
|
if (!brkcnt_list_.empty())
|
||||||
{
|
{
|
||||||
|
@ -20656,7 +20681,7 @@ namespace exprtk
|
||||||
{
|
{
|
||||||
vec_holder = se.vec_node;
|
vec_holder = se.vec_node;
|
||||||
se.active = true;
|
se.active = true;
|
||||||
se.depth = scope_depth_;
|
se.depth = state_.scope_depth;
|
||||||
se.ref_count++;
|
se.ref_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20668,7 +20693,7 @@ namespace exprtk
|
||||||
nse.active = true;
|
nse.active = true;
|
||||||
nse.ref_count = 1;
|
nse.ref_count = 1;
|
||||||
nse.type = scope_element::e_vector;
|
nse.type = scope_element::e_vector;
|
||||||
nse.depth = scope_depth_;
|
nse.depth = state_.scope_depth;
|
||||||
nse.size = vec_size;
|
nse.size = vec_size;
|
||||||
nse.data = new T[vec_size];
|
nse.data = new T[vec_size];
|
||||||
nse.vec_node = new typename scope_element::vector_holder_t((T*)(nse.data),nse.size);
|
nse.vec_node = new typename scope_element::vector_holder_t((T*)(nse.data),nse.size);
|
||||||
|
@ -20731,7 +20756,7 @@ namespace exprtk
|
||||||
{
|
{
|
||||||
str_node = se.str_node;
|
str_node = se.str_node;
|
||||||
se.active = true;
|
se.active = true;
|
||||||
se.depth = scope_depth_;
|
se.depth = state_.scope_depth;
|
||||||
se.ref_count++;
|
se.ref_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20743,7 +20768,7 @@ namespace exprtk
|
||||||
nse.active = true;
|
nse.active = true;
|
||||||
nse.ref_count = 1;
|
nse.ref_count = 1;
|
||||||
nse.type = scope_element::e_string;
|
nse.type = scope_element::e_string;
|
||||||
nse.depth = scope_depth_;
|
nse.depth = state_.scope_depth;
|
||||||
nse.data = new std::string;
|
nse.data = new std::string;
|
||||||
nse.str_node = new stringvar_node_t(*(std::string*)(nse.data));
|
nse.str_node = new stringvar_node_t(*(std::string*)(nse.data));
|
||||||
|
|
||||||
|
@ -20915,7 +20940,7 @@ namespace exprtk
|
||||||
{
|
{
|
||||||
var_node = se.var_node;
|
var_node = se.var_node;
|
||||||
se.active = true;
|
se.active = true;
|
||||||
se.depth = scope_depth_;
|
se.depth = state_.scope_depth;
|
||||||
se.ref_count++;
|
se.ref_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20927,7 +20952,7 @@ namespace exprtk
|
||||||
nse.active = true;
|
nse.active = true;
|
||||||
nse.ref_count = 1;
|
nse.ref_count = 1;
|
||||||
nse.type = scope_element::e_variable;
|
nse.type = scope_element::e_variable;
|
||||||
nse.depth = scope_depth_;
|
nse.depth = state_.scope_depth;
|
||||||
nse.data = new T(T(0));
|
nse.data = new T(T(0));
|
||||||
nse.var_node = new variable_node_t(*(T*)(nse.data));
|
nse.var_node = new variable_node_t(*(T*)(nse.data));
|
||||||
|
|
||||||
|
@ -21014,7 +21039,7 @@ namespace exprtk
|
||||||
nse.active = true;
|
nse.active = true;
|
||||||
nse.ref_count = 1;
|
nse.ref_count = 1;
|
||||||
nse.type = scope_element::e_variable;
|
nse.type = scope_element::e_variable;
|
||||||
nse.depth = scope_depth_;
|
nse.depth = state_.scope_depth;
|
||||||
nse.ip_index = sem_.next_ip_index();
|
nse.ip_index = sem_.next_ip_index();
|
||||||
nse.data = new T(T(0));
|
nse.data = new T(T(0));
|
||||||
nse.var_node = new variable_node_t(*(T*)(nse.data));
|
nse.var_node = new variable_node_t(*(T*)(nse.data));
|
||||||
|
@ -21259,7 +21284,7 @@ namespace exprtk
|
||||||
|
|
||||||
inline expression_node_ptr parse_return_statement()
|
inline expression_node_ptr parse_return_statement()
|
||||||
{
|
{
|
||||||
if (parsing_return_stmt_)
|
if (state_.parsing_return_stmt)
|
||||||
{
|
{
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
|
@ -21269,7 +21294,7 @@ namespace exprtk
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
|
||||||
scoped_bool_negator sbn(parsing_return_stmt_);
|
scoped_bool_negator sbn(state_.parsing_return_stmt);
|
||||||
|
|
||||||
std::vector<expression_node_ptr> arg_list;
|
std::vector<expression_node_ptr> arg_list;
|
||||||
|
|
||||||
|
@ -21336,7 +21361,7 @@ namespace exprtk
|
||||||
|
|
||||||
sdd.delete_ptr = (0 == result);
|
sdd.delete_ptr = (0 == result);
|
||||||
|
|
||||||
return_stmt_present_ = true;
|
state_.return_stmt_present = true;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -23761,7 +23786,7 @@ namespace exprtk
|
||||||
nse.ref_count = 1;
|
nse.ref_count = 1;
|
||||||
nse.type = scope_element::e_vecelem;
|
nse.type = scope_element::e_vecelem;
|
||||||
nse.index = i;
|
nse.index = i;
|
||||||
nse.depth = parser_->scope_depth_;
|
nse.depth = parser_->state_.scope_depth;
|
||||||
nse.data = 0;
|
nse.data = 0;
|
||||||
nse.var_node = new variable_node_t((*v));
|
nse.var_node = new variable_node_t((*v));
|
||||||
|
|
||||||
|
@ -30427,7 +30452,7 @@ namespace exprtk
|
||||||
results_context_ = 0;
|
results_context_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return_stmt_present_ = false;
|
state_.return_stmt_present = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -30445,11 +30470,8 @@ namespace exprtk
|
||||||
dependent_entity_collector dec_;
|
dependent_entity_collector dec_;
|
||||||
std::deque<parser_error::type> error_list_;
|
std::deque<parser_error::type> error_list_;
|
||||||
std::deque<bool> brkcnt_list_;
|
std::deque<bool> brkcnt_list_;
|
||||||
bool parsing_return_stmt_;
|
parser_state state_;
|
||||||
bool parsing_break_stmt_;
|
|
||||||
bool return_stmt_present_;
|
|
||||||
bool resolve_unknown_symbol_;
|
bool resolve_unknown_symbol_;
|
||||||
std::size_t scope_depth_;
|
|
||||||
results_context_t* results_context_;
|
results_context_t* results_context_;
|
||||||
unknown_symbol_resolver* unknown_symbol_resolver_;
|
unknown_symbol_resolver* unknown_symbol_resolver_;
|
||||||
unknown_symbol_resolver default_usr_;
|
unknown_symbol_resolver default_usr_;
|
||||||
|
|
Loading…
Reference in New Issue