Skip to content

Commit bfe019a

Browse files
committed
Updates to ExprTk
1 parent 8fb297c commit bfe019a

File tree

2 files changed

+153
-50
lines changed

2 files changed

+153
-50
lines changed

exprtk/exprtk.hpp

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24682,18 +24682,11 @@ namespace exprtk
2468224682
{
2468324683
if (unknown_symbol_resolver_->process(symbol, symtab, error_message))
2468424684
{
24685-
static bool usr_extmode_active = false;
24685+
expression_node_ptr result = parse_symtab_symbol();
2468624686

24687-
if (!usr_extmode_active)
24687+
if (result)
2468824688
{
24689-
usr_extmode_active = true;
24690-
expression_node_ptr result = parse_symtab_symbol();
24691-
usr_extmode_active = false;
24692-
24693-
if (result)
24694-
{
24695-
return result;
24696-
}
24689+
return result;
2469724690
}
2469824691
}
2469924692

exprtk/exprtk_test.cpp

Lines changed: 150 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3273,15 +3273,15 @@ struct myfunc : public exprtk::ifunction<T>
32733273
}
32743274
};
32753275

3276-
#define define_free_functions(Type) \
3277-
Type foo1(Type v0) { return v0; } \
3278-
Type foo2(Type v0, Type v1) { return v0 + v1; } \
3279-
Type foo3(Type v0, Type v1, Type v2) { return v0 + v1 + v2; } \
3280-
Type foo4(Type v0, Type v1, Type v2, Type v3) { return v0 + v1 + v2 + v3; } \
3281-
Type foo5(Type v0, Type v1, Type v2, Type v3, Type v4) { return v0 + v1 + v2 + v3 + v4; } \
3282-
Type foo6(Type v0, Type v1, Type v2, Type v3, Type v4, Type v5) { return v0 + v1 + v2 + v3 + v4 + v5; } \
3283-
3284-
define_free_functions(numeric_type)
3276+
#define define_free_functions(N,Type) \
3277+
Type N##1(Type v0) { return v0; } \
3278+
Type N##2(Type v0, Type v1) { return v0 + v1; } \
3279+
Type N##3(Type v0, Type v1, Type v2) { return v0 + v1 + v2; } \
3280+
Type N##4(Type v0, Type v1, Type v2, Type v3) { return v0 + v1 + v2 + v3; } \
3281+
Type N##5(Type v0, Type v1, Type v2, Type v3, Type v4) { return v0 + v1 + v2 + v3 + v4; } \
3282+
Type N##6(Type v0, Type v1, Type v2, Type v3, Type v4, Type v5) { return v0 + v1 + v2 + v3 + v4 + v5; } \
3283+
3284+
define_free_functions(foo,numeric_type)
32853285
#undef define_free_functions
32863286

32873287
template <typename T>
@@ -7665,54 +7665,164 @@ struct my_usr : public exprtk::parser<T>::unknown_symbol_resolver
76657665
}
76667666
};
76677667

