C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html
This commit is contained in:
parent
1a800f4ff0
commit
73a594675e
55
exprtk.hpp
55
exprtk.hpp
|
@ -6474,6 +6474,12 @@ namespace exprtk
|
||||||
return allocate<ResultNode>(operation,branch[0],branch[1],branch[2],branch[3],branch[4],branch[5]);
|
return allocate<ResultNode>(operation,branch[0],branch[1],branch[2],branch[3],branch[4],branch[5]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename node_type>
|
||||||
|
inline expression_node<typename node_type::value_type>* allocate() const
|
||||||
|
{
|
||||||
|
return new node_type();
|
||||||
|
}
|
||||||
|
|
||||||
template <typename node_type, typename T1>
|
template <typename node_type, typename T1>
|
||||||
inline expression_node<typename node_type::value_type>* allocate(T1& t1) const
|
inline expression_node<typename node_type::value_type>* allocate(T1& t1) const
|
||||||
{
|
{
|
||||||
|
@ -8104,7 +8110,9 @@ namespace exprtk
|
||||||
{
|
{
|
||||||
if (expression_string.empty())
|
if (expression_string.empty())
|
||||||
{
|
{
|
||||||
set_error(parser_error::make_error(parser_error::e_syntax, "ERR00 - Empty expression!"));
|
set_error(
|
||||||
|
make_error(parser_error::e_syntax,
|
||||||
|
"ERR00 - Empty expression!"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8137,7 +8145,9 @@ namespace exprtk
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
set_error(parser_error::make_error(parser_error::e_syntax, "ERR01 - Incomplete expression!"));
|
set_error(
|
||||||
|
make_error(parser_error::e_syntax,
|
||||||
|
"ERR01 - Incomplete expression!"));
|
||||||
symbol_name_cache_.clear();
|
symbol_name_cache_.clear();
|
||||||
if (0 != e)
|
if (0 != e)
|
||||||
{
|
{
|
||||||
|
@ -8764,8 +8774,18 @@ namespace exprtk
|
||||||
}
|
}
|
||||||
else if (!token_is(token_t::e_rcrlbracket))
|
else if (!token_is(token_t::e_rcrlbracket))
|
||||||
return error_node();
|
return error_node();
|
||||||
|
|
||||||
|
expression_node_ptr result;
|
||||||
|
if (0 == (result = expression_generator_.while_loop(condition,branch)))
|
||||||
|
{
|
||||||
|
set_error(
|
||||||
|
make_error(parser_error::e_syntax,
|
||||||
|
current_token_,
|
||||||
|
"ERR18 - Failed to parse branch for while-loop"));
|
||||||
|
return error_node();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
return expression_generator_.while_loop(condition,branch);
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Type, std::size_t NumberOfParameters>
|
template <typename Type, std::size_t NumberOfParameters>
|
||||||
|
@ -8818,7 +8838,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_token,
|
make_error(parser_error::e_token,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR18 - Invalid special function[1]: " + current_token_.value));
|
"ERR19 - Invalid special function[1]: " + current_token_.value));
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8829,7 +8849,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_token,
|
make_error(parser_error::e_token,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR19 - Invalid special function[2]: " + current_token_.value));
|
"ERR20 - Invalid special function[2]: " + current_token_.value));
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8915,7 +8935,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR20 - Invalid number of parameters for function: " + symbol));
|
"ERR21 - Invalid number of parameters for function: " + symbol));
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8927,7 +8947,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR21 - Failed to generate node for function: '" + symbol + "'"));
|
"ERR22 - Failed to generate node for function: '" + symbol + "'"));
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8936,7 +8956,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR22 - Undefined variable or function: '" + symbol + "'"));
|
"ERR23 - Undefined variable or function: '" + symbol + "'"));
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8971,7 +8991,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_symtab,
|
make_error(parser_error::e_symtab,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR23 - Variable or function detected, yet symbol-table is invalid, Symbol: " + current_token_.value));
|
"ERR24 - Variable or function detected, yet symbol-table is invalid, Symbol: " + current_token_.value));
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9046,7 +9066,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR24 - Premature end of expression.[1]"));
|
"ERR25 - Premature end of expression.[1]"));
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -9054,7 +9074,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR25 - Premature end of expression.[2]"));
|
"ERR26 - Premature end of expression.[2]"));
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9616,6 +9636,19 @@ namespace exprtk
|
||||||
inline expression_node_ptr while_loop(expression_node_ptr condition,
|
inline expression_node_ptr while_loop(expression_node_ptr condition,
|
||||||
expression_node_ptr branch) const
|
expression_node_ptr branch) const
|
||||||
{
|
{
|
||||||
|
if (details::is_constant_node(condition))
|
||||||
|
{
|
||||||
|
expression_node_ptr result = error_node();
|
||||||
|
if (details::is_true(condition))
|
||||||
|
//Infinite loops are not allowed.
|
||||||
|
result = error_node();
|
||||||
|
else
|
||||||
|
result = node_allocator_->allocate<details::null_node<Type> >();
|
||||||
|
free_node(*node_allocator_,condition);
|
||||||
|
free_node(*node_allocator_,branch);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
else
|
||||||
return node_allocator_->allocate<while_loop_node_t>(condition,branch);
|
return node_allocator_->allocate<while_loop_node_t>(condition,branch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue