34 using exprtk::ifunction<T>::operator();
40 printf(
"%c",
static_cast<int>(v));
48 using exprtk::ifunction<T>::operator();
54 printf(
"%d",
static_cast<int>(v));
62 using exprtk::ifunction<T>::operator();
65 { ::srand(
static_cast<unsigned int>(time(NULL))); }
71 return T(::rand() / T(RAND_MAX + 1.0));
79 printf(
"Runtime vector access violation\n"
80 "base: %p end: %p access: %p typesize: %d\n",
84 static_cast<unsigned int>(context.
type_size));
86 throw std::runtime_error(
"Runtime vector access violation.");
105 typedef typename parser_t::dependent_entity_collector::symbol_t
symbol_t;
119 #ifdef exprtk_enable_repl_variables
121 , s1_(
"abcdefghijk0123456789")
122 , s2_(
"012345678901234567890123456789")
124 , v1_({ 2, 2, 2, 2, 2})
125 , v2_({ 3, 3, 3, 3, 3, 3, 3})
126 , v3_({ 4, 4, 4, 4, 4, 4, 4, 4})
152 #ifdef exprtk_enable_repl_variables
262 compile_timer.
start();
265 parser_.enable_unknown_symbol_resolver();
267 parser_.disable_unknown_symbol_resolver();
270 parser_.settings().disable_local_vardef();
272 parser_.settings().enable_local_vardef();
275 parser_.settings().disable_commutative_check();
277 parser_.settings().enable_commutative_check();
286 if (!
parser_.compile(program,expression))
288 printf(
"Error: %s\tExpression:%c%s\n",
290 ((std::string::npos != program.find_first_of(
'\n')) ?
'\n' :
' '),
291 ((program.size() < 200) ? program.c_str() :
"....."));
293 for (std::size_t i = 0; i <
parser_.error_count(); ++i)
297 printf(
"Err No.: %02d Pos: %02d Type: [%14s] Msg: %s\n",
298 static_cast<unsigned int>(i),
308 printf(
"Error (line: %d column: %d)\n",
309 static_cast<unsigned int>(error.
line_no),
310 static_cast<unsigned int>(error.
column_no));
313 printf(
"%s^\n",std::string(error.
column_no,
'~').c_str());
320 compile_timer.
stop();
324 printf(
"\nCompile time: %6.3fms\n",compile_timer.
time() * 1000.0);
342 result = expression.
value();
346 timings[i] = timer.
time() * 1000.0;
351 printf(
"\nResult: %15.9f\n",result);
353 std::sort(timings.begin(),timings.end());
355 printf(
"\nRuns: %4d Time min: %7.3fms max: %7.3fms avg: %7.3fms tot: %7.3fms 90%%:%7.3fms\n",
359 std::accumulate(timings.begin(),timings.end(),0.0) / timings.size(),
360 total_timer.
time() * 1000.0,
361 timings[
static_cast<int>(timings.size() * 0.90)]);
369 const T result = expression.
value();
378 printf(
"\nResult: %15.9f\n",result);
382 printf(
"\nTotal time: %6.3fms\n",timer.
time() * 1000.0);
389 parser_.dec().symbols(symbol_list);
391 printf(
"------ Symbols ------\n");
393 printf(
"---------------------\n");
400 parser_.dec().assignment_symbols(assignment_list);
402 printf(
"---- Assignments ----\n");
404 printf(
"---------------------\n");
410 if (file_name.empty())
413 std::ifstream stream(file_name.c_str());
417 printf(
"ERROR: Failed to open file: %s\n\n",file_name.c_str());
422 (std::istreambuf_iterator<char>(stream)),
423 (std::istreambuf_iterator<char>())
433 if (
'$' != expression[0])
435 else if (
"$enable_cache" == expression)
437 else if (
"$disable_cache" == expression)
439 else if (
"$enable_symbol_dump" == expression)
441 else if (
"$disable_symbol_dump" == expression)
443 else if (
"$enable_assignment_dump" == expression)
445 else if (
"$disable_assignment_dump" == expression)
447 else if (
"$enable_timer" == expression)
449 else if (
"$enable_compile_timer" == expression)
451 else if (
"$disable_timer" == expression)
453 else if (
"$disable_compile_timer" == expression)
455 else if (
"$enable_usr" == expression)
457 else if (
"$disable_usr" == expression)
459 else if (
"$enable_local_vardef" == expression)
461 else if (
"$disable_local_vardef" == expression)
463 else if (
"$enable_commutative_check" == expression)
465 else if (
"$disable_commutative_check" == expression)
467 else if (
"$list_vars" == expression)
469 else if (
"$clear_functions" == expression)
471 else if ((0 == expression.find(
"$batch_run ")) && (expression.size() >= 12))
473 else if ((0 == expression.find(
"$load ")) && (expression.size() > 7))
475 else if ((0 == expression.find(
"$disable arithmetic ")) && (expression.size() >= 21))
477 else if ((0 == expression.find(
"$disable assignment ")) && (expression.size() >= 21))
479 else if ((0 == expression.find(
"$disable inequality ")) && (expression.size() >= 21))
481 else if ((0 == expression.find(
"$enable arithmetic ")) && (expression.size() >= 20))
483 else if ((0 == expression.find(
"$enable assignment ")) && (expression.size() >= 20))
485 else if ((0 == expression.find(
"$enable inequality ")) && (expression.size() >= 20))
487 else if (
"$begin" == expression)
489 else if (0 == expression.find(
"$function"))
492 printf(
"\nERROR - Invalid directive: %s\n",expression.c_str());
500 typedef typename results_context_t::type_store_t type_t;
501 typedef typename type_t::scalar_view scalar_t;
502 typedef typename type_t::vector_view vector_t;
503 typedef typename type_t::string_view string_t;
507 printf(
"%s\n",std::string(10,
'-').c_str());
508 printf(
"Return Results (#%d)\n",
static_cast<int>(results.
count()));
510 for (std::size_t i = 0; i < results.
count(); ++i)
512 printf(
"[%02d] ",
static_cast<int>(i));
514 type_t t = results[i];
518 case type_t::e_scalar : printf(
"Scalar\t");
522 case type_t::e_vector : {
526 for (std::size_t x = 0; x < vector.size(); ++x)
530 if ((x + 1) < vector.size())
536 case type_t::e_string : printf(
"String\t");
537 printf(
"%s",to_str(string_t(t)).c_str());
546 printf(
"%s\n",std::string(10,
'-').c_str());
551 for (std::size_t i = 0; i < variable_list.size(); ++i)
553 const symbol_t& symbol = variable_list[i];
555 switch (symbol.second)
558 static_cast<int>(i),symbol.first.c_str());
562 static_cast<int>(i),symbol.first.c_str());
566 static_cast<int>(i),symbol.first.c_str());
570 static_cast<int>(i),symbol.first.c_str());
574 : printf(
"[%02d] LocalVar %s\n",
575 static_cast<int>(i),symbol.first.c_str());
579 : printf(
"[%02d] LocalVec %s\n",
580 static_cast<int>(i),symbol.first.c_str());
584 : printf(
"[%02d] LocalStr %s\n",
585 static_cast<int>(i),symbol.first.c_str());
607 std::getline(std::cin,line);
613 else if (
"$end" == line)
616 program += (line +
"\n");
622 struct function_definition
667 std::vector<std::string> var_list;
686 var_list.swap(fd.var_list);
692 int bracket_stack = 0;
705 if (0 == --bracket_stack)
710 if (
lexer().finished())
717 const std::size_t size = body_end - body_begin + 1;
719 fd.body = func_def.substr(body_begin,size);
721 const std::size_t index = body_begin + size;
723 if (index < func_def.size())
724 func_def = func_def.substr(index,func_def.size() - index);
735 return parser.process(func_def,cf);
747 std::getline(std::cin,line);
751 else if (
"$end" == line)
754 input += (line +
"\n");
758 input.erase(input.end() - 1);
765 std::string func_def = func_def_header;
771 if (!func_def.empty() && (
'$' == func_def[0]))
772 func_def.erase(func_def.begin());
785 for (std::size_t i = 0; i < fd.var_list.size(); ++i)
787 vars += fd.var_list[i] + ((i < fd.var_list.size() - 1) ?
"," :
"");
792 for (std::size_t i = 0; i < fd.var_list.size(); ++i)
794 f.
var(fd.var_list[i]);
818 printf(
"Error - Failed to add function: %s\n",fd.name.c_str());
823 printf(
"Function[%02d]\n",
static_cast<int>(
func_def_list_.size()));
824 printf(
"Name: %s \n",fd.name.c_str() );
825 printf(
"Vars: (%s) \n",vars.c_str() );
826 printf(
"------------------------------------------------------\n");
832 printf(
"Error - Critical parsing error - partial parse occurred\n");
838 while (!func_def.empty());
840 if (!func_def.empty())
848 std::deque<std::pair<std::string,T> > variable_list;
851 std::size_t max_varname_length = 0;
853 for (std::size_t i = 0; i < variable_list.size(); ++i)
855 max_varname_length = std::max(max_varname_length,variable_list[i].first.size());
858 for (std::size_t i = 0; i < variable_list.size(); ++i)
862 if (max_varname_length > variable_list[i].first.size())
864 pad_length =
static_cast<int>(max_varname_length - variable_list[i].first.size());
867 printf(
"%02d %s%*.*s %25.10f\n",
868 static_cast<unsigned int>(i),
869 variable_list[i].first.c_str(),
872 std::string(max_varname_length,
' ').c_str(),
873 variable_list[i].second);
885 static const std::string whitespace(
" \n\r\t\b\v\f");
889 s.erase(0,s.find_first_not_of(whitespace));
893 std::size_t index = s.find_last_not_of(whitespace);
895 if (std::string::npos != index)
907 typename std::map<std::string,typename settings_store_t::settings_arithmetic_opr>::iterator itr;
912 .disable_arithmetic_operation(itr->second);
918 typename std::map<std::string,typename settings_store_t::settings_assignment_opr>::iterator itr;
923 .disable_assignment_operation(itr->second);
929 typename std::map<std::string,typename settings_store_t::settings_inequality_opr>::iterator itr;
934 .disable_inequality_operation(itr->second);
940 typename std::map<std::string,typename settings_store_t::settings_arithmetic_opr>::iterator itr;
945 .enable_arithmetic_operation(itr->second);
951 typename std::map<std::string,typename settings_store_t::settings_assignment_opr>::iterator itr;
956 .enable_assignment_operation(itr->second);
962 typename std::map<std::string,typename settings_store_t::settings_inequality_opr>::iterator itr;
967 .enable_inequality_operation(itr->second);
1012 std::map<std::string,typename settings_store_t::settings_arithmetic_opr>
arith_opr_;
1013 std::map<std::string,typename settings_store_t::settings_assignment_opr>
assign_opr_;
1014 std::map<std::string,typename settings_store_t::settings_inequality_opr>
inequality_opr_;
1016 #ifdef exprtk_enable_repl_variables
1028template <
typename T>
1035 for (
int i = 1; i < argc; ++i)
1044 std::string expression;
1047 std::getline(std::cin,expression);
1049 if (expression.empty())
1051 else if (
"exit" == expression)
1053 else if (
"quit" == expression)
1055 else if (
'$' == expression[0])
1058 processor.
process(expression);
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 & disable_commutative_check()
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
vector_access_rtc vector_access_rtc_
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_
bool disable_commutative_check_
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
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)
std::size_t count() const
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)
bool handle_runtime_violation(violation_context &context)