7668+
template <typename T>
7669+
struct my_usr_ext : public exprtk::parser<T>::unknown_symbol_resolver
7670+
{
7671+
typedef exprtk::symbol_table<T> symbol_table_t;
7672+
typedef typename exprtk::parser<T>::unknown_symbol_resolver usr_t;
7673+
7674+
my_usr_ext()
7675+
: usr_t(usr_t::e_usrmode_extended)
7676+
{}
7677+
7678+
virtual bool process(const std::string& unknown_symbol,
7679+
symbol_table_t& symbol_table,
7680+
std::string& error_message)
7681+
{
7682+
bool result = false;
7683+
7684+
if (unknown_symbol[0] == 'v')
7685+
{
7686+
static T var_default_value = 1.0;
7687+
7688+
if (!(result = symbol_table.create_variable(unknown_symbol, var_default_value++)))
7689+
{
7690+
error_message = "Failed to create variable(" + unknown_symbol + ") in primary symbol table";
7691+
}
7692+
}
7693+
else if (unknown_symbol[0] == 'c')
7694+
{
7695+
static T cvar_default_value = 1.0;
7696+
7697+
if (!(result = symbol_table.add_constant(unknown_symbol, cvar_default_value++)))
7698+
{
7699+
error_message = "Failed to create const variable(" + unknown_symbol + ") in primary symbol table";
7700+
}
7701+
}
7702+
else if (0 == unknown_symbol.find("foo"))
7703+
{
7704+
//functions of form: fooXX
7705+
if (4 >= unknown_symbol.size())
7706+
{
7707+
switch(unknown_symbol[3])
7708+
{
7709+
case '1' : result = symbol_table.add_function(unknown_symbol,foo1);
7710+
break;
7711+
7712+
case '2' : result = symbol_table.add_function(unknown_symbol,foo2);
7713+
break;
7714+
7715+
case '3' : result = symbol_table.add_function(unknown_symbol,foo3);
7716+
break;
7717+
7718+
case '4' : result = symbol_table.add_function(unknown_symbol,foo4);
7719+
break;
7720+
7721+
case '5' : result = symbol_table.add_function(unknown_symbol,foo5);
7722+
break;
7723+
7724+
case '6' : result = symbol_table.add_function(unknown_symbol,foo6);
7725+
break;
7726+
}
7727+
}
7728+
7729+
if (!result)
7730+
{
7731+
error_message = "Failed to add function(" + unknown_symbol + ") in primary symbol table";
7732+
}
7733+
}
7734+
else
7735+
error_message = "Indeterminable symbol type.";
7736+
7737+
return result;
7738+
}
7739+
};
7740+
76687741
template <typename T>
76697742
inline bool run_test20()
76707743
{
76717744
typedef exprtk::expression<T> expression_t;
76727745

7673-
for (std::size_t i = 0; i < 100; ++i)
76747746
{
7675-
exprtk::symbol_table<T> symbol_table0;
7676-
exprtk::symbol_table<T> symbol_table1;
7677-
exprtk::symbol_table<T> symbol_table2;
7678-
exprtk::symbol_table<T> symbol_table3;
7747+
for (std::size_t i = 0; i < 100; ++i)
7748+
{
7749+
exprtk::symbol_table<T> symbol_table0; // primary symbol_table
7750+
exprtk::symbol_table<T> symbol_table1;
7751+
exprtk::symbol_table<T> symbol_table2;
7752+
exprtk::symbol_table<T> symbol_table3;
76797753

7680-
symbol_table0.add_constants();
7754+
symbol_table0.add_constants();
76817755

7682-
expression_t expression;
7683-
expression.register_symbol_table(symbol_table0);
7684-
expression.register_symbol_table(symbol_table1);
7685-
expression.register_symbol_table(symbol_table2);
7686-
expression.register_symbol_table(symbol_table3);
7756+
expression_t expression;
7757+
expression.register_symbol_table(symbol_table0);
7758+
expression.register_symbol_table(symbol_table1);
7759+
expression.register_symbol_table(symbol_table2);
7760+
expression.register_symbol_table(symbol_table3);
76877761

7688-
exprtk::parser<T> parser;
7762+
exprtk::parser<T> parser;
76897763

7690-
my_usr<T> musr;
7691-
musr.next_value(true);
7692-
parser.enable_unknown_symbol_resolver(&musr);
7764+
my_usr<T> musr;
7765+
musr.next_value(true);
7766+
parser.enable_unknown_symbol_resolver(&musr);
76937767

7694-
std::string expr_str = "v01+c02+v03+c04+v05+c06+v07+c08+v09+c10+"
7695-
"v11+c12+v13+c14+v15+c16+v17+c18+v19+c20+"
7696-
"v21+c22+v23+c24+v25+c26+v27+c28+v29+c30 ";
7768+
std::string expr_str = "v01+c02+v03+c04+v05+c06+v07+c08+v09+c10+"
7769+
"v11+c12+v13+c14+v15+c16+v17+c18+v19+c20+"
7770+
"v21+c22+v23+c24+v25+c26+v27+c28+v29+c30 ";
76977771

7698-
if (!parser.compile(expr_str,expression))
7699-
{
7700-
printf("run_test20() - Error: %s Expression: %s\n",
7701-
parser.error().c_str(),
7702-
expr_str.c_str());
7772+
if (!parser.compile(expr_str,expression))
7773+
{
7774+
printf("run_test20() - [1] Error: %s Expression: %s\n",
7775+
parser.error().c_str(),
7776+
expr_str.c_str());
77037777

7704-
return false;
7705-
}
7778+
return false;
7779+
}
7780+
7781+
T sum_1_30 = T((1 + 30) * 15);
7782+
T result = expression.value();
7783+
7784+
if (sum_1_30 != result)
7785+
{
7786+
printf("run_test20() - [1] Error in evaluation! (1) Expression: %s\n",
7787+
expr_str.c_str());
77067788

7707-
T sum_1_30 = T((1 + 30) * 15);
7708-
T result = expression.value();
7789+
return false;
7790+
}
7791+
}
7792+
}
77097793

7710-
if (sum_1_30 != result)
7794+
{
7795+
for (std::size_t i = 0; i < 100; ++i)
77117796
{
7712-
printf("run_test20() - Error in evaluation! (1) Expression: %s\n",
7713-
expr_str.c_str());
7797+
exprtk::symbol_table<T> symbol_table0; // primary symbol_table
7798+
exprtk::symbol_table<T> symbol_table1;
7799+
exprtk::symbol_table<T> symbol_table2;
7800+
exprtk::symbol_table<T> symbol_table3;
77147801

7715-
return false;
7802+
symbol_table0.add_constants();
7803+
7804+
expression_t expression;
7805+
expression.register_symbol_table(symbol_table0);
7806+
expression.register_symbol_table(symbol_table1);
7807+
expression.register_symbol_table(symbol_table2);
7808+
expression.register_symbol_table(symbol_table3);
7809+
7810+
exprtk::parser<T> parser;
7811+
7812+
my_usr_ext<T> musr;
7813+
parser.enable_unknown_symbol_resolver(&musr);
7814+
7815+
std::string expr_str = "foo6(foo1(v0),foo2(c1,foo4(v2,c3,v4,c5)),foo3"
7816+
"(v6,c7,foo5(v8,c9,v10,c11,v12)),c13,v14,c15) ";
7817+
7818+
if (!parser.compile(expr_str,expression))
7819+
{
7820+
printf("run_test20() - [2] Error: %s Expression: %s\n",
7821+
parser.error().c_str(),
7822+
expr_str.c_str());
7823+
7824+
return false;
7825+
}
77167826
}
77177827
}
77187828

0 commit comments

Comments
 (0)