C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html
This commit is contained in:
parent
e105e6278c
commit
3dee9efa49
564
exprtk.hpp
564
exprtk.hpp
File diff suppressed because it is too large
Load Diff
106
exprtk_test.cpp
106
exprtk_test.cpp
|
@ -1270,6 +1270,12 @@ inline bool run_test01()
|
||||||
test_xy<T>("2x + 3y == 2*x + 3*y" ,T(2.0),T(3.0),T(1.0)),
|
test_xy<T>("2x + 3y == 2*x + 3*y" ,T(2.0),T(3.0),T(1.0)),
|
||||||
test_xy<T>("2(x + y) == 2*x + 2*y" ,T(2.0),T(3.0),T(1.0)),
|
test_xy<T>("2(x + y) == 2*x + 2*y" ,T(2.0),T(3.0),T(1.0)),
|
||||||
test_xy<T>(" (x + y)3 == 3*x + 3*y" ,T(2.0),T(3.0),T(1.0)),
|
test_xy<T>(" (x + y)3 == 3*x + 3*y" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" (x)y == (x*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" x(y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" (x) y == (x*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" x (y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" ((x) y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" (x (y)) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
test_xy<T>("equal(x^2.2^1.1,17.15193942371376191362)" ,T(3.3),T(0.0),T(1.0)),
|
test_xy<T>("equal(x^2.2^1.1,17.15193942371376191362)" ,T(3.3),T(0.0),T(1.0)),
|
||||||
test_xy<T>("equal(3.3^x^1.1,17.15193942371376191362)" ,T(2.2),T(0.0),T(1.0)),
|
test_xy<T>("equal(3.3^x^1.1,17.15193942371376191362)" ,T(2.2),T(0.0),T(1.0)),
|
||||||
test_xy<T>("equal(3.3^2.2^x,17.15193942371376191362)" ,T(1.1),T(0.0),T(1.0)),
|
test_xy<T>("equal(3.3^2.2^x,17.15193942371376191362)" ,T(1.1),T(0.0),T(1.0)),
|
||||||
|
@ -1693,6 +1699,7 @@ inline bool run_test01()
|
||||||
test.expr.c_str(),
|
test.expr.c_str(),
|
||||||
(double)test.result,
|
(double)test.result,
|
||||||
(double)result);
|
(double)result);
|
||||||
|
|
||||||
loop_result = false;
|
loop_result = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3392,14 +3399,15 @@ inline bool run_test10()
|
||||||
std::string expression_string = "(E == '1234') and (sin(a) + C) / b";
|
std::string expression_string = "(E == '1234') and (sin(a) + C) / b";
|
||||||
|
|
||||||
typedef exprtk::parser<T> parser_t;
|
typedef exprtk::parser<T> parser_t;
|
||||||
typedef typename parser_t::cache_symbol_t cache_symbol_t;
|
typedef typename parser_t::dependent_entity_collector::symbol_t symbol_t;
|
||||||
|
|
||||||
std::deque<cache_symbol_t> variable_list;
|
std::deque<symbol_t> symbol_list;
|
||||||
|
|
||||||
{
|
{
|
||||||
parser_t parser;
|
parser_t parser;
|
||||||
|
|
||||||
parser.cache_symbols() = true;
|
parser.dec().collect_variables() = true;
|
||||||
|
parser.dec().collect_functions() = true;
|
||||||
|
|
||||||
if (!parser.compile(expression_string,expression))
|
if (!parser.compile(expression_string,expression))
|
||||||
{
|
{
|
||||||
|
@ -3410,21 +3418,21 @@ inline bool run_test10()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
parser.expression_symbols(variable_list);
|
parser.dec().symbols(symbol_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::deque<cache_symbol_t> expected_variable_list;
|
std::deque<symbol_t> expected_symbol_list;
|
||||||
|
|
||||||
expected_variable_list.push_back(cache_symbol_t("a" ,parser_t::e_cs_variable));
|
expected_symbol_list.push_back(symbol_t("a" ,parser_t::e_st_variable));
|
||||||
expected_variable_list.push_back(cache_symbol_t("b" ,parser_t::e_cs_variable));
|
expected_symbol_list.push_back(symbol_t("b" ,parser_t::e_st_variable));
|
||||||
expected_variable_list.push_back(cache_symbol_t("c" ,parser_t::e_cs_variable));
|
expected_symbol_list.push_back(symbol_t("c" ,parser_t::e_st_variable));
|
||||||
expected_variable_list.push_back(cache_symbol_t("e" ,parser_t::e_cs_string ));
|
expected_symbol_list.push_back(symbol_t("e" ,parser_t::e_st_string ));
|
||||||
expected_variable_list.push_back(cache_symbol_t("sin",parser_t::e_cs_function));
|
expected_symbol_list.push_back(symbol_t("sin",parser_t::e_st_function));
|
||||||
|
|
||||||
bool result = (variable_list.size() == expected_variable_list.size()) &&
|
bool result = (symbol_list.size() == expected_symbol_list.size()) &&
|
||||||
std::equal(variable_list.begin(),
|
std::equal(symbol_list.begin(),
|
||||||
variable_list.end(),
|
symbol_list.end(),
|
||||||
expected_variable_list.begin());
|
expected_symbol_list.begin());
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
printf("run_test10() - Failed variable list comparison.(5)\n");
|
printf("run_test10() - Failed variable list comparison.(5)\n");
|
||||||
|
@ -3432,6 +3440,70 @@ inline bool run_test10()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
T a = T(1);
|
||||||
|
T b = T(2);
|
||||||
|
T c = T(3);
|
||||||
|
T d = T(4);
|
||||||
|
|
||||||
|
std::string e = "string";
|
||||||
|
|
||||||
|
exprtk::symbol_table<T> symbol_table;
|
||||||
|
|
||||||
|
symbol_table.add_variable ("a",a);
|
||||||
|
symbol_table.add_variable ("b",b);
|
||||||
|
symbol_table.add_variable ("c",c);
|
||||||
|
symbol_table.add_variable ("d",d);
|
||||||
|
symbol_table.add_stringvar("e",e);
|
||||||
|
|
||||||
|
expression_t expression;
|
||||||
|
expression.register_symbol_table(symbol_table);
|
||||||
|
|
||||||
|
std::string expression_string = "a := b + c; "
|
||||||
|
"b := c + d; "
|
||||||
|
"c := d + 1; "
|
||||||
|
"e := e + 'abc'; ";
|
||||||
|
|
||||||
|
typedef exprtk::parser<T> parser_t;
|
||||||
|
typedef typename parser_t::dependent_entity_collector::symbol_t symbol_t;
|
||||||
|
|
||||||
|
std::deque<symbol_t> variable_list;
|
||||||
|
|
||||||
|
{
|
||||||
|
parser_t parser;
|
||||||
|
|
||||||
|
parser.dec().collect_assignments() = true;
|
||||||
|
|
||||||
|
if (!parser.compile(expression_string,expression))
|
||||||
|
{
|
||||||
|
printf("run_test10() - Error: %s Expression: %s\n",
|
||||||
|
parser.error().c_str(),
|
||||||
|
expression_string.c_str());
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
parser.dec().assignment_symbols(variable_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::deque<symbol_t> expected_assignment_list;
|
||||||
|
|
||||||
|
expected_assignment_list.push_back(symbol_t("a",parser_t::e_st_variable));
|
||||||
|
expected_assignment_list.push_back(symbol_t("b",parser_t::e_st_variable));
|
||||||
|
expected_assignment_list.push_back(symbol_t("c",parser_t::e_st_variable));
|
||||||
|
expected_assignment_list.push_back(symbol_t("e",parser_t::e_st_string ));
|
||||||
|
|
||||||
|
bool result = (variable_list.size() == expected_assignment_list.size()) &&
|
||||||
|
std::equal(variable_list.begin(),
|
||||||
|
variable_list.end(),
|
||||||
|
expected_assignment_list.begin());
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
printf("run_test10() - Failed variable list comparison.(6)\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
exprtk::symbol_table<T> symbol_table0;
|
exprtk::symbol_table<T> symbol_table0;
|
||||||
exprtk::symbol_table<T> symbol_table1;
|
exprtk::symbol_table<T> symbol_table1;
|
||||||
|
@ -6067,13 +6139,13 @@ struct my_usr : public exprtk::parser<T>::unknown_symbol_resolver
|
||||||
typedef typename exprtk::parser<T>::unknown_symbol_resolver usr_t;
|
typedef typename exprtk::parser<T>::unknown_symbol_resolver usr_t;
|
||||||
|
|
||||||
bool process(const std::string& unknown_symbol,
|
bool process(const std::string& unknown_symbol,
|
||||||
typename usr_t::symbol_type& st,
|
typename usr_t::usr_symbol_type& st,
|
||||||
T& default_value,
|
T& default_value,
|
||||||
std::string& error_message)
|
std::string& error_message)
|
||||||
{
|
{
|
||||||
if (unknown_symbol[0] == 'v')
|
if (unknown_symbol[0] == 'v')
|
||||||
{
|
{
|
||||||
st = usr_t::e_variable_type;
|
st = usr_t::e_usr_variable_type;
|
||||||
default_value = next_value();
|
default_value = next_value();
|
||||||
error_message = "";
|
error_message = "";
|
||||||
|
|
||||||
|
@ -6081,7 +6153,7 @@ struct my_usr : public exprtk::parser<T>::unknown_symbol_resolver
|
||||||
}
|
}
|
||||||
else if (unknown_symbol[0] == 'c')
|
else if (unknown_symbol[0] == 'c')
|
||||||
{
|
{
|
||||||
st = usr_t::e_constant_type;
|
st = usr_t::e_usr_constant_type;
|
||||||
default_value = next_value();
|
default_value = next_value();
|
||||||
error_message = "";
|
error_message = "";
|
||||||
|
|
||||||
|
|
14
readme.txt
14
readme.txt
|
@ -1449,15 +1449,15 @@ particular parameter sequence can be performed.
|
||||||
|
|
||||||
In the above example there are four distinct parameter sequences that
|
In the above example there are four distinct parameter sequences that
|
||||||
can be processed by the generic function 'roo'. Any other parameter
|
can be processed by the generic function 'roo'. Any other parameter
|
||||||
sequences will cause a compilation error. The valid four sequences are
|
sequences will cause a compilation error. The four valid sequences are
|
||||||
as follows:
|
as follows:
|
||||||
|
|
||||||
Sequence-0 Sequence-1 Sequence-2 Sequence-3
|
Sequence-0 Sequence-1 Sequence-2 Sequence-3
|
||||||
'SVTT' 'SS' 'TTV' 'S?V*S'
|
'SVTT' 'SS' 'TTV' 'S?V*S'
|
||||||
(1) String (1) String (1) Scalar (1) String
|
(1) String (1) String (1) Scalar (1) String
|
||||||
(2) Vector (2) String (2) Scalar (2) Any Type
|
(2) Vector (2) String (2) Scalar (2) Any Type
|
||||||
(3) Scalar (3) Vector (3) One or more Vectors
|
(3) Scalar (3) Vector (3) One or more Vectors
|
||||||
(4) Scalar (4) String
|
(4) Scalar (4) String
|
||||||
|
|
||||||
|
|
||||||
(5) function_compositor
|
(5) function_compositor
|
||||||
|
|
Loading…
Reference in New Issue