42 printf(
"%c",
static_cast<int>(v.toLong()));
56 printf(
"%d",
static_cast<int>(v.toLong()));
67 { ::srand(
static_cast<unsigned int>(time(NULL))); }
73 return T(::rand() / T(RAND_MAX + 1.0));
91 typedef typename parser_t::dependent_entity_collector::symbol_t
symbol_t;
104 #ifdef exprtk_enable_repl_variables
106 s1_(
"abcdefghijk0123456789"),
107 s2_(
"012345678901234567890123456789"),
110 v2_({3,3,3,3,3,3,3}),
111 v3_({4,4,4,4,4,4,4,4}),
137 #ifdef exprtk_enable_repl_variables
242 compile_timer.
start();
261 printf(
"Error: %s\tExpression:%c%s\n",
263 ((std::string::npos != program.find_first_of(
'\n')) ?
'\n' :
' '),
264 ((program.size() < 200) ? program.c_str() :
"....."));
270 printf(
"Err No.: %02d Pos: %02d Type: [%14s] Msg: %s\n",
271 static_cast<unsigned int>(i),
281 printf(
"Error (line: %d column: %d)\n",
282 static_cast<unsigned int>(error.
line_no),
283 static_cast<unsigned int>(error.
column_no));
286 printf(
"%s^\n",std::string(error.
column_no,
'~').c_str());
293 compile_timer.
stop();
297 printf(
"\nCompile time: %6.3fms\n",compile_timer.
time() * 1000.0);
315 result = expression.
value();
319 timings[i] = timer.
time() * 1000.0;
324 printf(
"\nresult: %s\n",result.toString().c_str());
326 std::sort(timings.begin(),timings.end());
328 printf(
"\nRuns: %4d Time min %7.3fms\tmax: %7.3fms\tavg: %7.3fms\ttot: %7.3fms 90%%:%7.3fms\n",
332 std::accumulate(timings.begin(),timings.end(),0.0) / timings.size(),
333 total_timer.
time() * 1000.0,
334 timings[
static_cast<int>(timings.size() * 0.90)]);
342 T result = expression.
value();
351 printf(
"\nresult: %s\n",result.toString().c_str());
355 printf(
"\nTotal time: %6.3fms\n",timer.
time() * 1000.0);
364 printf(
"------ Symbols ------\n");
366 printf(
"---------------------\n");
375 printf(
"---- Assignments ----\n");
377 printf(
"---------------------\n");
383 if (file_name.empty())
386 std::ifstream stream(file_name.c_str());
390 printf(
"ERROR: Failed to open file: %s\n\n",file_name.c_str());
395 (std::istreambuf_iterator<char>(stream)),
396 (std::istreambuf_iterator<char>())
406 if (
'$' != expression[0])
408 else if (
"$enable_cache" == expression)
410 else if (
"$disable_cache" == expression)
412 else if (
"$enable_symbol_dump" == expression)
414 else if (
"$disable_symbol_dump" == expression)
416 else if (
"$enable_assignment_dump" == expression)
418 else if (
"$disable_assignment_dump" == expression)
420 else if (
"$enable_timer" == expression)
422 else if (
"$enable_compile_timer" == expression)
424 else if (
"$disable_timer" == expression)
426 else if (
"$disable_compile_timer" == expression)
428 else if (
"$enable_usr" == expression)
430 else if (
"$disable_usr" == expression)
432 else if (
"$enable_local_vardef" == expression)
434 else if (
"$disable_local_vardef" == expression)
436 else if (
"$list_vars" == expression)
438 else if (
"$clear_functions" == expression)
440 else if ((0 == expression.find(
"$set_mpfr_prec ")) && (expression.size() > 15))
441 mpfr::mpreal::set_default_prec(atoi(expression.substr(14,expression.size() - 14).c_str()));
442 else if ((0 == expression.find(
"$batch_run ")) && (expression.size() > 12))
444 else if ((0 == expression.find(
"$load ")) && (expression.size() > 7))
446 else if ((0 == expression.find(
"$disable arithmetic ")) && (expression.size() >= 21))
448 else if ((0 == expression.find(
"$disable assignment ")) && (expression.size() >= 21))
450 else if ((0 == expression.find(
"$disable inequality ")) && (expression.size() >= 21))
452 else if ((0 == expression.find(
"$enable arithmetic ")) && (expression.size() >= 20))
454 else if ((0 == expression.find(
"$enable assignment ")) && (expression.size() >= 20))
456 else if ((0 == expression.find(
"$enable inequality ")) && (expression.size() >= 20))
458 else if (
"$begin" == expression)
460 else if (0 == expression.find(
"$function"))
463 printf(
"\nERROR - Invalid directive: %s\n",expression.c_str());
471 typedef typename results_context_t::type_store_t type_t;
472 typedef typename type_t::scalar_view scalar_t;
473 typedef typename type_t::vector_view vector_t;
474 typedef typename type_t::string_view string_t;
478 printf(
"%s\n",std::string(10,
'-').c_str());
479 printf(
"Return Results (#%d)\n",
static_cast<int>(results.
count()));
481 for (std::size_t i = 0; i < results.
count(); ++i)
483 printf(
"[%02d] ",
static_cast<int>(i));
485 type_t t = results[i];
489 case type_t::e_scalar : printf(
"Scalar\t");
493 case type_t::e_vector : {
497 for (std::size_t x = 0; x < vector.size(); ++x)
501 if ((x + 1) < vector.size())
507 case type_t::e_string : printf(
"String\t");
508 printf(
"%s",to_str(string_t(t)).c_str());
517 printf(
"%s\n",std::string(10,
'-').c_str());
522 for (std::size_t i = 0; i < variable_list.size(); ++i)
524 const symbol_t& symbol = variable_list[i];
526 switch (symbol.second)
529 static_cast<int>(i),symbol.first.c_str());
533 static_cast<int>(i),symbol.first.c_str());
537 static_cast<int>(i),symbol.first.c_str());
541 static_cast<int>(i),symbol.first.c_str());
545 : printf(
"[%02d] LocalVar %s\n",
546 static_cast<int>(i),symbol.first.c_str());
550 : printf(
"[%02d] LocalVec %s\n",
551 static_cast<int>(i),symbol.first.c_str());
555 : printf(
"[%02d] LocalStr %s\n",
556 static_cast<int>(i),symbol.first.c_str());
578 std::getline(std::cin,line);
584 else if (
"$end" == line)
587 program += (line +
"\n");
638 std::vector<std::string> var_list;
663 int bracket_stack = 0;
676 if (0 == --bracket_stack)
681 if (
lexer().finished())
688 std::size_t size = body_end - body_begin + 1;
690 fd.
body = func_def.substr(body_begin,size);
692 const std::size_t index = body_begin + size;
694 if (index < func_def.size())
695 func_def = func_def.substr(index,func_def.size() - index);
706 return parser.
process(func_def,cf);
718 std::getline(std::cin,line);
722 else if (
"$end" == line)
725 input += (line +
"\n");
729 input.erase(input.end() - 1);
736 std::string func_def = func_def_header;
742 if (!func_def.empty() && (
'$' == func_def[0]))
743 func_def.erase(func_def.begin());
756 for (std::size_t i = 0; i < fd.
var_list.size(); ++i)
763 for (std::size_t i = 0; i < fd.
var_list.size(); ++i)
789 printf(
"Error - Failed to add function: %s\n",fd.
name.c_str());
794 printf(
"Function[%02d]\n",
static_cast<int>(
func_def_list_.size()));
795 printf(
"Name: %s \n",fd.
name.c_str() );
796 printf(
"Vars: (%s) \n",vars.c_str() );
797 printf(
"------------------------------------------------------\n");
803 printf(
"Error - Critical parsing error - partial parse occured\n");
809 while (!func_def.empty());
811 if (!func_def.empty())
819 std::deque<std::pair<std::string,T> > variable_list;
822 std::size_t max_varname_length = 0;
824 for (std::size_t i = 0; i < variable_list.size(); ++i)
826 max_varname_length = std::max(max_varname_length,variable_list[i].first.size());
829 for (std::size_t i = 0; i < variable_list.size(); ++i)
833 if (max_varname_length > variable_list[i].first.size())
835 pad_length =
static_cast<int>(max_varname_length - variable_list[i].first.size());
838 printf(
"%02d %s%*.*s %s\n",
839 static_cast<unsigned int>(i),
840 variable_list[i].first.c_str(),
843 std::string(max_varname_length,
' ').c_str(),
844 variable_list[i].second.toString().c_str());
856 static const std::string whitespace(
" \n\r\t\b\v\f");
860 s.erase(0,s.find_first_not_of(whitespace));
864 std::size_t index = s.find_last_not_of(whitespace);
866 if (std::string::npos != index)
878 typename std::map<std::string,typename settings_store_t::settings_arithmetic_opr>::iterator itr;
889 typename std::map<std::string,typename settings_store_t::settings_assignment_opr>::iterator itr;
900 typename std::map<std::string,typename settings_store_t::settings_inequality_opr>::iterator itr;
911 typename std::map<std::string,typename settings_store_t::settings_arithmetic_opr>::iterator itr;
922 typename std::map<std::string,typename settings_store_t::settings_assignment_opr>::iterator itr;
933 typename std::map<std::string,typename settings_store_t::settings_inequality_opr>::iterator itr;
981 std::map<std::string,typename settings_store_t::settings_arithmetic_opr>
arith_opr_;
982 std::map<std::string,typename settings_store_t::settings_assignment_opr>
assign_opr_;
983 std::map<std::string,typename settings_store_t::settings_inequality_opr>
inequality_opr_;
985 #ifdef exprtk_enable_repl_variables
998void repl(
int argc,
char* argv[])
1004 for (
int i = 1; i < argc; ++i)
1013 std::string expression;
1016 std::getline(std::cin,expression);
1018 if (expression.empty())
1020 else if (
"exit" == expression)
1022 else if (
"quit" == expression)
1024 else if (
'$' == expression[0])
1027 processor.
process(expression);
1034 mpfr::mpreal::set_default_prec(1024);
1035 repl<mpfr::mpreal>(argc,argv);
void print_results(const exprtk::results_context< T > &results)
exprtk::rtl::io::file::package< T > fileio_package_
exprtk::polynomial< T, 6 > poly06_
void process_enable_inequality(const std::string &inequality)
bool disable_local_vardef_
exprtk::expression< T > expression_t
exprtk::polynomial< T, 5 > poly05_
std::vector< function_definition > func_def_list_
void process_disable_inequality(const std::string &inequality)
std::map< std::string, typename settings_store_t::settings_arithmetic_opr > arith_opr_
std::size_t batch_runs_cnt_
parser_t::dependent_entity_collector::symbol_t symbol_t
exprtk::polynomial< T, 7 > poly07_
exprtk::rtl::vecops::package< T > vecops_package_
void process_enable_assignment(const std::string &assignment)
exprtk::polynomial< T, 4 > poly04_
exprtk::polynomial< T, 8 > poly08_
parser_t::settings_store settings_store_t
bool & persist_symbol_table()
bool display_total_compile_time_
void perform_symbol_dump(const symbol_list_t &variable_list) const
void process_batch_run(const std::string &batch_runs_cnt)
std::vector< symbol_t > symbol_list_t
std::map< std::string, typename settings_store_t::settings_assignment_opr > assign_opr_
void process_disable_arithmetic(const std::string &arithmetic)
func_parse_result parse_function_definition(std::string &func_def, function_definition &cf)
exprtk::polynomial< T, 3 > poly03_
void setup_symbol_table()
compositor_t::function function_t
exprtk::polynomial< T, 9 > poly09_
std::string trim_whitespace(std::string s)
bool & disable_local_vardef()
exprtk::parser_error::type error_t
bool & display_total_time()
exprtk::symbol_table< T > symbol_table_t
void process_disable_assignment(const std::string &assignment)
exprtk::function_compositor< T > compositor_t
symbol_table_t symbol_table_
exprtk::lexer::parser_helper prsrhlpr_t
std::map< std::string, typename settings_store_t::settings_inequality_opr > inequality_opr_
exprtk::polynomial< T, 2 > poly02_
exprtk::parser< T > parser_t
void process_function_definition(const std::string &func_def_header, bool read_stdin=true)
exprtk::polynomial< T, 12 > poly12_
bool persist_symbol_table_
symbol_table_t function_symbol_table_
exprtk::rtl::io::package< T > io_package_
exprtk::polynomial< T, 11 > poly11_
std::string read_from_stdin()
exprtk::polynomial< T, 10 > poly10_
bool & display_total_compile_time()
exprtk::polynomial< T, 1 > poly01_
void process_from_file(const std::string &file_name)
void process_directive(std::string expression)
void process(std::string program)
void process_enable_arithmetic(const std::string &arithmetic)
bool register_symbol_table(symbol_table< T > &st)
const results_context_t & results() const
void add_auxiliary_symtab(symbol_table_t &symtab)
bool add(const std::string &name, const std::string &expression, const Sequence< std::string, Allocator > &var_list, const bool override=false)
ifunction(const std::size_t &pc)
bool init(const std::string &str)
const token_t & current_token() const
bool token_is(const token_t::token_type &ttype, const token_advance_mode mode=e_advance)
bool & collect_variables()
bool & collect_assignments()
bool & collect_functions()
std::size_t assignment_symbols(Sequence< symbol_t, Allocator > &assignment_list)
std::size_t symbols(Sequence< symbol_t, Allocator > &symbols_list)
settings_store & enable_arithmetic_operation(const settings_arithmetic_opr arithmetic)
settings_store & disable_arithmetic_operation(const settings_arithmetic_opr arithmetic)
settings_store & disable_assignment_operation(const settings_assignment_opr assignment)
settings_store & enable_assignment_operation(const settings_assignment_opr assignment)
settings_store & disable_local_vardef()
settings_store & disable_inequality_operation(const settings_inequality_opr inequality)
settings_store & enable_local_vardef()
settings_store & enable_inequality_operation(const settings_inequality_opr inequality)
bool compile(const std::string &expression_string, expression< T > &expr)
void enable_unknown_symbol_resolver(unknown_symbol_resolver *usr=reinterpret_cast< unknown_symbol_resolver * >(0))
dependent_entity_collector & dec()
parser_error::type get_error(const std::size_t &index) const
std::string error() const
std::size_t error_count() const
void disable_unknown_symbol_resolver()
settings_store & settings()
std::size_t count() const
bool add_package(Package &package)
bool add_constant(const std::string &constant_name, const T &value)
void clear_variables(const bool delete_node=true)
bool add_function(const std::string &function_name, function_t &function)
function_ptr get_function(const std::string &function_name) const
std::size_t get_variable_list(Sequence< std::pair< std::string, T >, Allocator > &vlist) const
bool add_vector(const std::string &vector_name, T(&v)[N])
bool add_stringvar(const std::string &stringvar_name, std::string &s, const bool is_constant=false)
bool remove_function(const std::string &function_name)
void repl(int argc, char *argv[])
bool imatch(const char_t c1, const char_t c2)
bool update_error(type &error, const std::string &expression)
std::string to_str(error_mode mode)
void print_type(const std::string &fmt, const T v, exprtk::details::numeric::details::real_type_tag)
vector_view< T > make_vector_view(T *data, const std::size_t size, const std::size_t offset=0)
std::vector< std::string > var_list
func_parse_result process(std::string &func_def, function_definition &fd)
function & expression(const std::string &e)
function & var(const std::string &v)