40 printf(
"%c",
static_cast<int>(v));
54 printf(
"%d",
static_cast<int>(v));
65 { ::srand(
static_cast<unsigned int>(time(NULL))); }
71 return T(::rand() / T(RAND_MAX + 1.0));
89 typedef typename parser_t::dependent_entity_collector::symbol_t
symbol_t;
102 #ifdef exprtk_enable_repl_variables
104 , s1_(
"abcdefghijk0123456789")
105 , s2_(
"012345678901234567890123456789")
107 , v1_({ 2, 2, 2, 2, 2})
108 , v2_({ 3, 3, 3, 3, 3, 3, 3})
109 , v3_({ 4, 4, 4, 4, 4, 4, 4, 4})
135 #ifdef exprtk_enable_repl_variables
240 compile_timer.
start();
259 printf(
"Error: %s\tExpression:%c%s\n",
261 ((std::string::npos != program.find_first_of(
'\n')) ?
'\n' :
' '),
262 ((program.size() < 200) ? program.c_str() :
"....."));
268 printf(
"Err No.: %02d Pos: %02d Type: [%14s] Msg: %s\n",
269 static_cast<unsigned int>(i),
279 printf(
"Error (line: %d column: %d)\n",
280 static_cast<unsigned int>(error.
line_no),
281 static_cast<unsigned int>(error.
column_no));
284 printf(
"%s^\n",std::string(error.
column_no,
'~').c_str());
291 compile_timer.
stop();
295 printf(
"\nCompile time: %6.3fms\n",compile_timer.
time() * 1000.0);
313 result = expression.
value();
317 timings[i] = timer.
time() * 1000.0;
322 printf(
"\nResult: %15.9f\n",result);
324 std::sort(timings.begin(),timings.end());
326 printf(
"\nRuns: %4d Time min: %7.3fms max: %7.3fms avg: %7.3fms tot: %7.3fms 90%%:%7.3fms\n",
330 std::accumulate(timings.begin(),timings.end(),0.0) / timings.size(),
331 total_timer.
time() * 1000.0,
332 timings[
static_cast<int>(timings.size() * 0.90)]);
340 const T result = expression.
value();
349 printf(
"\nResult: %15.9f\n",result);
353 printf(
"\nTotal time: %6.3fms\n",timer.
time() * 1000.0);
362 printf(
"------ Symbols ------\n");
364 printf(
"---------------------\n");
373 printf(
"---- Assignments ----\n");
375 printf(
"---------------------\n");
381 if (file_name.empty())
384 std::ifstream stream(file_name.c_str());
388 printf(
"ERROR: Failed to open file: %s\n\n",file_name.c_str());
393 (std::istreambuf_iterator<char>(stream)),
394 (std::istreambuf_iterator<char>())
404 if (
'$' != expression[0])
406 else if (
"$enable_cache" == expression)
408 else if (
"$disable_cache" == expression)
410 else if (
"$enable_symbol_dump" == expression)
412 else if (
"$disable_symbol_dump" == expression)
414 else if (
"$enable_assignment_dump" == expression)
416 else if (
"$disable_assignment_dump" == expression)
418 else if (
"$enable_timer" == expression)
420 else if (
"$enable_compile_timer" == expression)
422 else if (
"$disable_timer" == expression)
424 else if (
"$disable_compile_timer" == expression)
426 else if (
"$enable_usr" == expression)
428 else if (
"$disable_usr" == expression)
430 else if (
"$enable_local_vardef" == expression)
432 else if (
"$disable_local_vardef" == expression)
434 else if (
"$list_vars" == expression)
436 else if (
"$clear_functions" == expression)
438 else if ((0 == expression.find(
"$batch_run ")) && (expression.size() >= 12))
440 else if ((0 == expression.find(
"$load ")) && (expression.size() > 7))
442 else if ((0 == expression.find(
"$disable arithmetic ")) && (expression.size() >= 21))
444 else if ((0 == expression.find(
"$disable assignment ")) && (expression.size() >= 21))
446 else if ((0 == expression.find(
"$disable inequality ")) && (expression.size() >= 21))
448 else if ((0 == expression.find(
"$enable arithmetic ")) && (expression.size() >= 20))
450 else if ((0 == expression.find(
"$enable assignment ")) && (expression.size() >= 20))
452 else if ((0 == expression.find(
"$enable inequality ")) && (expression.size() >= 20))
454 else if (
"$begin" == expression)
456 else if (0 == expression.find(
"$function"))
459 printf(
"\nERROR - Invalid directive: %s\n",expression.c_str());
467 typedef typename results_context_t::type_store_t type_t;
468 typedef typename type_t::scalar_view scalar_t;
469 typedef typename type_t::vector_view vector_t;
470 typedef typename type_t::string_view string_t;
474 printf(
"%s\n",std::string(10,
'-').c_str());
475 printf(
"Return Results (#%d)\n",
static_cast<int>(results.
count()));
477 for (std::size_t i = 0; i < results.
count(); ++i)
479 printf(
"[%02d] ",
static_cast<int>(i));
481 type_t t = results[i];
485 case type_t::e_scalar : printf(
"Scalar\t");
489 case type_t::e_vector : {
493 for (std::size_t x = 0; x < vector.size(); ++x)
497 if ((x + 1) < vector.size())
503 case type_t::e_string : printf(
"String\t");
504 printf(
"%s",to_str(string_t(t)).c_str());
513 printf(
"%s\n",std::string(10,
'-').c_str());
518 for (std::size_t i = 0; i < variable_list.size(); ++i)
520 const symbol_t& symbol = variable_list[i];
522 switch (symbol.second)
525 static_cast<int>(i),symbol.first.c_str());
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 : printf(
"[%02d] LocalVar %s\n",
542 static_cast<int>(i),symbol.first.c_str());
546 : printf(
"[%02d] LocalVec %s\n",
547 static_cast<int>(i),symbol.first.c_str());
551 : printf(
"[%02d] LocalStr %s\n",
552 static_cast<int>(i),symbol.first.c_str());
574 std::getline(std::cin,line);
580 else if (
"$end" == line)
583 program += (line +
"\n");
589 struct function_definition
634 std::vector<std::string> var_list;
653 var_list.swap(fd.var_list);
659 int bracket_stack = 0;
672 if (0 == --bracket_stack)
677 if (
lexer().finished())
684 const std::size_t size = body_end - body_begin + 1;
686 fd.body = func_def.substr(body_begin,size);
688 const std::size_t index = body_begin + size;
690 if (index < func_def.size())
691 func_def = func_def.substr(index,func_def.size() - index);
702 return parser.process(func_def,cf);
714 std::getline(std::cin,line);
718 else if (
"$end" == line)
721 input += (line +
"\n");
725 input.erase(input.end() - 1);
732 std::string func_def = func_def_header;
738 if (!func_def.empty() && (
'$' == func_def[0]))
739 func_def.erase(func_def.begin());
752 for (std::size_t i = 0; i < fd.var_list.size(); ++i)
754 vars += fd.var_list[i] + ((i < fd.var_list.size() - 1) ?
"," :
"");
759 for (std::size_t i = 0; i < fd.var_list.size(); ++i)
761 f.
var(fd.var_list[i]);
785 printf(
"Error - Failed to add function: %s\n",fd.name.c_str());
790 printf(
"Function[%02d]\n",
static_cast<int>(
func_def_list_.size()));
791 printf(
"Name: %s \n",fd.name.c_str() );
792 printf(
"Vars: (%s) \n",vars.c_str() );
793 printf(
"------------------------------------------------------\n");
799 printf(
"Error - Critical parsing error - partial parse occurred\n");
805 while (!func_def.empty());
807 if (!func_def.empty())
815 std::deque<std::pair<std::string,T> > variable_list;
818 std::size_t max_varname_length = 0;
820 for (std::size_t i = 0; i < variable_list.size(); ++i)
822 max_varname_length = std::max(max_varname_length,variable_list[i].first.size());
825 for (std::size_t i = 0; i < variable_list.size(); ++i)
829 if (max_varname_length > variable_list[i].first.size())
831 pad_length =
static_cast<int>(max_varname_length - variable_list[i].first.size());
834 printf(
"%02d %s%*.*s %25.10f\n",
835 static_cast<unsigned int>(i),
836 variable_list[i].first.c_str(),
839 std::string(max_varname_length,
' ').c_str(),
840 variable_list[i].second);
852 static const std::string whitespace(
" \n\r\t\b\v\f");
856 s.erase(0,s.find_first_not_of(whitespace));
860 std::size_t index = s.find_last_not_of(whitespace);
862 if (std::string::npos != index)
874 typename std::map<std::string,typename settings_store_t::settings_arithmetic_opr>::iterator itr;
885 typename std::map<std::string,typename settings_store_t::settings_assignment_opr>::iterator itr;
896 typename std::map<std::string,typename settings_store_t::settings_inequality_opr>::iterator itr;
907 typename std::map<std::string,typename settings_store_t::settings_arithmetic_opr>::iterator itr;
918 typename std::map<std::string,typename settings_store_t::settings_assignment_opr>::iterator itr;
929 typename std::map<std::string,typename settings_store_t::settings_inequality_opr>::iterator itr;
977 std::map<std::string,typename settings_store_t::settings_arithmetic_opr>
arith_opr_;
978 std::map<std::string,typename settings_store_t::settings_assignment_opr>
assign_opr_;
979 std::map<std::string,typename settings_store_t::settings_inequality_opr>
inequality_opr_;
981 #ifdef exprtk_enable_repl_variables
994void repl(
int argc,
char* argv[])
1000 for (
int i = 1; i < argc; ++i)
1009 std::string expression;
1012 std::getline(std::cin,expression);
1014 if (expression.empty())
1016 else if (
"exit" == expression)
1018 else if (
"quit" == expression)
1020 else if (
'$' == expression[0])
1023 processor.
process(expression);
1030 repl<double>(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)