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

This commit is contained in:
Arash Partow 2017-02-06 18:03:16 +11:00
parent 0cadf91a31
commit 177c0e0883
24 changed files with 854 additions and 248 deletions

View File

@ -2,7 +2,7 @@
# ************************************************************** # **************************************************************
# * C++ Mathematical Expression Toolkit Library * # * C++ Mathematical Expression Toolkit Library *
# * * # * *
# * Author: Arash Partow (1999-2016) * # * Author: Arash Partow (1999-2017) *
# * URL: http://www.partow.net/programming/exprtk/index.html * # * URL: http://www.partow.net/programming/exprtk/index.html *
# * * # * *
# * Copyright notice: * # * Copyright notice: *

View File

@ -2,7 +2,7 @@
****************************************************************** ******************************************************************
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -15681,73 +15681,185 @@ namespace exprtk
{ {
public: public:
typedef T (*ff1_functor)(T); typedef T (*ff01_functor)(T);
typedef T (*ff2_functor)(T,T); typedef T (*ff02_functor)(T,T);
typedef T (*ff3_functor)(T,T,T); typedef T (*ff03_functor)(T,T,T);
typedef T (*ff4_functor)(T,T,T,T); typedef T (*ff04_functor)(T,T,T,T);
typedef T (*ff5_functor)(T,T,T,T,T); typedef T (*ff05_functor)(T,T,T,T,T);
typedef T (*ff6_functor)(T,T,T,T,T,T); typedef T (*ff06_functor)(T,T,T,T,T,T);
typedef T (*ff07_functor)(T,T,T,T,T,T,T);
typedef T (*ff08_functor)(T,T,T,T,T,T,T,T);
typedef T (*ff09_functor)(T,T,T,T,T,T,T,T,T);
typedef T (*ff10_functor)(T,T,T,T,T,T,T,T,T,T);
typedef T (*ff11_functor)(T,T,T,T,T,T,T,T,T,T,T);
typedef T (*ff12_functor)(T,T,T,T,T,T,T,T,T,T,T,T);
typedef T (*ff13_functor)(T,T,T,T,T,T,T,T,T,T,T,T,T);
typedef T (*ff14_functor)(T,T,T,T,T,T,T,T,T,T,T,T,T,T);
typedef T (*ff15_functor)(T,T,T,T,T,T,T,T,T,T,T,T,T,T,T);
protected: protected:
struct freefunc1 : public exprtk::ifunction<T> struct freefunc01 : public exprtk::ifunction<T>
{ {
using exprtk::ifunction<T>::operator(); using exprtk::ifunction<T>::operator();
freefunc1(ff1_functor ff) : exprtk::ifunction<T>(1), f(ff) {} freefunc01(ff01_functor ff) : exprtk::ifunction<T>(1), f(ff) {}
inline T operator()(const T& v0) inline T operator()(const T& v0)
{ return f(v0); } { return f(v0); }
ff1_functor f; ff01_functor f;
}; };
struct freefunc2 : public exprtk::ifunction<T> struct freefunc02 : public exprtk::ifunction<T>
{ {
using exprtk::ifunction<T>::operator(); using exprtk::ifunction<T>::operator();
freefunc2(ff2_functor ff) : exprtk::ifunction<T>(2), f(ff) {} freefunc02(ff02_functor ff) : exprtk::ifunction<T>(2), f(ff) {}
inline T operator()(const T& v0, const T& v1) inline T operator()(const T& v0, const T& v1)
{ return f(v0,v1); } { return f(v0,v1); }
ff2_functor f; ff02_functor f;
}; };
struct freefunc3 : public exprtk::ifunction<T> struct freefunc03 : public exprtk::ifunction<T>
{ {
using exprtk::ifunction<T>::operator(); using exprtk::ifunction<T>::operator();
freefunc3(ff3_functor ff) : exprtk::ifunction<T>(3), f(ff) {} freefunc03(ff03_functor ff) : exprtk::ifunction<T>(3), f(ff) {}
inline T operator()(const T& v0, const T& v1, const T& v2) inline T operator()(const T& v0, const T& v1, const T& v2)
{ return f(v0,v1,v2); } { return f(v0,v1,v2); }
ff3_functor f; ff03_functor f;
}; };
struct freefunc4 : public exprtk::ifunction<T> struct freefunc04 : public exprtk::ifunction<T>
{ {
using exprtk::ifunction<T>::operator(); using exprtk::ifunction<T>::operator();
freefunc4(ff4_functor ff) : exprtk::ifunction<T>(4), f(ff) {} freefunc04(ff04_functor ff) : exprtk::ifunction<T>(4), f(ff) {}
inline T operator()(const T& v0, const T& v1, const T& v2, const T& v3) inline T operator()(const T& v0, const T& v1, const T& v2, const T& v3)
{ return f(v0,v1,v2,v3); } { return f(v0,v1,v2,v3); }
ff4_functor f; ff04_functor f;
}; };
struct freefunc5 : public exprtk::ifunction<T> struct freefunc05 : public exprtk::ifunction<T>
{ {
using exprtk::ifunction<T>::operator(); using exprtk::ifunction<T>::operator();
freefunc5(ff5_functor ff) : exprtk::ifunction<T>(5), f(ff) {} freefunc05(ff05_functor ff) : exprtk::ifunction<T>(5), f(ff) {}
inline T operator()(const T& v0, const T& v1, const T& v2, const T& v3, const T& v4) inline T operator()(const T& v0, const T& v1, const T& v2, const T& v3, const T& v4)
{ return f(v0,v1,v2,v3,v4); } { return f(v0,v1,v2,v3,v4); }
ff5_functor f; ff05_functor f;
}; };
struct freefunc6 : public exprtk::ifunction<T> struct freefunc06 : public exprtk::ifunction<T>
{ {
using exprtk::ifunction<T>::operator(); using exprtk::ifunction<T>::operator();
freefunc6(ff6_functor ff) : exprtk::ifunction<T>(6), f(ff) {} freefunc06(ff06_functor ff) : exprtk::ifunction<T>(6), f(ff) {}
inline T operator()(const T& v0, const T& v1, const T& v2, const T& v3, const T& v4, const T& v5) inline T operator()(const T& v0, const T& v1, const T& v2, const T& v3, const T& v4, const T& v5)
{ return f(v0,v1,v2,v3,v4,v5); } { return f(v0,v1,v2,v3,v4,v5); }
ff6_functor f; ff06_functor f;
};
struct freefunc07 : public exprtk::ifunction<T>
{
using exprtk::ifunction<T>::operator();
freefunc07(ff07_functor ff) : exprtk::ifunction<T>(7), f(ff) {}
inline T operator()(const T& v0, const T& v1, const T& v2, const T& v3, const T& v4,
const T& v5, const T& v6)
{ return f(v0,v1,v2,v3,v4,v5,v6); }
ff07_functor f;
};
struct freefunc08 : public exprtk::ifunction<T>
{
using exprtk::ifunction<T>::operator();
freefunc08(ff08_functor ff) : exprtk::ifunction<T>(8), f(ff) {}
inline T operator()(const T& v0, const T& v1, const T& v2, const T& v3, const T& v4,
const T& v5, const T& v6, const T& v7)
{ return f(v0,v1,v2,v3,v4,v5,v6,v7); }
ff08_functor f;
};
struct freefunc09 : public exprtk::ifunction<T>
{
using exprtk::ifunction<T>::operator();
freefunc09(ff09_functor ff) : exprtk::ifunction<T>(9), f(ff) {}
inline T operator()(const T& v0, const T& v1, const T& v2, const T& v3, const T& v4,
const T& v5, const T& v6, const T& v7, const T& v8)
{ return f(v0,v1,v2,v3,v4,v5,v6,v7,v8); }
ff09_functor f;
};
struct freefunc10 : public exprtk::ifunction<T>
{
using exprtk::ifunction<T>::operator();
freefunc10(ff10_functor ff) : exprtk::ifunction<T>(10), f(ff) {}
inline T operator()(const T& v0, const T& v1, const T& v2, const T& v3, const T& v4,
const T& v5, const T& v6, const T& v7, const T& v8, const T& v9)
{ return f(v0,v1,v2,v3,v4,v5,v6,v7,v8,v9); }
ff10_functor f;
};
struct freefunc11 : public exprtk::ifunction<T>
{
using exprtk::ifunction<T>::operator();
freefunc11(ff11_functor ff) : exprtk::ifunction<T>(11), f(ff) {}
inline T operator()(const T& v0, const T& v1, const T& v2, const T& v3, const T& v4,
const T& v5, const T& v6, const T& v7, const T& v8, const T& v9, const T& v10)
{ return f(v0,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10); }
ff11_functor f;
};
struct freefunc12 : public exprtk::ifunction<T>
{
using exprtk::ifunction<T>::operator();
freefunc12(ff12_functor ff) : exprtk::ifunction<T>(12), f(ff) {}
inline T operator()(const T& v00, const T& v01, const T& v02, const T& v03, const T& v04,
const T& v05, const T& v06, const T& v07, const T& v08, const T& v09,
const T& v10, const T& v11)
{ return f(v00,v01,v02,v03,v04,v05,v06,v07,v08,v09,v10,v11); }
ff12_functor f;
};
struct freefunc13 : public exprtk::ifunction<T>
{
using exprtk::ifunction<T>::operator();
freefunc13(ff13_functor ff) : exprtk::ifunction<T>(13), f(ff) {}
inline T operator()(const T& v00, const T& v01, const T& v02, const T& v03, const T& v04,
const T& v05, const T& v06, const T& v07, const T& v08, const T& v09,
const T& v10, const T& v11, const T& v12)
{ return f(v00,v01,v02,v03,v04,v05,v06,v07,v08,v09,v10,v11,v12); }
ff13_functor f;
};
struct freefunc14 : public exprtk::ifunction<T>
{
using exprtk::ifunction<T>::operator();
freefunc14(ff14_functor ff) : exprtk::ifunction<T>(14), f(ff) {}
inline T operator()(const T& v00, const T& v01, const T& v02, const T& v03, const T& v04,
const T& v05, const T& v06, const T& v07, const T& v08, const T& v09,
const T& v10, const T& v11, const T& v12, const T& v13)
{ return f(v00,v01,v02,v03,v04,v05,v06,v07,v08,v09,v10,v11,v12,v13); }
ff14_functor f;
};
struct freefunc15 : public exprtk::ifunction<T>
{
using exprtk::ifunction<T>::operator();
freefunc15(ff15_functor ff) : exprtk::ifunction<T>(15), f(ff) {}
inline T operator()(const T& v00, const T& v01, const T& v02, const T& v03, const T& v04,
const T& v05, const T& v06, const T& v07, const T& v08, const T& v09,
const T& v10, const T& v11, const T& v12, const T& v13, const T& v14)
{ return f(v00,v01,v02,v03,v04,v05,v06,v07,v08,v09,v10,v11,v12,v13,v14); }
ff15_functor f;
}; };
template <typename Type, typename RawType> template <typename Type, typename RawType>
@ -16596,101 +16708,33 @@ namespace exprtk
return false; return false;
} }
inline bool add_function(const std::string& function_name, ff1_functor function) #define exprtk_define_freefunction(NN) \
{ inline bool add_function(const std::string& function_name, ff##NN##_functor function) \
if (!valid()) { \
return false; if (!valid()) \
else if (!valid_symbol(function_name)) return false; \
return false; else if (!valid_symbol(function_name)) \
else if (symbol_exists(function_name)) return false; \
return false; else if (symbol_exists(function_name)) \
return false; \
\
exprtk::ifunction<T>* ifunc = new freefunc##NN(function); \
\
local_data().free_function_list_.push_back(ifunc); \
\
return add_function(function_name,(*local_data().free_function_list_.back())); \
} \
exprtk::ifunction<T>* ifunc = new freefunc1(function); exprtk_define_freefunction(01) exprtk_define_freefunction(02)
exprtk_define_freefunction(03) exprtk_define_freefunction(04)
exprtk_define_freefunction(05) exprtk_define_freefunction(06)
exprtk_define_freefunction(07) exprtk_define_freefunction(08)
exprtk_define_freefunction(09) exprtk_define_freefunction(10)
exprtk_define_freefunction(11) exprtk_define_freefunction(12)
exprtk_define_freefunction(13) exprtk_define_freefunction(14)
exprtk_define_freefunction(15)
local_data().free_function_list_.push_back(ifunc); #undef exprtk_define_freefunction
return add_function(function_name,(*local_data().free_function_list_.back()));
}
inline bool add_function(const std::string& function_name, ff2_functor function)
{
if (!valid())
return false;
else if (!valid_symbol(function_name))
return false;
else if (symbol_exists(function_name))
return false;
exprtk::ifunction<T>* ifunc = new freefunc2(function);
local_data().free_function_list_.push_back(ifunc);
return add_function(function_name,(*local_data().free_function_list_.back()));
}
inline bool add_function(const std::string& function_name, ff3_functor function)
{
if (!valid())
return false;
else if (!valid_symbol(function_name))
return false;
else if (symbol_exists(function_name))
return false;
exprtk::ifunction<T>* ifunc = new freefunc3(function);
local_data().free_function_list_.push_back(ifunc);
return add_function(function_name,(*local_data().free_function_list_.back()));
}
inline bool add_function(const std::string& function_name, ff4_functor function)
{
if (!valid())
return false;
else if (!valid_symbol(function_name))
return false;
else if (symbol_exists(function_name))
return false;
exprtk::ifunction<T>* ifunc = new freefunc4(function);
local_data().free_function_list_.push_back(ifunc);
return add_function(function_name,(*local_data().free_function_list_.back()));
}
inline bool add_function(const std::string& function_name, ff5_functor function)
{
if (!valid())
return false;
else if (!valid_symbol(function_name))
return false;
else if (symbol_exists(function_name))
return false;
exprtk::ifunction<T>* ifunc = new freefunc5(function);
local_data().free_function_list_.push_back(ifunc);
return add_function(function_name,(*local_data().free_function_list_.back()));
}
inline bool add_function(const std::string& function_name, ff6_functor function)
{
if (!valid())
return false;
else if (!valid_symbol(function_name))
return false;
else if (symbol_exists(function_name))
return false;
exprtk::ifunction<T>* ifunc = new freefunc6(function);
local_data().free_function_list_.push_back(ifunc);
return add_function(function_name,(*local_data().free_function_list_.back()));
}
inline bool add_reserved_function(const std::string& function_name, function_t& function) inline bool add_reserved_function(const std::string& function_name, function_t& function)
{ {
@ -17672,6 +17716,15 @@ namespace exprtk
} }
} }
namespace details
{
template <typename Parser>
inline void disable_type_checking(Parser& p)
{
p.state_.type_check_enabled = false;
}
}
template <typename T> template <typename T>
class parser : public lexer::parser_helper class parser : public lexer::parser_helper
{ {
@ -18534,6 +18587,7 @@ namespace exprtk
struct parser_state struct parser_state
{ {
parser_state() parser_state()
: type_check_enabled(true)
{ {
reset(); reset();
} }
@ -18565,6 +18619,7 @@ namespace exprtk
bool parsing_break_stmt; bool parsing_break_stmt;
bool return_stmt_present; bool return_stmt_present;
bool side_effect_present; bool side_effect_present;
bool type_check_enabled;
std::size_t scope_depth; std::size_t scope_depth;
}; };
@ -22775,7 +22830,10 @@ namespace exprtk
std::size_t param_seq_index = 0; std::size_t param_seq_index = 0;
if (!tc.verify(param_type_list, param_seq_index)) if (
state_.type_check_enabled &&
!tc.verify(param_type_list, param_seq_index)
)
{ {
set_error( set_error(
make_error(parser_error::e_syntax, make_error(parser_error::e_syntax,
@ -24845,7 +24903,7 @@ namespace exprtk
(details::e_g2d == operation) || (details::e_notl == operation) || (details::e_g2d == operation) || (details::e_notl == operation) ||
(details::e_sgn == operation) || (details::e_erf == operation) || (details::e_sgn == operation) || (details::e_erf == operation) ||
(details::e_erfc == operation) || (details::e_ncdf == operation) || (details::e_erfc == operation) || (details::e_ncdf == operation) ||
(details::e_frac == operation) || (details::e_trunc == operation); (details::e_frac == operation) || (details::e_trunc == operation) ;
} }
inline bool sf3_optimisable(const std::string& sf3id, trinary_functor_t& tfunc) inline bool sf3_optimisable(const std::string& sf3id, trinary_functor_t& tfunc)
@ -26379,6 +26437,7 @@ namespace exprtk
if ( if (
!arg_list.empty() && !arg_list.empty() &&
!gf->has_side_effects() && !gf->has_side_effects() &&
parser_->state_.type_check_enabled &&
is_constant_foldable(arg_list) is_constant_foldable(arg_list)
) )
{ {
@ -33495,6 +33554,9 @@ namespace exprtk
lexer::helper::bracket_checker bracket_checker_; lexer::helper::bracket_checker bracket_checker_;
lexer::helper::numeric_checker numeric_checker_; lexer::helper::numeric_checker numeric_checker_;
lexer::helper::sequence_validator sequence_validator_; lexer::helper::sequence_validator sequence_validator_;
template <typename ParserType>
friend void details::disable_type_checking(ParserType& p);
}; };
template <typename Allocator, template <typename Allocator,
@ -33532,6 +33594,45 @@ namespace exprtk
return true; return true;
} }
template <typename T,
typename Allocator,
template <typename, typename> class Sequence>
inline bool collect_variables(const std::string& expr_str,
exprtk::symbol_table<T>& extrnl_symbol_table,
Sequence<std::string, Allocator>& symbol_list)
{
typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t;
typedef typename parser_t::dependent_entity_collector::symbol_t symbol_t;
symbol_table_t symbol_table;
expression_t expression;
parser_t parser;
expression.register_symbol_table(symbol_table);
expression.register_symbol_table(extrnl_symbol_table);
parser.enable_unknown_symbol_resolver();
parser.dec().collect_variables() = true;
details::disable_type_checking(parser);
if (!parser.compile(expr_str, expression))
return false;
std::deque<symbol_t> symb_list;
parser.dec().symbols(symb_list);
for (std::size_t i = 0; i < symb_list.size(); ++i)
{
symbol_list.push_back(symb_list[i].first);
}
return true;
}
template <typename Allocator, template <typename Allocator,
template <typename, typename> class Sequence> template <typename, typename> class Sequence>
inline bool collect_functions(const std::string& expr_str, inline bool collect_functions(const std::string& expr_str,
@ -33567,6 +33668,45 @@ namespace exprtk
return true; return true;
} }
template <typename T,
typename Allocator,
template <typename, typename> class Sequence>
inline bool collect_functions(const std::string& expr_str,
exprtk::symbol_table<T>& extrnl_symbol_table,
Sequence<std::string, Allocator>& symbol_list)
{
typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t;
typedef typename parser_t::dependent_entity_collector::symbol_t symbol_t;
symbol_table_t symbol_table;
expression_t expression;
parser_t parser;
expression.register_symbol_table(symbol_table);
expression.register_symbol_table(extrnl_symbol_table);
parser.enable_unknown_symbol_resolver();
parser.dec().collect_functions() = true;
details::disable_type_checking(parser);
if (!parser.compile(expr_str, expression))
return false;
std::deque<symbol_t> symb_list;
parser.dec().symbols(symb_list);
for (std::size_t i = 0; i < symb_list.size(); ++i)
{
symbol_list.push_back(symb_list[i].first);
}
return true;
}
template <typename T> template <typename T>
inline T integrate(const expression<T>& e, inline T integrate(const expression<T>& e,
T& x, T& x,
@ -33622,14 +33762,16 @@ namespace exprtk
T& x, T& x,
const T& h = T(0.00000001)) const T& h = T(0.00000001))
{ {
T x_init = x; const T x_init = x;
x = x_init + T(2) * h; const T _2h = T(2) * h;
x = x_init + _2h;
T y0 = e.value(); T y0 = e.value();
x = x_init + h; x = x_init + h;
T y1 = e.value(); T y1 = e.value();
x = x_init - h; x = x_init - h;
T y2 = e.value(); T y2 = e.value();
x = x_init - T(2) * h; x = x_init - _2h;
T y3 = e.value(); T y3 = e.value();
x = x_init; x = x_init;
@ -33641,15 +33783,17 @@ namespace exprtk
T& x, T& x,
const T& h = T(0.00001)) const T& h = T(0.00001))
{ {
const T x_init = x;
const T _2h = T(2) * h;
T y = e.value(); T y = e.value();
T x_init = x; x = x_init + _2h;
x = x_init + T(2) * h;
T y0 = e.value(); T y0 = e.value();
x = x_init + h; x = x_init + h;
T y1 = e.value(); T y1 = e.value();
x = x_init - h; x = x_init - h;
T y2 = e.value(); T y2 = e.value();
x = x_init - T(2) * h; x = x_init - _2h;
T y3 = e.value(); T y3 = e.value();
x = x_init; x = x_init;
@ -33661,14 +33805,16 @@ namespace exprtk
T& x, T& x,
const T& h = T(0.0001)) const T& h = T(0.0001))
{ {
T x_init = x; const T x_init = x;
x = x_init + T(2) * h; const T _2h = T(2) * h;
x = x_init + _2h;
T y0 = e.value(); T y0 = e.value();
x = x_init + h; x = x_init + h;
T y1 = e.value(); T y1 = e.value();
x = x_init - h; x = x_init - h;
T y2 = e.value(); T y2 = e.value();
x = x_init - T(2) * h; x = x_init - _2h;
T y3 = e.value(); T y3 = e.value();
x = x_init; x = x_init;
@ -33763,8 +33909,8 @@ namespace exprtk
there will be an overhead with regards to their setup and there will be an overhead with regards to their setup and
teardown and hence should not be used in time critical teardown and hence should not be used in time critical
sections of code. sections of code.
Furthermore they only assume a small sub set of variables - no Furthermore they only assume a small sub set of variables,
string variables or user defined functions. no string variables or user defined functions.
*/ */
template <typename T> template <typename T>
inline bool compute(const std::string& expression_string, T& result) inline bool compute(const std::string& expression_string, T& result)
@ -35482,6 +35628,9 @@ namespace exprtk
file_mode get_file_mode(const std::string& access) file_mode get_file_mode(const std::string& access)
{ {
if (access.empty() || access.size() > 2)
return e_error;
std::size_t w_cnt = 0; std::size_t w_cnt = 0;
std::size_t r_cnt = 0; std::size_t r_cnt = 0;
@ -35491,6 +35640,7 @@ namespace exprtk
{ {
case 'r' : r_cnt++; break; case 'r' : r_cnt++; break;
case 'w' : w_cnt++; break; case 'w' : w_cnt++; break;
default : return e_error;
} }
} }
@ -36940,9 +37090,9 @@ namespace exprtk
namespace information namespace information
{ {
static const char* library = "Mathematical Expression Toolkit"; static const char* library = "Mathematical Expression Toolkit";
static const char* version = "2.7182818284590452353602874713526624977572" static const char* version = "2.718281828459045235360287471352662497757247"
"470936999595749669676277240766303535475945"; "09369995957496696762772407663035354759457138";
static const char* date = "20161212"; static const char* date = "20170107";
static inline std::string data() static inline std::string data()
{ {

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* ExprTk vs Native Benchmarks * * ExprTk vs Native Benchmarks *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 1 * * Simple Example 1 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 2 * * Simple Example 2 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 3 * * Simple Example 3 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 4 * * Simple Example 4 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 5 * * Simple Example 5 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 6 * * Simple Example 6 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 7 * * Simple Example 7 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 8 * * Simple Example 8 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 9 * * Simple Example 9 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 10 * * Simple Example 10 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 11 * * Simple Example 11 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 12 * * Simple Example 12 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 13 * * Simple Example 13 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 14 * * Simple Example 14 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 15 * * Simple Example 15 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 16 * * Simple Example 16 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 17 * * Simple Example 17 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 18 * * Simple Example 18 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 19 * * Simple Example 19 *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Examples and Unit-Tests * * Examples and Unit-Tests *
* Author: Arash Partow (1999-2016) * * Author: Arash Partow (1999-2017) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -12,7 +12,7 @@ C++ Mathematical Expression Toolkit Library Documentation
Section 09 - Fundamental Types Section 09 - Fundamental Types
Section 10 - Components Section 10 - Components
Section 11 - Compilation Options Section 11 - Compilation Options
Section 12 - Special Functions Section 12 - Expression Structures
Section 13 - Variable, Vector & String Definition Section 13 - Variable, Vector & String Definition
Section 14 - Vector Processing Section 14 - Vector Processing
Section 15 - User Defined Functions Section 15 - User Defined Functions
@ -32,7 +32,7 @@ C++ Mathematical Expression Toolkit Library Documentation
Section 29 - Language Structure Section 29 - Language Structure
[00 - INTRODUCTION] [SECTION 00 - INTRODUCTION]
The C++ Mathematical Expression Toolkit Library (ExprTk) is a simple The C++ Mathematical Expression Toolkit Library (ExprTk) is a simple
to use, easy to integrate and extremely efficient run-time to use, easy to integrate and extremely efficient run-time
mathematical expression parsing and evaluation engine. The parsing mathematical expression parsing and evaluation engine. The parsing
@ -41,7 +41,7 @@ semantics and is easily extensible.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[01 - CAPABILITIES] [SECTION 01 - CAPABILITIES]
The ExprTk expression evaluator supports the following fundamental The ExprTk expression evaluator supports the following fundamental
arithmetic operations, functions and processes: arithmetic operations, functions and processes:
@ -54,7 +54,7 @@ arithmetic operations, functions and processes:
(03) Equalities & (03) Equalities &
Inequalities: =, ==, <>, !=, <, <=, >, >= Inequalities: =, ==, <>, !=, <, <=, >, >=
(04) Boolean logic: and, mand, mor, nand, nor, not, or, shl, shr, (04) Logic operators: and, mand, mor, nand, nor, not, or, shl, shr,
xnor, xor, true, false xnor, xor, true, false
(05) Functions: abs, avg, ceil, clamp, equal, erf, erfc, exp, (05) Functions: abs, avg, ceil, clamp, equal, erf, erfc, exp,
@ -83,7 +83,7 @@ arithmetic operations, functions and processes:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[02 - EXAMPLE EXPRESSIONS] [SECTION 02 - EXAMPLE EXPRESSIONS]
The following is a short listing of the types of mathematical The following is a short listing of the types of mathematical
expressions that can be parsed and evaluated using the ExprTk library. expressions that can be parsed and evaluated using the ExprTk library.
@ -110,7 +110,7 @@ expressions that can be parsed and evaluated using the ExprTk library.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[03 - COPYRIGHT NOTICE] [SECTION 03 - COPYRIGHT NOTICE]
Free use of the C++ Mathematical Expression Toolkit Library is Free use of the C++ Mathematical Expression Toolkit Library is
permitted under the guidelines and in accordance with the most current permitted under the guidelines and in accordance with the most current
version of the Common Public License. version of the Common Public License.
@ -119,7 +119,7 @@ http://www.opensource.org/licenses/cpl1.0.php
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[04 - DOWNLOADS & UPDATES] [SECTION 04 - DOWNLOADS & UPDATES]
The most recent version of the C++ Mathematical Expression Toolkit The most recent version of the C++ Mathematical Expression Toolkit
Library including all updates and tests can be found at the following Library including all updates and tests can be found at the following
locations: locations:
@ -130,13 +130,13 @@ locations:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[05 - INSTALLATION] [SECTION 05 - INSTALLATION]
The header file exprtk.hpp should be placed in a project or system The header file exprtk.hpp should be placed in a project or system
include path (e.g: /usr/include/). include path (e.g: /usr/include/).
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[06 - COMPILATION] [SECTION 06 - COMPILATION]
(a) For a complete build: make clean all (a) For a complete build: make clean all
(b) For a PGO build: make clean pgo (b) For a PGO build: make clean pgo
(c) To strip executables: make strip_bin (c) To strip executables: make strip_bin
@ -144,7 +144,7 @@ include path (e.g: /usr/include/).
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[07 - COMPILER COMPATIBILITY] [SECTION 07 - COMPILER COMPATIBILITY]
ExprTk has been built error and warning free using the following set ExprTk has been built error and warning free using the following set
of C++ compilers: of C++ compilers:
@ -158,7 +158,7 @@ of C++ compilers:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[08 - BUILT-IN OPERATIONS & FUNCTIONS] [SECTION 08 - BUILT-IN OPERATIONS & FUNCTIONS]
(0) Arithmetic & Assignment Operators (0) Arithmetic & Assignment Operators
+----------+---------------------------------------------------------+ +----------+---------------------------------------------------------+
@ -640,7 +640,7 @@ appropriate may represent any of one the following:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[09 - FUNDAMENTAL TYPES] [SECTION 09 - FUNDAMENTAL TYPES]
ExprTk supports three fundamental types which can be used freely in ExprTk supports three fundamental types which can be used freely in
expressions. The types are as follows: expressions. The types are as follows:
@ -672,7 +672,7 @@ however can not interact with scalar or vector types.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[10 - COMPONENTS] [SECTION 10 - COMPONENTS]
There are three primary components, that are specialized upon a given There are three primary components, that are specialized upon a given
numeric type, which make up the core of ExprTk. The components are as numeric type, which make up the core of ExprTk. The components are as
follows: follows:
@ -965,14 +965,14 @@ std::vector.
std::cout << "Error in " << expression_str[i] << "\n"; std::cout << "Error in " << expression_str[i] << "\n";
} }
for (auto e : expression_list) for (auto& e : expression_list)
{ {
e.value(); e.value();
} }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[11 - COMPILATION OPTIONS] [SECTION 11 - COMPILATION OPTIONS]
The exprtk::parser when being instantiated takes as input a set of The exprtk::parser when being instantiated takes as input a set of
options to be used during the compilation process of expressions. options to be used during the compilation process of expressions.
An example instantiation of exprtk::parser where only the joiner, An example instantiation of exprtk::parser where only the joiner,
@ -1107,7 +1107,296 @@ larger numerical bound.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[12 - SPECIAL FUNCTIONS] [SECTION 12 - EXPRESSION STRUCTURES]
Exprtk supports mathematical expressions in numerous forms based on a
simple imperative programming model. This section will cover the
following topics related to general structure and programming of
expression using ExprTk:
(1) Multi-Statement Expressions
(2) Statements And Side-Effects
(3) Conditional Statements
(4) Special Functions
(1) Multi-Statement Expressions
Expressions in ExprTk can be comprised of one more statements, which
may sometimes be called sub-expressions. The following are two
examples of expressions stored in std::string variables, the first a
single statement and the second a multi-statement expression:
std::string single_statement = " z := x + y ";
std::string multi_statement = " var temp := x; "
" x := y + z; "
" y := temp; ";
In a multi-statement expression, the final statement will determine
the overall result of the expression. In the following multi-statement
expression, the result of the expression when evaluated will be '2.3',
which will also be the value stored in the 'y' variable.
z := x + y;
y := 2.3;
As demonstrated in the expression above, statements within an
expression are separated using the semi-colon ';' operator. In the
event two statements are not separated by a semi-colon, and the
implied multiplication feature is active (enabled by default), the
compiler will assume a multiplication operation between the two
statements.
In the following example we have a multi-statement expression composed
of two variable definitions and initialisations for variables x and y
and two seemingly separate mathematical operations.
var x:= 2;
var y:= 3;
x + 1
y * 2
However the result of the expression will not be 6 as may have been
assumed based on the calculation of 'y * 2', but rather the result
will be 8. This is because the compiler will have conjoined the two
mathematical statements into one via a multiplication operation. The
expression when compiled will actually evaluate as the following:
var x:= 2;
var y:= 3;
x + 1 * y * 2; // 2 + 1 * 3 * 2 == 8
In ExprTk any valid statement will itself return a value. This value
can further be used in conjunction with other statements. This
includes language structures such as if-statements, loops (for, while)
and the switch statement. Typically the last statement executed in the
given construct (conditional, loop etc), will be the value that is
returned.
In the following example, the return value of the expression will be
11, which is the sum of the variable 'x' and the final value computed
within the loop body on its last iteration:
var x := 1;
x + for (var i := i; i < 10; i += 1)
{
i / 2;
i + 1;
}
(2) Statements And Side-Effects
Statements themselves may have side effects, which in-turn effect the
proceeding statements in multi-statement expressions.
A statement is said to have a side-effect if it causes the state of
the expression to change in some way - this includes but is not
limited to the modification of the state of external variables used
within the expression. Currently the following actions being present
in a statement will cause it to have a side-effect:
(a) Assignment operation (explicit or potentially)
(b) Invoking a user-defined function that has side-effects
The following are examples of expressions where the side-effect status
of the statements (or sub-exressions) within the expressions have been
noted:
+-+----------------------+------------------------------+
|#| Expression | Side Effect Status |
+-+----------------------+------------------------------+
|0| x + y | False |
+-+----------------------+------------------------------+
|1| z := x + y | True - Due to assignment |
+-+----------------------+------------------------------+
|2| abs(x - y) | False |
+-+----------------------+------------------------------+
|3| abs(x - y); | False |
| | z := (x += y); | True - Due to assignments |
+-+----------------------+------------------------------+
|4| abs(x - y); | False |
| | z := (x += y); | True - Due to assignments |
+-+----------------------+------------------------------+
|5| var t := abs(x - y); | True - Due to initialisation |
| | t + x; | False |
| | z := (x += y); | True - Due to assignments |
+-+----------------------+------------------------------+
|6| foo(x - y) | True - user defined function |
+-+----------------------+------------------------------+
Note: In example 6 from the above set, it is assumed the user defined
function foo has been registered as having a side_effect. By default
all user defined functions are assumed to have side-effects, unless
they are configured in their constructors to not have side-effects
using the 'disable_has_side_effects' free function. For more
information review Section 15 - User Defined Functions sub-section 7
Function Side-Effects.
At this point we can see that there will be expressions composed of
certain kinds of statements that when executed will not effect the
nature of the expression's result. These statements are typically
called 'dead code'. These statements though not effecting the final
result will still be executed and as such they will consume processing
time that could otherwise be saved. As such ExprTk attempts to detect
and remove such statements from expressions.
The 'Dead Code Elimination' (DCE) optimisation process, which is
enabled by default, will remove any statements that are determined to
not have a side effect in a multi-statement expression, excluding the
final or last statement.
By default the final statement in an expression will always be present
regardless of its side-effect status, as it is the statement whose
value will be used as the result of the expression.
In order to further explain the actions taken during the DCE process,
lets review the following expression:
var x := 2; // Statement 1
var y := x + 2; // Statement 2
x + y // Statement 3
y := x + 3y; // Statement 4
x - y; // Statement 5
The above expression has five statements. Three of them (1, 2 and 4)
actively have side-effects. The first two are variable declaration and
initialisations, where as the third is due to an assignment operation.
There are two statements (3 and 5), that do not explicitly have
side-effects, however the latter, statement 5, is the final statement
in the expression and hence will be assumed to have a side-effect.
During compilation when the DCE optimisation is applied to the above
expression, statement 2 will be removed from the expression, as it has
no bearing on the final result of expression, the rest of the
statements will all remain. Hence optimised version of the expression
is as follows:
var x := 2; // Statement 1
var y := x + 2; // Statement 2
y := x + 3y; // Statement 3
x - y; // Statement 4
(3) Conditional Statements (If-Then-Else)
ExprTk support two forms of conditional branching or otherwise known
as if-statements. The first form, is a simple function based
conditional statement, that takes exactly three input expressions:
condition, consequent and alternative. The following is an example
expression that utilizes the function based if-statement.
x := if (y < z, y + 1, 2* z)
In the example above, if the condition 'y < z' is true, then the
consequent 'y + 1' will be evaluated, it's value will be returned and
subsequently assigned to the variable 'x'. Otherwise the alternative
'2 * z' will be evaluated and its value will be returned. This is
essentially the simplest form of an if-then-else statement, As simple
variation of the expression where the value of the if-statement is
used within another statement is as follows:
x := 3 * if (y < z, y + 1, 2* z) / 2
The second form of if-statement resembles the standard syntax found in
most imperative languages. There are two variations of the statement:
(a) If-Statement
(b) If-Then-Else Statement
(a) If-Statement
This version of the conditional statement returns the value of the
consequent expression when the condition expression is true, else it
will require a quiet NaN value as its result.
Example 1:
x := if (y < z) y + 3;
Example 2:
x := if (y < z)
{
y + 3
}
The two example expressions above are equivalent. If the condition
'y < z' is true, the 'x' variable will be assigned the value of the
consequent 'y + 3', otherwise it will be assigned the value of quiet
NaN. As previously discussed, if-statements are value returning
constructs, and if not properly terminated using a semi-colon, will
end-up combining with the next statement via a multiplication
operation. The following example will NOT result in the expected value
of 'w + x' being returned:
x := if (y < z) y + 3 // missing semi-colon ';'
w + x
When the above supposed multi-statement expression is compiled, the
expression will have a multiplication inserted between the two
'intended' statements resulting in the unanticipated expression:
x := (if (y < z) y + 3) * w + x
The solution to the above situation is to simply terminate the
conditional statement with a semi-colon as follows:
x := if (y < z) y + 3;
w + x
(b) If-Then-Else Statement
The second variation of the if-statement is to allow for the use of
Else and If-Else cascading statements. Examples of such statements are
as follows:
Example 1: Example 2:
if (x < y) if (x < y)
z := x + 3; {
else y := z + x;
y := x - z; z := x + 3;
}
else
y := x - z;
Example 3: Example 4:
if (x > y + 1) if (2 * x < max(y,3))
y := abs(x - z); {
else y := z + x;
{ z := x + 3;
y := z + x; }
z := x + 3; else if (2y - z)
}; y := x - z;
Example 5: Example 6:
if (x < y) if (x < y or (x + z) > y)
z := x + 3; {
else if (2y != z) z := x + 3;
{ y := x - z;
z := x + 3; }
y := x - z; else if (abs(2y - z) >= 3)
} y := x - z;
else else
x * x; {
z := abs(x * x);
x * y * z;
};
In the case where there is no final else statement and the flow
through the conditional arrives at this final point, the same rules
apply to this form of if-statement as to the previous. That is a quiet
NaN will be returned as the result of the if-statement. Furthermore
the same requirements of terminating the statement with a semi-colon
apply.
(4) Special Functions
The purpose of special functions in ExprTk is to provide compiler The purpose of special functions in ExprTk is to provide compiler
generated equivalents of common mathematical expressions which can be generated equivalents of common mathematical expressions which can be
invoked by using the 'special function' syntax (eg: $f12(x,y,z) or invoked by using the 'special function' syntax (eg: $f12(x,y,z) or
@ -1178,7 +1467,7 @@ correctly optimize such expressions for a given architecture.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[13 - VARIABLE, VECTOR & STRING DEFINITION] [SECTION 13 - VARIABLE, VECTOR & STRING DEFINITION]
ExprTk supports the definition of expression local variables, vectors ExprTk supports the definition of expression local variables, vectors
and strings. The definitions must be unique as shadowing is not and strings. The definitions must be unique as shadowing is not
allowed and object life-times are based on scope. Definitions use the allowed and object life-times are based on scope. Definitions use the
@ -1311,7 +1600,7 @@ based on the following priorities:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[14 - VECTOR PROCESSING] [SECTION 14 - VECTOR PROCESSING]
ExprTk provides support for various forms of vector oriented ExprTk provides support for various forms of vector oriented
arithmetic, inequalities and processing. The various supported pairs arithmetic, inequalities and processing. The various supported pairs
are as follows: are as follows:
@ -1458,7 +1747,7 @@ evaluated as normal.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[15 - USER DEFINED FUNCTIONS] [SECTION 15 - USER DEFINED FUNCTIONS]
ExprTk provides a means whereby custom functions can be defined and ExprTk provides a means whereby custom functions can be defined and
utilized within expressions. The concept requires the user to utilized within expressions. The concept requires the user to
provide a reference to the function coupled with an associated name provide a reference to the function coupled with an associated name
@ -2003,7 +2292,7 @@ properly take effect otherwise a compilation error will occur.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[16 - EXPRESSION DEPENDENTS] [SECTION 16 - EXPRESSION DEPENDENTS]
Any expression that is not a literal (aka constant) will have Any expression that is not a literal (aka constant) will have
dependencies. The types of 'dependencies' an expression can have are dependencies. The types of 'dependencies' an expression can have are
as follows: as follows:
@ -2149,7 +2438,7 @@ will not contain symbols denoting functions.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[17 - HIERARCHIES OF SYMBOL TABLES] [SECTION 17 - HIERARCHIES OF SYMBOL TABLES]
Most situations will only require a single symbol_table instance to be Most situations will only require a single symbol_table instance to be
associated with a given expression instance. associated with a given expression instance.
@ -2194,7 +2483,7 @@ Examples of such functions are:
(c) Global variable symbol table (c) Global variable symbol table
This symbol table will contain variables that will be accessible to This symbol table will contain variables that will be accessible to
all associated expressions and will not be specific to exclusive to all associated expressions and will not be specific or exclusive to
any one expression. This variant differs from (a) in that the values any one expression. This variant differs from (a) in that the values
of the variables can change (or be updated) between evaluations of of the variables can change (or be updated) between evaluations of
expressions - but through properly scheduled evaluations are expressions - but through properly scheduled evaluations are
@ -2216,9 +2505,9 @@ variables that are specific and exclusive to a particular expression.
That is to say references to variables in this symbol_table will not That is to say references to variables in this symbol_table will not
be part of another expression. Though it may be possible to have be part of another expression. Though it may be possible to have
expressions that contain the variables with the same name, in that expressions that contain the variables with the same name, in that
case those variables will be distinct different. Which would mean if a case those variables will be distinctly different. Which would mean if
particular expression were to be compiled twice, that each expression a particular expression were to be compiled twice, each expression
would have it's own unique symbol_table which in turn would have it's would have its own unique symbol_table which in turn would have its
own instances of those variables. Examples of such variables could be: own instances of those variables. Examples of such variables could be:
(1) x or y (1) x or y
@ -2325,7 +2614,7 @@ then compiled and later on evaluated:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[18 - UNKNOWN UNKNOWNS] [SECTION 18 - UNKNOWN UNKNOWNS]
In this section we will discuss the process of handling expressions In this section we will discuss the process of handling expressions
with a mix of known and unknown variables. Initially a discussion into with a mix of known and unknown variables. Initially a discussion into
the types of expressions that exist will be provided, then a series of the types of expressions that exist will be provided, then a series of
@ -2552,7 +2841,7 @@ error being raised.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[19 - ENABLING & DISABLING FEATURES] [SECTION 19 - ENABLING & DISABLING FEATURES]
The parser can be configured via its settings instance to either allow The parser can be configured via its settings instance to either allow
or disallow certain features that are available within the ExprTk or disallow certain features that are available within the ExprTk
grammar. The features fall into one of the following six categories: grammar. The features fall into one of the following six categories:
@ -2699,8 +2988,9 @@ disabled 'all' at once, as is demonstrated below:
.compile("1 or not(0 and 1)",expression); // compilation success .compile("1 or not(0 and 1)",expression); // compilation success
One can also enable or disable specific logical operators. The following One can also enable or disable specific logical operators. The
example demonstrates the disabling of the 'and' logical operator: following example demonstrates the disabling of the 'and' logical
operator:
parser_t parser; parser_t parser;
expression_t expression; expression_t expression;
@ -2741,8 +3031,9 @@ disabled 'all' at once, as is demonstrated below:
.compile("1 + 2 / 3",expression); // compilation success .compile("1 + 2 / 3",expression); // compilation success
One can also enable or disable specific arithmetic operators. The following One can also enable or disable specific arithmetic operators. The
example demonstrates the disabling of the addition '+' arithmetic operator: following example demonstrates the disabling of the addition '+'
arithmetic operator:
parser_t parser; parser_t parser;
expression_t expression; expression_t expression;
@ -2783,8 +3074,9 @@ disabled 'all' at once, as is demonstrated below:
.compile("1 < 3",expression); // compilation success .compile("1 < 3",expression); // compilation success
One can also enable or disable specific inequality operators. The following One can also enable or disable specific inequality operators. The
example demonstrates the disabling of the less-than '<' inequality operator: following example demonstrates the disabling of the less-than '<'
inequality operator:
parser_t parser; parser_t parser;
expression_t expression; expression_t expression;
@ -2832,8 +3124,9 @@ disabled 'all' at once, as is demonstrated below:
.compile("x := 3",expression); // compilation success .compile("x := 3",expression); // compilation success
One can also enable or disable specific assignment operators. The following One can also enable or disable specific assignment operators. The
example demonstrates the disabling of the '+=' addition assignment operator: following example demonstrates the disabling of the '+=' addition
assignment operator:
parser_t parser; parser_t parser;
expression_t expression; expression_t expression;
@ -2908,7 +3201,7 @@ ExprTk reserved words, the add_function call will fail.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[20 - EXPRESSION RETURN VALUES] [SECTION 20 - EXPRESSION RETURN VALUES]
ExprTk expressions can return immediately from any point by utilizing ExprTk expressions can return immediately from any point by utilizing
the return call. Furthermore the return call can be used to transfer the return call. Furthermore the return call can be used to transfer
out multiple return values from within the expression. out multiple return values from within the expression.
@ -2983,9 +3276,55 @@ expression will return normally.
Note: Processing of the return results is similar to that of the Note: Processing of the return results is similar to that of the
generic function call parameters. generic function call parameters.
It is however recommended that if there is to be only a single flow of
execution through the expression, that the simpler approach of
registering external variables of appropriate type be used.
This method simply requires the variables that are to hold the various
results that are to be computed within the expression to be registered
with an associated symbol_table instance. Then within the expression
itself to have the result variables be assigned the appropriate
values.
typedef exprtk::symbol_table<double> symbol_table_t;
typedef exprtk::expression<double> expression_t;
typedef exprtk::parser<double> parser_t;
std::string expression_string =
" var x := 123.456; "
" var s := 'ijk'; "
" result0 := x + 78.90; "
" result1 := s + '123' ";
double result0;
std::string result1;
symbol_table_t symbol_table;
symbol_table.add_variable ("result0",result0);
symbol_table.add_stringvar("result1",result1);
expression_t expression;
expression.register_symbol_table(symbol_table);
parser_t parser;
parser.compile(expression_string,expression);
expression.value();
printf("Result0: %15.5f\n",result0 );
printf("Result1: %s\n" ,result1.c_str());
In the example above, the expression will compute two results. As such
two result variables are defined to hold the values named result0 and
result1 respectively. The first is of scalar type (double), the second
is of string type. Once the expression has been evaluated, the two
variables will have been updated with the new result values, and can
then be further utilized from within the calling program.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[21 - COMPILATION ERRORS] [SECTION 21 - COMPILATION ERRORS]
When attempting to compile a malformed or otherwise erroneous ExprTk When attempting to compile a malformed or otherwise erroneous ExprTk
expression, the compilation process will result in an error, as is expression, the compilation process will result in an error, as is
indicated by the 'compile' method returning a false value. A indicated by the 'compile' method returning a false value. A
@ -3105,7 +3444,7 @@ via the 'unknown symbol resolver' mechanism.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[22 - RUNTIME LIBRARY PACKAGES] [SECTION 22 - RUNTIME LIBRARY PACKAGES]
ExprTk contains a set of simple extensions, that provide ExprTk contains a set of simple extensions, that provide
functionalities beyond basic numerical calculations. Currently the functionalities beyond basic numerical calculations. Currently the
available packages are: available packages are:
@ -3180,7 +3519,7 @@ file I/O package is made available for the given expression:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[23 - HELPERS & UTILS] [SECTION 23 - HELPERS & UTILS]
The ExprTk library provides a series of usage simplifications via The ExprTk library provides a series of usage simplifications via
helper routines that combine various processes into a single 'function helper routines that combine various processes into a single 'function
call' making certain actions easier to carry out though not call' making certain actions easier to carry out though not
@ -3200,36 +3539,93 @@ are as follows:
This function will collect all the variable symbols in a given string This function will collect all the variable symbols in a given string
representation of an expression and return them in an STL compatible representation of an expression and return them in an STL compatible
sequence data structure (eg: std::vector, dequeue etc) specialised sequence data structure (eg: std::vector, dequeue etc) specialised
upon a std::string type. An example use of the routine is as follows: upon a std::string type. If an error occurs during the parsing of the
expression then the return value of the function will be false,
otherwise it will be true. An example use of the given routine is as
follows:
std::string expression = "x + abs(y / z)"; std::string expression = "x + abs(y / z)";
std::vector<std::string> variable_list; std::vector<std::string> variable_list;
exprtk::collect_variables(expression,variable_list); if (exprtk::collect_variables(expression, variable_list))
{
for (auto var : variable_list) for (auto var : variable_list)
{ {
... ...
} }
}
else
printf("An error occured.");
(b) collect_functions (b) collect_functions
This function will collect all the function symbols in a given string This function will collect all the function symbols in a given string
representation of an expression and return them in an STL compatible representation of an expression and return them in an STL compatible
sequence data structure (eg: std::vector, dequeue etc) specialised sequence data structure (eg: std::vector, dequeue etc) specialised
upon a std::string type. An example use of the routine is as follows: upon a std::string type. If an error occurs during the parsing of the
expression then the return value of the function will be false,
otherwise it will be true. An example use of the given routine is as
follows:
std::string expression = "x + abs(y / cos(1 + z))"; std::string expression = "x + abs(y / cos(1 + z))";
std::deque<std::string> variable_list; std::deque<std::string> function_list;
exprtk::collect_functions(expression,function_list);
if (exprtk::collect_functions(expression, function_list))
{
for (auto func : function_list) for (auto func : function_list)
{ {
... ...
} }
}
else
printf("An error occured.");
Note: When either the 'collect_variables' or 'collect_functions' free
functions return true - that does not necessarily indicate the
expression itself is valid. It is still possible that when compiled
the expression may have certain 'type' related errors - though it is
highly likely that no semantic errors will occur if either return
true.
Note: The default interface provided for both the collect_variables
and collect_functions free_functions, assumes that expressions will
only be utilising the ExprTk reserved funnctions (eg: abs, cos, min
etc). When user defined functions are to be used in an expression, a
symbol_table instance containing said functions can be passed to
either routine, and will be incorparated during the compilation and
Dependent Entity Collection processes. In the following example, a
user defined free function named 'foo' is registered with a
symbol_table. Finally the symbol_table instance and associated
expression string are passed to the exprtk::collect_functions routine.
template <typename T>
T foo(T v)
{
return std::abs(v + T(2)) / T(3);
}
......
exprtk::symbol_table<T> sym_tab;
symbol_table.add_function("foo",foo);
std::string expression = "x + foo(y / cos(1 + z))";
std::deque<std::string> function_list;
if (exprtk::collect_functions(expression, sym_tab, function_list))
{
for (auto func : function_list)
{
...
}
}
else
printf("An error occured.");
(c) compute (c) compute
@ -3329,8 +3725,8 @@ of a single variable compiled expression at a given point for a given
epsilon, using a variant of Newton's difference quotient called the epsilon, using a variant of Newton's difference quotient called the
five-point stencil method. The derivative function has two overloads, five-point stencil method. The derivative function has two overloads,
where the variable of differentiation can either be passed as a where the variable of differentiation can either be passed as a
reference or as a name in string form. A example usage of the function reference or as a name in string form. Example usage of the derivative
is as follows: function is as follows:
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
@ -3352,12 +3748,12 @@ is as follows:
.... ....
// Differentiate expression where value of x = 12.3 using a reference // Differentiate expression where value of x = 12.3 using a reference
// to x variable // to the x variable
x = T(12.3); x = T(12.3);
T derivative1 = exprtk::derivative(expression,x); T derivative1 = exprtk::derivative(expression,x);
// Differentiate expression where value x = 45.6 using name // Differentiate expression where value x = 45.6 using name
// of x variable // of the x variable
x = T(45.6); x = T(45.6);
T derivative2 = exprtk::derivative(expression, "x"); T derivative2 = exprtk::derivative(expression, "x");
@ -3368,7 +3764,8 @@ derivative of a single variable compiled expression at a given point
for a given epsilon, using a variant of Newton's difference quotient for a given epsilon, using a variant of Newton's difference quotient
method. The second_derivative function has two overloads, where the method. The second_derivative function has two overloads, where the
variable of differentiation can either be passed as a reference or as variable of differentiation can either be passed as a reference or as
a name in string form. Example usage of the function is as follows: a name in string form. Example usage of the second_derivative function
is as follows:
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
@ -3406,7 +3803,8 @@ derivative of a single variable compiled expression at a given point
for a given epsilon, using a variant of Newton's difference quotient for a given epsilon, using a variant of Newton's difference quotient
method. The third_derivative function has two overloads, where the method. The third_derivative function has two overloads, where the
variable of differentiation can either be passed as a reference or as variable of differentiation can either be passed as a reference or as
a name in string form. Example usage of the function is as follows: a name in string form. Example usage of the third_derivative function
is as follows:
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
@ -3428,18 +3826,18 @@ a name in string form. Example usage of the function is as follows:
.... ....
// Third derivative of expression where value of x = 12.3 using a // Third derivative of expression where value of x = 12.3 using a
// reference to x variable // reference to the x variable
x = T(12.3); x = T(12.3);
T derivative1 = exprtk::third_derivative(expression,x); T derivative1 = exprtk::third_derivative(expression,x);
// Third derivative of expression where value of x = 45.6 using // Third derivative of expression where value of x = 45.6 using
// name of x variable // name of the x variable
x = T(45.6); x = T(45.6);
T derivative2 = exprtk::third_derivative(expression, "x"); T derivative2 = exprtk::third_derivative(expression, "x");
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[24 - BENCHMARKING] [SECTION 24 - BENCHMARKING]
As part of the ExprTk package there is an expression benchmark utility As part of the ExprTk package there is an expression benchmark utility
named 'exprtk_benchmark'. The utility attempts to determine expression named 'exprtk_benchmark'. The utility attempts to determine expression
evaluation speed (or rate of evaluations - evals per second), by evaluation speed (or rate of evaluations - evals per second), by
@ -3447,7 +3845,7 @@ evaluating each expression numerous times and mutating the underlying
variables of the expression between each evaluation. The utility variables of the expression between each evaluation. The utility
assumes any valid ExprTk expression (containing conditionals, loops assumes any valid ExprTk expression (containing conditionals, loops
etc), however it will only make use of a predefined set of scalar etc), however it will only make use of a predefined set of scalar
variables, namely: a, b, c, x, y, z, w. That being said expressions variables, namely: a, b, c, x, y, z and w. That being said expressions
themselves can contain any number of local variables, vectors or themselves can contain any number of local variables, vectors or
strings. There are two modes of operation: strings. There are two modes of operation:
@ -3583,7 +3981,7 @@ by over 50%, in other words increases the evaluation rate by two fold.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[25 - EXPRTK NOTES] [SECTION 25 - EXPRTK NOTES]
The following is a list of facts and suggestions one may want to take The following is a list of facts and suggestions one may want to take
into account when using ExprTk: into account when using ExprTk:
@ -3784,7 +4182,7 @@ into account when using ExprTk:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[26 - SIMPLE EXPRTK EXAMPLE] [SECTION 26 - SIMPLE EXPRTK EXAMPLE]
The following is a simple yet complete example demonstrating typical The following is a simple yet complete example demonstrating typical
usage of the ExprTk Library. The example instantiates a symbol table usage of the ExprTk Library. The example instantiates a symbol table
object, adding to it three variables named x, y and z, and a custom object, adding to it three variables named x, y and z, and a custom
@ -3889,7 +4287,7 @@ int main()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[27 - BUILD OPTIONS] [SECTION 27 - BUILD OPTIONS]
When building ExprTk there are a number of defines that will enable or When building ExprTk there are a number of defines that will enable or
disable certain features and capabilities. The defines can either be disable certain features and capabilities. The defines can either be
part of a compiler command line switch or scoped around the include to part of a compiler command line switch or scoped around the include to
@ -3956,7 +4354,7 @@ error.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[28 - FILES] [SECTION 28 - FILES]
The source distribution of ExprTk is comprised of the following set of The source distribution of ExprTk is comprised of the following set of
files: files:
@ -3987,9 +4385,28 @@ files:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[29 - LANGUAGE STRUCTURE] [SECTION 29 - LANGUAGE STRUCTURE]
The following are the various language structures available within
ExprTk and their structural representations.
(00) If Statement
(01) Else Statement
(02) Ternary Statement
(03) While Loop
(04) Repeat Until Loop
(05) For Loop
(06) Switch Statement
(07) Multi Subexpression Statement
(08) Multi Case-Consequent Statement
(09) Variable Definition Statement
(10) Vector Definition Statement
(11) String Definition Statement
(12) Range Statement
(13) Return Statement
(00) - If Statement
+-------------------------------------------------------------+ +-------------------------------------------------------------+
|00 - If Statement |
| | | |
| [if] ---> [(] ---> [condition] -+-> [,] -+ | | [if] ---> [(] ---> [condition] -+-> [,] -+ |
| | | | | | | |
@ -4007,7 +4424,10 @@ files:
| +--> [consequent] --> [;] -{*}-> [else-statement] | | +--> [consequent] --> [;] -{*}-> [else-statement] |
| | | |
+-------------------------------------------------------------+ +-------------------------------------------------------------+
|01 - Else Statement |
(01) - Else Statement
+-------------------------------------------------------------+
| | | |
| [else] -+-> [alternative] ---> [;] | | [else] -+-> [alternative] ---> [;] |
| | | | | |
@ -4016,7 +4436,10 @@ files:
| +--> [if-statement] | | +--> [if-statement] |
| | | |
+-------------------------------------------------------------+ +-------------------------------------------------------------+
|02 - Ternary Statement |
(02) - Ternary Statement
+-------------------------------------------------------------+
| | | |
| [condition] ---> [?] ---> [consequent] ---> [:] --+ | | [condition] ---> [?] ---> [consequent] ---> [:] --+ |
| | | | | |
@ -4025,7 +4448,10 @@ files:
| +--> [alternative] --> [;] | | +--> [alternative] --> [;] |
| | | |
+-------------------------------------------------------------+ +-------------------------------------------------------------+
|03 - While Loop |
(03) - While Loop
+-------------------------------------------------------------+
| | | |
| [while] ---> [(] ---> [condition] ---> [)] ---+ | | [while] ---> [(] ---> [condition] ---> [)] ---+ |
| | | | | |
@ -4034,7 +4460,10 @@ files:
| +--> [{] ---> [expression*] ---> [}] | | +--> [{] ---> [expression*] ---> [}] |
| | | |
+-------------------------------------------------------------+ +-------------------------------------------------------------+
|04 - Repeat Until Loop |
(04) - Repeat Until Loop
+-------------------------------------------------------------+
| | | |
| [repeat] ---> [expression*] ---+ | | [repeat] ---> [expression*] ---+ |
| | | | | |
@ -4043,7 +4472,10 @@ files:
| +--> [until] ---> [(] ---> [condition] --->[)] | | +--> [until] ---> [(] ---> [condition] --->[)] |
| | | |
+-------------------------------------------------------------+ +-------------------------------------------------------------+
|05 - For Loop |
(05) - For Loop
+-------------------------------------------------------------+
| | | |
| [for] ---> [(] -+-> [initialise expression] --+--+ | | [for] ---> [(] -+-> [initialise expression] --+--+ |
| | | | | | | | | |
@ -4064,7 +4496,10 @@ files:
| +--> [{] ---> [expression*] ---> [}] | | +--> [{] ---> [expression*] ---> [}] |
| | | |
+-------------------------------------------------------------+ +-------------------------------------------------------------+
|06 - Switch Statement |
(06) - Switch Statement
+-------------------------------------------------------------+
| | | |
| [switch] ---> [{] ---+ | | [switch] ---> [{] ---+ |
| | | | | |
@ -4084,7 +4519,10 @@ files:
| +--> [}] | | +--> [}] |
| | | |
+-------------------------------------------------------------+ +-------------------------------------------------------------+
|07 - Multi Subexpression Statement |
(07) - Multi Subexpression Statement
+-------------------------------------------------------------+
| | | |
| +--------------<---------------+ | | +--------------<---------------+ |
| | | | | | | |
@ -4095,7 +4533,10 @@ files:
| +--> [}\)] | | +--> [}\)] |
| | | |
+-------------------------------------------------------------+ +-------------------------------------------------------------+
|08 - Multi Case-Consequent Statement |
(08) - Multi Case-Consequent Statement
+-------------------------------------------------------------+
| | | |
| [[*]] ---> [{] ---+ | | [[*]] ---> [{] ---+ |
| | | | | |
@ -4110,7 +4551,10 @@ files:
| +--> [}] | | +--> [}] |
| | | |
+-------------------------------------------------------------+ +-------------------------------------------------------------+
|09 - Variable Definition Statement |
(09) - Variable Definition Statement
+-------------------------------------------------------------+
| | | |
| [var] ---> [symbol] -+-> [:=] -+-> [expression] -+-> [;] | | [var] ---> [symbol] -+-> [:=] -+-> [expression] -+-> [;] |
| | | | | | | | | |
@ -4119,7 +4563,10 @@ files:
| +------------->-------------+ | | +------------->-------------+ |
| | | |
+-------------------------------------------------------------+ +-------------------------------------------------------------+
|10 - Vector Definition Statement |
(10) - Vector Definition Statement
+-------------------------------------------------------------+
| | | |
| [var] ---> [symbol] ---> [[] ---> [constant] ---> []] --+ | | [var] ---> [symbol] ---> [[] ---> [constant] ---> []] --+ |
| | | | | |
@ -4132,12 +4579,18 @@ files:
| +--<--- [,] <-----+ | | +--<--- [,] <-----+ |
| | | |
+-------------------------------------------------------------+ +-------------------------------------------------------------+
|11 - String Definition Statement |
(11) - String Definition Statement
+-------------------------------------------------------------+
| | | |
| [var] --> [symbol] --> [:=] --> [str-expression] ---> [;] | | [var] --> [symbol] --> [:=] --> [str-expression] ---> [;] |
| | | |
+-------------------------------------------------------------+ +-------------------------------------------------------------+
|12 - Range Statement |
(12) - Range Statement
+-------------------------------------------------------------+
| | | |
| +-------->--------+ | | +-------->--------+ |
| | | | | | | |
@ -4146,7 +4599,10 @@ files:
| +-------->--------+ | | +-------->--------+ |
| | | |
+-------------------------------------------------------------+ +-------------------------------------------------------------+
|13 - Return Statement |
(13) - Return Statement
+-------------------------------------------------------------+
| | | |
| [return] ---> [[] -+-> [expression] -+-> []] ---> [;] | | [return] ---> [[] -+-> [expression] -+-> []] ---> [;] |
| | | | | | | |