C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html
This commit is contained in:
parent
b04aa28e59
commit
ef91ad59e9
|
@ -19539,11 +19539,16 @@ namespace exprtk
|
||||||
{
|
{
|
||||||
if (is_variable_node(expression_list[i]))
|
if (is_variable_node(expression_list[i]))
|
||||||
continue;
|
continue;
|
||||||
else if (is_return_node(expression_list[i]))
|
else if (
|
||||||
|
is_return_node (expression_list[i]) ||
|
||||||
|
is_break_node (expression_list[i]) ||
|
||||||
|
is_continue_node(expression_list[i])
|
||||||
|
)
|
||||||
{
|
{
|
||||||
tmp_expression_list.push_back(expression_list[i]);
|
tmp_expression_list.push_back(expression_list[i]);
|
||||||
|
|
||||||
// Remove all subexpressions after first encountered return node.
|
// Remove all subexpressions after first short-circuit
|
||||||
|
// node has been encountered.
|
||||||
|
|
||||||
for (std::size_t j = i + 1; j < expression_list.size(); ++j)
|
for (std::size_t j = i + 1; j < expression_list.size(); ++j)
|
||||||
{
|
{
|
||||||
|
|
|
@ -29,6 +29,7 @@ void trig_function()
|
||||||
typedef exprtk::parser<T> parser_t;
|
typedef exprtk::parser<T> parser_t;
|
||||||
|
|
||||||
std::string expression_string = "clamp(-1.0,sin(2 * pi * x) + cos(x / 2 * pi),+1.0)";
|
std::string expression_string = "clamp(-1.0,sin(2 * pi * x) + cos(x / 2 * pi),+1.0)";
|
||||||
|
|
||||||
T x;
|
T x;
|
||||||
|
|
||||||
symbol_table_t symbol_table;
|
symbol_table_t symbol_table;
|
||||||
|
|
|
@ -3955,11 +3955,30 @@ inline bool run_test10()
|
||||||
"12 == (if (1 > 2) { var x:= 2; } else { var x[3] := {7,2,3}; sum(x); })",
|
"12 == (if (1 > 2) { var x:= 2; } else { var x[3] := {7,2,3}; sum(x); })",
|
||||||
"12 == (if (1 < 2) { var x[3] := {7,2,3}; sum(x); } else { var x:= 2; })",
|
"12 == (if (1 < 2) { var x[3] := {7,2,3}; sum(x); } else { var x:= 2; })",
|
||||||
"12 == (if (1 > 2) { var x:= 2; } else { var x[3] := {7,2,3}; sum(x); })",
|
"12 == (if (1 > 2) { var x:= 2; } else { var x[3] := {7,2,3}; sum(x); })",
|
||||||
"12 == (if (1 < 2) { var x[3] := {7,2,3}; sum(x); } else { var x:= 2; })"
|
"12 == (if (1 < 2) { var x[3] := {7,2,3}; sum(x); } else { var x:= 2; })",
|
||||||
|
|
||||||
|
"21 == (for (var i := 0; i < 10; i += 1) { if (i > 2) { break [i * 7]; i += 1;"
|
||||||
|
"i += 2; i += 3; }; })",
|
||||||
|
|
||||||
|
"21 == (for (var i := 0; i < 10; i += 1) { if (i > 2) { break [i * 7]; return "
|
||||||
|
"[i * 8]; i += 1; i += 2; i += 3; }; })",
|
||||||
|
|
||||||
|
"2 == for (var i := 0; i < 10; i += 1) { if (i > 2) { continue; i += 1; i += 2;"
|
||||||
|
"i += 3; } else i; }",
|
||||||
|
|
||||||
|
"2 == for (var i := 0; i < 10; i += 1) { if (i > 2) { continue; return [i * 8];"
|
||||||
|
"i += 1; i += 2; i += 3; } else i; }",
|
||||||
|
|
||||||
|
"7 == (for (var i := 0; i < 10; i += 1) { ~{break[7]; continue; i += i} })",
|
||||||
|
"0 == (for (var i := 0; i < 10; i += 1) { ~{break[i]; continue; i += i} })",
|
||||||
|
"0 == (for (var i := 0; i < 10; i += 1) { ~{continue; break[7]; i += i} })",
|
||||||
|
"1 == (for (var i := 0; i < 10; i += 1) { ~{break[i += 1]; continue; i += i} })"
|
||||||
};
|
};
|
||||||
|
|
||||||
const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
|
const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
|
||||||
|
|
||||||
|
static const std::size_t rounds = 20;
|
||||||
|
|
||||||
exprtk::symbol_table<T> symbol_table;
|
exprtk::symbol_table<T> symbol_table;
|
||||||
|
|
||||||
T zero = T(0);
|
T zero = T(0);
|
||||||
|
@ -3970,7 +3989,7 @@ inline bool run_test10()
|
||||||
|
|
||||||
bool failed = false;
|
bool failed = false;
|
||||||
|
|
||||||
for (std::size_t r = 0; r < 10; ++r)
|
for (std::size_t r = 0; r < rounds; ++r)
|
||||||
{
|
{
|
||||||
for (std::size_t i = 0; i < expression_list_size; ++i)
|
for (std::size_t i = 0; i < expression_list_size; ++i)
|
||||||
{
|
{
|
||||||
|
@ -3982,7 +4001,7 @@ inline bool run_test10()
|
||||||
|
|
||||||
if (!parser.compile(expression_list[i],expression))
|
if (!parser.compile(expression_list[i],expression))
|
||||||
{
|
{
|
||||||
printf("run_test10() - swaps Error: %s Expression: %s\n",
|
printf("run_test10() - swaps[1] Error: %s Expression: %s\n",
|
||||||
parser.error().c_str(),
|
parser.error().c_str(),
|
||||||
expression_list[i].c_str());
|
expression_list[i].c_str());
|
||||||
|
|
||||||
|
@ -3995,7 +4014,44 @@ inline bool run_test10()
|
||||||
|
|
||||||
if (T(1) != result)
|
if (T(1) != result)
|
||||||
{
|
{
|
||||||
printf("run_test10() - swaps evaluation error Expression: %s\n",
|
printf("run_test10() - swaps[1] evaluation error Expression: %s\n",
|
||||||
|
expression_list[i].c_str());
|
||||||
|
|
||||||
|
failed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (failed)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// reuse parser
|
||||||
|
for (std::size_t r = 0; r < rounds; ++r)
|
||||||
|
{
|
||||||
|
exprtk::parser<T> parser;
|
||||||
|
|
||||||
|
for (std::size_t i = 0; i < expression_list_size; ++i)
|
||||||
|
{
|
||||||
|
expression_t expression;
|
||||||
|
expression.register_symbol_table(symbol_table);
|
||||||
|
|
||||||
|
if (!parser.compile(expression_list[i],expression))
|
||||||
|
{
|
||||||
|
printf("run_test10() - swaps[2] Error: %s Expression: %s\n",
|
||||||
|
parser.error().c_str(),
|
||||||
|
expression_list[i].c_str());
|
||||||
|
|
||||||
|
failed = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
T result = expression.value();
|
||||||
|
|
||||||
|
if (T(1) != result)
|
||||||
|
{
|
||||||
|
printf("run_test10() - swaps[2] evaluation error Expression: %s\n",
|
||||||
expression_list[i].c_str());
|
expression_list[i].c_str());
|
||||||
|
|
||||||
failed = true;
|
failed = true;
|
||||||
|
|
Loading…
Reference in New Issue