C++ Mathematical Expression Toolkit (ExprTk) release
Loading...
Searching...
No Matches
Classes | Public Types | Public Member Functions | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes | Friends | List of all members
exprtk::parser< T > Class Template Reference

#include <exprtk.hpp>

Inheritance diagram for exprtk::parser< T >:
[legend]
Collaboration diagram for exprtk::parser< T >:
[legend]

Classes

struct  closed_range_policy
 
class  dependent_entity_collector
 
class  expression_generator
 
struct  halfopen_range_policy
 
class  interval_container_t
 
struct  parse_special_function_impl
 
struct  parser_state
 
struct  scope_element
 
class  scope_element_manager
 
class  scope_handler
 
struct  scoped_bool_negator
 
struct  scoped_bool_or_restorer
 
struct  scoped_delete
 
struct  scoped_deq_delete
 
struct  scoped_expression_delete
 
struct  scoped_inc_dec
 
struct  scoped_vec_delete
 
class  settings_store
 
class  stack_limit_handler
 
struct  state_t
 
struct  symtab_store
 
class  type_checker
 
struct  unknown_symbol_resolver
 

Public Types

enum  collect_type { e_ct_none = 0 , e_ct_variables = 1 , e_ct_functions = 2 , e_ct_assignments = 4 }
 
enum  symbol_type {
  e_st_unknown = 0 , e_st_variable = 1 , e_st_vector = 2 , e_st_vecelem = 3 ,
  e_st_string = 4 , e_st_function = 5 , e_st_local_variable = 6 , e_st_local_vector = 7 ,
  e_st_local_string = 8
}
 
typedef settings_store settings_t
 
- Public Types inherited from exprtk::lexer::parser_helper
enum  token_advance_mode { e_hold = 0 , e_advance = 1 }
 
typedef token token_t
 
typedef generator generator_t
 

Public Member Functions

 parser (const settings_t &settings=settings_t())
 
 ~parser ()
 
void init_precompilation ()
 
bool compile (const std::string &expression_string, expression< T > &expr)
 
expression_t compile (const std::string &expression_string, symbol_table_t &symtab)
 
void process_lexer_errors ()
 
bool run_assemblies ()
 
settings_storesettings ()
 
parser_error::type get_error (const std::size_t &index) const
 
std::string error () const
 
std::size_t error_count () const
 
dependent_entity_collectordec ()
 
bool replace_symbol (const std::string &old_symbol, const std::string &new_symbol)
 
bool remove_replace_symbol (const std::string &symbol)
 
void enable_unknown_symbol_resolver (unknown_symbol_resolver *usr=reinterpret_cast< unknown_symbol_resolver * >(0))
 
void enable_unknown_symbol_resolver (unknown_symbol_resolver &usr)
 
void disable_unknown_symbol_resolver ()
 
void register_loop_runtime_check (loop_runtime_check &lrtchk)
 
void register_vector_access_runtime_check (vector_access_runtime_check &vartchk)
 
void register_compilation_timeout_check (compilation_check &compchk)
 
void register_assert_check (assert_check &assrt_chck)
 
void clear_loop_runtime_check ()
 
void clear_vector_access_runtime_check ()
 
void clear_compilation_timeout_check ()
 
void clear_assert_check ()
 
- Public Member Functions inherited from exprtk::lexer::parser_helper
bool init (const std::string &str)
 
generator_tlexer ()
 
const generator_tlexer () const
 
void store_token ()
 
void restore_token ()
 
void next_token ()
 
const token_tcurrent_token () const
 
const token_tpeek_next_token ()
 
void advance_token (const token_advance_mode mode)
 
bool token_is (const token_t::token_type &ttype, const token_advance_mode mode=e_advance)
 
bool token_is (const token_t::token_type &ttype, const std::string &value, const token_advance_mode mode=e_advance)
 
bool token_is (const std::string &value, const token_advance_mode mode=e_advance)
 
bool token_is_arithmetic_opr (const token_advance_mode mode=e_advance)
 
bool token_is_ineq_opr (const token_advance_mode mode=e_advance)
 
bool token_is_left_bracket (const token_advance_mode mode=e_advance)
 
bool token_is_right_bracket (const token_advance_mode mode=e_advance)
 
bool token_is_loop (const token_advance_mode mode=e_advance)
 
bool peek_token_is (const token_t::token_type &ttype)
 
bool peek_token_is (const std::string &s)
 

Private Types

enum  precedence_level {
  e_level00 , e_level01 , e_level02 , e_level03 ,
  e_level04 , e_level05 , e_level06 , e_level07 ,
  e_level08 , e_level09 , e_level10 , e_level11 ,
  e_level12 , e_level13 , e_level14
}
 
typedef const T & cref_t
 
typedef const T const_t
 
typedef ifunction< T > F
 
typedef ivararg_function< T > VAF
 
typedef igeneric_function< T > GF
 
typedef ifunction< T > ifunction_t
 
typedef ivararg_function< T > ivararg_function_t
 
typedef igeneric_function< T > igeneric_function_t
 
typedef details::expression_node< T > expression_node_t
 
typedef details::literal_node< T > literal_node_t
 
typedef details::unary_node< T > unary_node_t
 
typedef details::binary_node< T > binary_node_t
 
typedef details::trinary_node< T > trinary_node_t
 
typedef details::quaternary_node< T > quaternary_node_t
 
typedef details::conditional_node< T > conditional_node_t
 
typedef details::cons_conditional_node< T > cons_conditional_node_t
 
typedef details::while_loop_node< T > while_loop_node_t
 
typedef details::repeat_until_loop_node< T > repeat_until_loop_node_t
 
typedef details::for_loop_node< T > for_loop_node_t
 
typedef details::while_loop_rtc_node< T > while_loop_rtc_node_t
 
typedef details::repeat_until_loop_rtc_node< T > repeat_until_loop_rtc_node_t
 
typedef details::for_loop_rtc_node< T > for_loop_rtc_node_t
 
typedef details::while_loop_bc_node< T > while_loop_bc_node_t
 
typedef details::repeat_until_loop_bc_node< T > repeat_until_loop_bc_node_t
 
typedef details::for_loop_bc_node< T > for_loop_bc_node_t
 
typedef details::while_loop_bc_rtc_node< T > while_loop_bc_rtc_node_t
 
typedef details::repeat_until_loop_bc_rtc_node< T > repeat_until_loop_bc_rtc_node_t
 
typedef details::for_loop_bc_rtc_node< T > for_loop_bc_rtc_node_t
 
typedef details::switch_node< T > switch_node_t
 
typedef details::variable_node< T > variable_node_t
 
typedef details::vector_elem_node< T > vector_elem_node_t
 
typedef details::vector_celem_node< T > vector_celem_node_t
 
typedef details::vector_elem_rtc_node< T > vector_elem_rtc_node_t
 
typedef details::vector_celem_rtc_node< T > vector_celem_rtc_node_t
 
typedef details::rebasevector_elem_node< T > rebasevector_elem_node_t
 
typedef details::rebasevector_celem_node< T > rebasevector_celem_node_t
 
typedef details::rebasevector_elem_rtc_node< T > rebasevector_elem_rtc_node_t
 
typedef details::rebasevector_celem_rtc_node< T > rebasevector_celem_rtc_node_t
 
typedef details::vector_node< T > vector_node_t
 
typedef details::vector_size_node< T > vector_size_node_t
 
typedef details::range_pack< T > range_t
 
typedef details::stringvar_node< T > stringvar_node_t
 
typedef details::string_literal_node< T > string_literal_node_t
 
typedef details::string_range_node< T > string_range_node_t
 
typedef details::const_string_range_node< T > const_string_range_node_t
 
typedef details::generic_string_range_node< T > generic_string_range_node_t
 
typedef details::string_concat_node< T > string_concat_node_t
 
typedef details::assignment_string_node< T > assignment_string_node_t
 
typedef details::assignment_string_range_node< T > assignment_string_range_node_t
 
typedef details::conditional_string_node< T > conditional_string_node_t
 
typedef details::cons_conditional_str_node< T > cons_conditional_str_node_t
 
typedef details::assignment_node< T > assignment_node_t
 
typedef details::assignment_vec_elem_node< T > assignment_vec_elem_node_t
 
typedef details::assignment_vec_elem_rtc_node< T > assignment_vec_elem_rtc_node_t
 
typedef details::assignment_rebasevec_elem_node< T > assignment_rebasevec_elem_node_t
 
typedef details::assignment_rebasevec_elem_rtc_node< T > assignment_rebasevec_elem_rtc_node_t
 
typedef details::assignment_rebasevec_celem_node< T > assignment_rebasevec_celem_node_t
 
typedef details::assignment_vec_node< T > assignment_vec_node_t
 
typedef details::assignment_vecvec_node< T > assignment_vecvec_node_t
 
typedef details::conditional_vector_node< T > conditional_vector_node_t
 
typedef details::scand_node< T > scand_node_t
 
typedef details::scor_node< T > scor_node_t
 
typedef lexer::token token_t
 
typedef expression_node_texpression_node_ptr
 
typedef expression< T > expression_t
 
typedef symbol_table< T > symbol_table_t
 
typedef expression< T >::symtab_list_t symbol_table_list_t
 
typedef details::vector_holder< T > vector_holder_t
 
typedef vector_holder_tvector_holder_ptr
 
typedef details::functor_t< T > functor_t
 
typedef functor_t::qfunc_t quaternary_functor_t
 
typedef functor_t::tfunc_t trinary_functor_t
 
typedef functor_t::bfunc_t binary_functor_t
 
typedef functor_t::ufunc_t unary_functor_t
 
typedef details::operator_type operator_t
 
typedef std::map< operator_t, unary_functor_tunary_op_map_t
 
typedef std::map< operator_t, binary_functor_tbinary_op_map_t
 
typedef std::map< operator_t, trinary_functor_ttrinary_op_map_t
 
typedef std::map< std::string, std::pair< trinary_functor_t,operator_t> > sf3_map_t
 
typedef std::map< std::string, std::pair< quaternary_functor_t, operator_t> > sf4_map_t
 
typedef std::map< binary_functor_t, operator_tinv_binary_op_map_t
 
typedef std::multimap< std::string, details::base_operation_t, details::ilesscomparebase_ops_map_t
 
typedef std::set< std::string, details::ilesscomparedisabled_func_set_t
 
typedef details::T0oT1_define< T, cref_t, cref_tvov_t
 
typedef details::T0oT1_define< T, const_t, cref_tcov_t
 
typedef details::T0oT1_define< T, cref_t, const_tvoc_t
 
typedef details::T0oT1oT2_define< T, cref_t, cref_t, cref_tvovov_t
 
typedef details::T0oT1oT2_define< T, cref_t, cref_t, const_tvovoc_t
 
typedef details::T0oT1oT2_define< T, cref_t, const_t, cref_tvocov_t
 
typedef details::T0oT1oT2_define< T, const_t, cref_t, cref_tcovov_t
 
typedef details::T0oT1oT2_define< T, const_t, cref_t, const_tcovoc_t
 
typedef details::T0oT1oT2_define< T, const_t, const_t, cref_tcocov_t
 
typedef details::T0oT1oT2_define< T, cref_t, const_t, const_tvococ_t
 
typedef details::T0oT1oT2oT3_define< T, cref_t, cref_t, cref_t, cref_tvovovov_t
 
typedef details::T0oT1oT2oT3_define< T, cref_t, cref_t, cref_t, const_tvovovoc_t
 
typedef details::T0oT1oT2oT3_define< T, cref_t, cref_t, const_t, cref_tvovocov_t
 
typedef details::T0oT1oT2oT3_define< T, cref_t, const_t, cref_t, cref_tvocovov_t
 
typedef details::T0oT1oT2oT3_define< T, const_t, cref_t, cref_t, cref_tcovovov_t
 
typedef details::T0oT1oT2oT3_define< T, const_t, cref_t, const_t, cref_tcovocov_t
 
typedef details::T0oT1oT2oT3_define< T, cref_t, const_t, cref_t, const_tvocovoc_t
 
typedef details::T0oT1oT2oT3_define< T, const_t, cref_t, cref_t, const_tcovovoc_t
 
typedef details::T0oT1oT2oT3_define< T, cref_t, const_t, const_t, cref_tvococov_t
 
typedef results_context< T > results_context_t
 
typedef parser_helper prsrhlpr_t
 
typedef interval_container_t< constvoid * >::interval_t interval_t
 
typedef interval_container_t< const void * > immutable_memory_map_t
 
typedef std::map< interval_t, token_timmutable_symtok_map_t
 

Private Member Functions

bool valid_base_operation (const std::string &symbol) const
 
bool valid_vararg_operation (const std::string &symbol) const
 
bool is_invalid_logic_operation (const details::operator_type operation) const
 
bool is_invalid_arithmetic_operation (const details::operator_type operation) const
 
bool is_invalid_assignment_operation (const details::operator_type operation) const
 
bool is_invalid_inequality_operation (const details::operator_type operation) const
 
expression_node_ptr parse_corpus ()
 
std::string construct_subexpr (lexer::token &begin_token, lexer::token &end_token, const bool cleanup_whitespace=true)
 
void push_current_state (const state_t current_state)
 
void pop_current_state ()
 
state_t current_state () const
 
bool halt_compilation_check ()
 
expression_node_ptr parse_expression (precedence_level precedence=e_level00)
 
bool simplify_unary_negation_branch (expression_node_ptr &node)
 
expression_node_ptr parse_function_invocation (ifunction< T > *function, const std::string &function_name)
 
template<std::size_t NumberofParameters>
expression_node_ptr parse_function_call (ifunction< T > *function, const std::string &function_name)
 
expression_node_ptr parse_function_call_0 (ifunction< T > *function, const std::string &function_name)
 
template<std::size_t MaxNumberofParameters>
std::size_t parse_base_function_call (expression_node_ptr(&param_list)[MaxNumberofParameters], const std::string &function_name="")
 
expression_node_ptr parse_base_operation ()
 
expression_node_ptr parse_conditional_statement_01 (expression_node_ptr condition)
 
expression_node_ptr parse_conditional_statement_02 (expression_node_ptr condition)
 
expression_node_ptr parse_conditional_statement ()
 
expression_node_ptr parse_ternary_conditional_statement (expression_node_ptr condition)
 
expression_node_ptr parse_not_statement ()
 
void handle_brkcnt_scope_exit ()
 
expression_node_ptr parse_while_loop ()
 
expression_node_ptr parse_repeat_until_loop ()
 
expression_node_ptr parse_for_loop ()
 
expression_node_ptr parse_switch_statement ()
 
expression_node_ptr parse_multi_switch_statement ()
 
expression_node_ptr parse_vararg_function ()
 
expression_node_ptr parse_string_range_statement (expression_node_ptr &expression)
 
bool parse_pending_string_rangesize (expression_node_ptr &expression)
 
void parse_pending_vector_index_operator (expression_node_ptr &expression)
 
template<typename Allocator1 , typename Allocator2 , template< typename, typename > class Sequence>
expression_node_ptr simplify (Sequence< expression_node_ptr, Allocator1 > &expression_list, Sequence< bool, Allocator2 > &side_effect_list, const bool specialise_on_final_type=false)
 
expression_node_ptr parse_multi_sequence (const std::string &source="", const bool enforce_crlbrackets=false)
 
bool parse_range (range_t &rp, const bool skip_lsqr=false)
 
void lodge_symbol (const std::string &symbol, const symbol_type st)
 
expression_node_ptr parse_string ()
 
expression_node_ptr parse_const_string ()
 
expression_node_ptr parse_vector_index (const std::string &vector_name="")
 
expression_node_ptr parse_vector ()
 
expression_node_ptr synthesize_vector_element (const std::string &vector_name, vector_holder_ptr vec, expression_node_ptr vec_node, expression_node_ptr index_expr)
 
expression_node_ptr parse_vararg_function_call (ivararg_function< T > *vararg_function, const std::string &vararg_function_name)
 
expression_node_ptr parse_generic_function_call (igeneric_function< T > *function, const std::string &function_name)
 
bool parse_igeneric_function_params (std::string &param_type_list, std::vector< expression_node_ptr > &arg_list, const std::string &function_name, igeneric_function< T > *function, const type_checker &tc)
 
expression_node_ptr parse_string_function_call (igeneric_function< T > *function, const std::string &function_name)
 
expression_node_ptr parse_overload_function_call (igeneric_function< T > *function, const std::string &function_name)
 
expression_node_ptr parse_special_function ()
 
expression_node_ptr parse_null_statement ()
 
expression_node_ptr parse_break_statement ()
 
expression_node_ptr parse_continue_statement ()
 
expression_node_ptr parse_define_vector_statement (const std::string &vec_name)
 
expression_node_ptr parse_define_string_statement (const std::string &str_name, expression_node_ptr initialisation_expression)
 
bool local_variable_is_shadowed (const std::string &symbol)
 
expression_node_ptr parse_define_var_statement ()
 
expression_node_ptr parse_define_constvar_statement ()
 
expression_node_ptr parse_uninitialised_var_statement (const std::string &var_name)
 
expression_node_ptr parse_swap_statement ()
 
expression_node_ptr parse_return_statement ()
 
expression_node_ptr parse_assert_statement ()
 
bool post_variable_process (const std::string &symbol)
 
bool post_bracket_process (const typename token_t::token_type &token, expression_node_ptr &branch)
 
interval_t make_memory_range (const T &t)
 
interval_t make_memory_range (const T *begin, const std::size_t size)
 
interval_t make_memory_range (details::char_cptr begin, const std::size_t size)
 
void lodge_immutable_symbol (const lexer::token &token, const interval_t interval)
 
expression_node_ptr parse_symtab_symbol ()
 
expression_node_ptr parse_symbol ()
 
expression_node_ptr parse_branch (precedence_level precedence=e_level00)
 
void set_error (const parser_error::type &error_type)
 
void remove_last_error ()
 
void set_synthesis_error (const std::string &synthesis_error_message)
 
void register_local_vars (expression< T > &e)
 
void register_return_results (expression< T > &e)
 
void load_unary_operations_map (unary_op_map_t &m)
 
void load_binary_operations_map (binary_op_map_t &m)
 
void load_inv_binary_operations_map (inv_binary_op_map_t &m)
 
void load_sf3_map (sf3_map_t &sf3_map)
 
void load_sf4_map (sf4_map_t &sf4_map)
 
results_context_tresults_ctx ()
 
void return_cleanup ()
 
 parser (const parser< T > &)
 
parser< T > & operator= (const parser< T > &)
 

Static Private Member Functions

static expression_node_ptr error_node ()
 

Private Attributes

settings_store settings_
 
expression_generator< T > expression_generator_
 
details::node_allocator node_allocator_
 
symtab_store symtab_store_
 
dependent_entity_collector dec_
 
std::deque< parser_error::typeerror_list_
 
std::deque< bool > brkcnt_list_
 
parser_state state_
 
bool resolve_unknown_symbol_
 
results_context_tresults_context_
 
unknown_symbol_resolverunknown_symbol_resolver_
 
unknown_symbol_resolver default_usr_
 
base_ops_map_t base_ops_map_
 
unary_op_map_t unary_op_map_
 
binary_op_map_t binary_op_map_
 
inv_binary_op_map_t inv_binary_op_map_
 
sf3_map_t sf3_map_
 
sf4_map_t sf4_map_
 
std::string synthesis_error_
 
scope_element_manager sem_
 
std::vector< state_tcurrent_state_stack_
 
immutable_memory_map_t immutable_memory_map_
 
immutable_symtok_map_t immutable_symtok_map_
 
lexer::helper::helper_assembly helper_assembly_
 
lexer::helper::commutative_inserter commutative_inserter_
 
lexer::helper::operator_joiner operator_joiner_2_
 
lexer::helper::operator_joiner operator_joiner_3_
 
lexer::helper::symbol_replacer symbol_replacer_
 
lexer::helper::bracket_checker bracket_checker_
 
lexer::helper::numeric_checker< T > numeric_checker_
 
lexer::helper::sequence_validator sequence_validator_
 
lexer::helper::sequence_validator_3tokens sequence_validator_3tkns_
 
loop_runtime_check_ptr loop_runtime_check_
 
vector_access_runtime_check_ptr vector_access_runtime_check_
 
compilation_check_ptr compilation_check_ptr_
 
assert_check_ptr assert_check_
 
std::set< std::string > assert_ids_
 

Static Private Attributes

static const precedence_level default_precedence = e_level00
 

Friends

template<typename ParserType >
void details::disable_type_checking (ParserType &p)
 

Detailed Description

template<typename T>
class exprtk::parser< T >

Definition at line 22175 of file exprtk.hpp.

Member Typedef Documentation

◆ assignment_node_t

template<typename T >
typedef details::assignment_node<T> exprtk::parser< T >::assignment_node_t
private

Definition at line 22241 of file exprtk.hpp.

◆ assignment_rebasevec_celem_node_t

template<typename T >
typedef details::assignment_rebasevec_celem_node<T> exprtk::parser< T >::assignment_rebasevec_celem_node_t
private

Definition at line 22246 of file exprtk.hpp.

◆ assignment_rebasevec_elem_node_t

template<typename T >
typedef details::assignment_rebasevec_elem_node<T> exprtk::parser< T >::assignment_rebasevec_elem_node_t
private

Definition at line 22244 of file exprtk.hpp.

◆ assignment_rebasevec_elem_rtc_node_t

template<typename T >
typedef details::assignment_rebasevec_elem_rtc_node<T> exprtk::parser< T >::assignment_rebasevec_elem_rtc_node_t
private

Definition at line 22245 of file exprtk.hpp.

◆ assignment_string_node_t

template<typename T >
typedef details::assignment_string_node<T> exprtk::parser< T >::assignment_string_node_t
private

Definition at line 22236 of file exprtk.hpp.

◆ assignment_string_range_node_t

template<typename T >
typedef details::assignment_string_range_node<T> exprtk::parser< T >::assignment_string_range_node_t
private

Definition at line 22237 of file exprtk.hpp.

◆ assignment_vec_elem_node_t

template<typename T >
typedef details::assignment_vec_elem_node<T> exprtk::parser< T >::assignment_vec_elem_node_t
private

Definition at line 22242 of file exprtk.hpp.

◆ assignment_vec_elem_rtc_node_t

template<typename T >
typedef details::assignment_vec_elem_rtc_node<T> exprtk::parser< T >::assignment_vec_elem_rtc_node_t
private

Definition at line 22243 of file exprtk.hpp.

◆ assignment_vec_node_t

template<typename T >
typedef details::assignment_vec_node<T> exprtk::parser< T >::assignment_vec_node_t
private

Definition at line 22247 of file exprtk.hpp.

◆ assignment_vecvec_node_t

template<typename T >
typedef details::assignment_vecvec_node<T> exprtk::parser< T >::assignment_vecvec_node_t
private

Definition at line 22248 of file exprtk.hpp.

◆ base_ops_map_t

template<typename T >
typedef std::multimap<std::string,details::base_operation_t,details::ilesscompare> exprtk::parser< T >::base_ops_map_t
private

Definition at line 22276 of file exprtk.hpp.

◆ binary_functor_t

template<typename T >
typedef functor_t::bfunc_t exprtk::parser< T >::binary_functor_t
private

Definition at line 22263 of file exprtk.hpp.

◆ binary_node_t

template<typename T >
typedef details::binary_node<T> exprtk::parser< T >::binary_node_t
private

Definition at line 22197 of file exprtk.hpp.

◆ binary_op_map_t

template<typename T >
typedef std::map<operator_t, binary_functor_t > exprtk::parser< T >::binary_op_map_t
private

Definition at line 22269 of file exprtk.hpp.

◆ cocov_t

template<typename T >
typedef details::T0oT1oT2_define<T, const_t, const_t, cref_t > exprtk::parser< T >::cocov_t
private

Definition at line 22288 of file exprtk.hpp.

◆ conditional_node_t

template<typename T >
typedef details::conditional_node<T> exprtk::parser< T >::conditional_node_t
private

Definition at line 22200 of file exprtk.hpp.

◆ conditional_string_node_t

template<typename T >
typedef details::conditional_string_node<T> exprtk::parser< T >::conditional_string_node_t
private

Definition at line 22238 of file exprtk.hpp.

◆ conditional_vector_node_t

template<typename T >
typedef details::conditional_vector_node<T> exprtk::parser< T >::conditional_vector_node_t
private

Definition at line 22249 of file exprtk.hpp.

◆ cons_conditional_node_t

template<typename T >
typedef details::cons_conditional_node<T> exprtk::parser< T >::cons_conditional_node_t
private

Definition at line 22201 of file exprtk.hpp.

◆ cons_conditional_str_node_t

template<typename T >
typedef details::cons_conditional_str_node<T> exprtk::parser< T >::cons_conditional_str_node_t
private

Definition at line 22239 of file exprtk.hpp.

◆ const_string_range_node_t

template<typename T >
typedef details::const_string_range_node<T> exprtk::parser< T >::const_string_range_node_t
private

Definition at line 22233 of file exprtk.hpp.

◆ const_t

template<typename T >
typedef const T exprtk::parser< T >::const_t
private

Definition at line 22187 of file exprtk.hpp.

◆ cov_t

template<typename T >
typedef details::T0oT1_define<T, const_t, cref_t > exprtk::parser< T >::cov_t
private

Definition at line 22280 of file exprtk.hpp.

◆ covoc_t

template<typename T >
typedef details::T0oT1oT2_define<T, const_t, cref_t , const_t> exprtk::parser< T >::covoc_t
private

Definition at line 22287 of file exprtk.hpp.

◆ covocov_t

template<typename T >
typedef details::T0oT1oT2oT3_define<T, const_t, cref_t , const_t, cref_t > exprtk::parser< T >::covocov_t
private

Definition at line 22297 of file exprtk.hpp.

◆ covov_t

template<typename T >
typedef details::T0oT1oT2_define<T, const_t, cref_t , cref_t > exprtk::parser< T >::covov_t
private

Definition at line 22286 of file exprtk.hpp.

◆ covovoc_t

template<typename T >
typedef details::T0oT1oT2oT3_define<T, const_t, cref_t , cref_t , const_t> exprtk::parser< T >::covovoc_t
private

Definition at line 22299 of file exprtk.hpp.

◆ covovov_t

template<typename T >
typedef details::T0oT1oT2oT3_define<T, const_t, cref_t , cref_t , cref_t > exprtk::parser< T >::covovov_t
private

Definition at line 22295 of file exprtk.hpp.

◆ cref_t

template<typename T >
typedef const T& exprtk::parser< T >::cref_t
private

Definition at line 22186 of file exprtk.hpp.

◆ disabled_func_set_t

template<typename T >
typedef std::set<std::string,details::ilesscompare> exprtk::parser< T >::disabled_func_set_t
private

Definition at line 22277 of file exprtk.hpp.

◆ expression_node_ptr

template<typename T >
typedef expression_node_t* exprtk::parser< T >::expression_node_ptr
private

Definition at line 22253 of file exprtk.hpp.

◆ expression_node_t

template<typename T >
typedef details::expression_node<T> exprtk::parser< T >::expression_node_t
private

Definition at line 22194 of file exprtk.hpp.

◆ expression_t

template<typename T >
typedef expression<T> exprtk::parser< T >::expression_t
private

Definition at line 22254 of file exprtk.hpp.

◆ F

template<typename T >
typedef ifunction<T> exprtk::parser< T >::F
private

Definition at line 22188 of file exprtk.hpp.

◆ for_loop_bc_node_t

template<typename T >
typedef details::for_loop_bc_node<T> exprtk::parser< T >::for_loop_bc_node_t
private

Definition at line 22211 of file exprtk.hpp.

◆ for_loop_bc_rtc_node_t

template<typename T >
typedef details::for_loop_bc_rtc_node<T> exprtk::parser< T >::for_loop_bc_rtc_node_t
private

Definition at line 22214 of file exprtk.hpp.

◆ for_loop_node_t

template<typename T >
typedef details::for_loop_node<T> exprtk::parser< T >::for_loop_node_t
private

Definition at line 22204 of file exprtk.hpp.

◆ for_loop_rtc_node_t

template<typename T >
typedef details::for_loop_rtc_node<T> exprtk::parser< T >::for_loop_rtc_node_t
private

Definition at line 22207 of file exprtk.hpp.

◆ functor_t

template<typename T >
typedef details::functor_t<T> exprtk::parser< T >::functor_t
private

Definition at line 22260 of file exprtk.hpp.

◆ generic_string_range_node_t

template<typename T >
typedef details::generic_string_range_node<T> exprtk::parser< T >::generic_string_range_node_t
private

Definition at line 22234 of file exprtk.hpp.

◆ GF

template<typename T >
typedef igeneric_function<T> exprtk::parser< T >::GF
private

Definition at line 22190 of file exprtk.hpp.

◆ ifunction_t

template<typename T >
typedef ifunction<T> exprtk::parser< T >::ifunction_t
private

Definition at line 22191 of file exprtk.hpp.

◆ igeneric_function_t

template<typename T >
typedef igeneric_function<T> exprtk::parser< T >::igeneric_function_t
private

Definition at line 22193 of file exprtk.hpp.

◆ immutable_memory_map_t

template<typename T >
typedef interval_container_t<const void*> exprtk::parser< T >::immutable_memory_map_t
private

Definition at line 30616 of file exprtk.hpp.

◆ immutable_symtok_map_t

template<typename T >
typedef std::map<interval_t,token_t> exprtk::parser< T >::immutable_symtok_map_t
private

Definition at line 30617 of file exprtk.hpp.

◆ interval_t

template<typename T >
typedef interval_container_t<constvoid*>::interval_t exprtk::parser< T >::interval_t
private

Definition at line 30615 of file exprtk.hpp.

◆ inv_binary_op_map_t

template<typename T >
typedef std::map<binary_functor_t,operator_t> exprtk::parser< T >::inv_binary_op_map_t
private

Definition at line 22275 of file exprtk.hpp.

◆ ivararg_function_t

template<typename T >
typedef ivararg_function<T> exprtk::parser< T >::ivararg_function_t
private

Definition at line 22192 of file exprtk.hpp.

◆ literal_node_t

template<typename T >
typedef details::literal_node<T> exprtk::parser< T >::literal_node_t
private

Definition at line 22195 of file exprtk.hpp.

◆ operator_t

template<typename T >
typedef details::operator_type exprtk::parser< T >::operator_t
private

Definition at line 22266 of file exprtk.hpp.

◆ prsrhlpr_t

template<typename T >
typedef parser_helper exprtk::parser< T >::prsrhlpr_t
private

Definition at line 22304 of file exprtk.hpp.

◆ quaternary_functor_t

template<typename T >
typedef functor_t::qfunc_t exprtk::parser< T >::quaternary_functor_t
private

Definition at line 22261 of file exprtk.hpp.

◆ quaternary_node_t

template<typename T >
typedef details::quaternary_node<T> exprtk::parser< T >::quaternary_node_t
private

Definition at line 22199 of file exprtk.hpp.

◆ range_t

template<typename T >
typedef details::range_pack<T> exprtk::parser< T >::range_t
private

Definition at line 22228 of file exprtk.hpp.

◆ rebasevector_celem_node_t

template<typename T >
typedef details::rebasevector_celem_node<T> exprtk::parser< T >::rebasevector_celem_node_t
private

Definition at line 22223 of file exprtk.hpp.

◆ rebasevector_celem_rtc_node_t

template<typename T >
typedef details::rebasevector_celem_rtc_node<T> exprtk::parser< T >::rebasevector_celem_rtc_node_t
private

Definition at line 22225 of file exprtk.hpp.

◆ rebasevector_elem_node_t

template<typename T >
typedef details::rebasevector_elem_node<T> exprtk::parser< T >::rebasevector_elem_node_t
private

Definition at line 22222 of file exprtk.hpp.

◆ rebasevector_elem_rtc_node_t

template<typename T >
typedef details::rebasevector_elem_rtc_node<T> exprtk::parser< T >::rebasevector_elem_rtc_node_t
private

Definition at line 22224 of file exprtk.hpp.

◆ repeat_until_loop_bc_node_t

template<typename T >
typedef details::repeat_until_loop_bc_node<T> exprtk::parser< T >::repeat_until_loop_bc_node_t
private

Definition at line 22210 of file exprtk.hpp.

◆ repeat_until_loop_bc_rtc_node_t

template<typename T >
typedef details::repeat_until_loop_bc_rtc_node<T> exprtk::parser< T >::repeat_until_loop_bc_rtc_node_t
private

Definition at line 22213 of file exprtk.hpp.

◆ repeat_until_loop_node_t

template<typename T >
typedef details::repeat_until_loop_node<T> exprtk::parser< T >::repeat_until_loop_node_t
private

Definition at line 22203 of file exprtk.hpp.

◆ repeat_until_loop_rtc_node_t

template<typename T >
typedef details::repeat_until_loop_rtc_node<T> exprtk::parser< T >::repeat_until_loop_rtc_node_t
private

Definition at line 22206 of file exprtk.hpp.

◆ results_context_t

template<typename T >
typedef results_context<T> exprtk::parser< T >::results_context_t
private

Definition at line 22302 of file exprtk.hpp.

◆ scand_node_t

template<typename T >
typedef details::scand_node<T> exprtk::parser< T >::scand_node_t
private

Definition at line 22250 of file exprtk.hpp.

◆ scor_node_t

template<typename T >
typedef details::scor_node<T> exprtk::parser< T >::scor_node_t
private

Definition at line 22251 of file exprtk.hpp.

◆ settings_t

template<typename T >
typedef settings_store exprtk::parser< T >::settings_t

Definition at line 24335 of file exprtk.hpp.

◆ sf3_map_t

template<typename T >
typedef std::map<std::string,std::pair<trinary_functor_t ,operator_t> > exprtk::parser< T >::sf3_map_t
private

Definition at line 22272 of file exprtk.hpp.

◆ sf4_map_t

template<typename T >
typedef std::map<std::string,std::pair<quaternary_functor_t,operator_t> > exprtk::parser< T >::sf4_map_t
private

Definition at line 22273 of file exprtk.hpp.

◆ string_concat_node_t

template<typename T >
typedef details::string_concat_node<T> exprtk::parser< T >::string_concat_node_t
private

Definition at line 22235 of file exprtk.hpp.

◆ string_literal_node_t

template<typename T >
typedef details::string_literal_node<T> exprtk::parser< T >::string_literal_node_t
private

Definition at line 22231 of file exprtk.hpp.

◆ string_range_node_t

template<typename T >
typedef details::string_range_node<T> exprtk::parser< T >::string_range_node_t
private

Definition at line 22232 of file exprtk.hpp.

◆ stringvar_node_t

template<typename T >
typedef details::stringvar_node<T> exprtk::parser< T >::stringvar_node_t
private

Definition at line 22230 of file exprtk.hpp.

◆ switch_node_t

template<typename T >
typedef details::switch_node<T> exprtk::parser< T >::switch_node_t
private

Definition at line 22216 of file exprtk.hpp.

◆ symbol_table_list_t

template<typename T >
typedef expression<T>::symtab_list_t exprtk::parser< T >::symbol_table_list_t
private

Definition at line 22256 of file exprtk.hpp.

◆ symbol_table_t

template<typename T >
typedef symbol_table<T> exprtk::parser< T >::symbol_table_t
private

Definition at line 22255 of file exprtk.hpp.

◆ token_t

template<typename T >
typedef lexer::token exprtk::parser< T >::token_t
private

Definition at line 22252 of file exprtk.hpp.

◆ trinary_functor_t

template<typename T >
typedef functor_t::tfunc_t exprtk::parser< T >::trinary_functor_t
private

Definition at line 22262 of file exprtk.hpp.

◆ trinary_node_t

template<typename T >
typedef details::trinary_node<T> exprtk::parser< T >::trinary_node_t
private

Definition at line 22198 of file exprtk.hpp.

◆ trinary_op_map_t

template<typename T >
typedef std::map<operator_t, trinary_functor_t> exprtk::parser< T >::trinary_op_map_t
private

Definition at line 22270 of file exprtk.hpp.

◆ unary_functor_t

template<typename T >
typedef functor_t::ufunc_t exprtk::parser< T >::unary_functor_t
private

Definition at line 22264 of file exprtk.hpp.

◆ unary_node_t

template<typename T >
typedef details::unary_node<T> exprtk::parser< T >::unary_node_t
private

Definition at line 22196 of file exprtk.hpp.

◆ unary_op_map_t

template<typename T >
typedef std::map<operator_t, unary_functor_t > exprtk::parser< T >::unary_op_map_t
private

Definition at line 22268 of file exprtk.hpp.

◆ VAF

template<typename T >
typedef ivararg_function<T> exprtk::parser< T >::VAF
private

Definition at line 22189 of file exprtk.hpp.

◆ variable_node_t

template<typename T >
typedef details::variable_node<T> exprtk::parser< T >::variable_node_t
private

Definition at line 22217 of file exprtk.hpp.

◆ vector_celem_node_t

template<typename T >
typedef details::vector_celem_node<T> exprtk::parser< T >::vector_celem_node_t
private

Definition at line 22219 of file exprtk.hpp.

◆ vector_celem_rtc_node_t

template<typename T >
typedef details::vector_celem_rtc_node<T> exprtk::parser< T >::vector_celem_rtc_node_t
private

Definition at line 22221 of file exprtk.hpp.

◆ vector_elem_node_t

template<typename T >
typedef details::vector_elem_node<T> exprtk::parser< T >::vector_elem_node_t
private

Definition at line 22218 of file exprtk.hpp.

◆ vector_elem_rtc_node_t

template<typename T >
typedef details::vector_elem_rtc_node<T> exprtk::parser< T >::vector_elem_rtc_node_t
private

Definition at line 22220 of file exprtk.hpp.

◆ vector_holder_ptr

template<typename T >
typedef vector_holder_t* exprtk::parser< T >::vector_holder_ptr
private

Definition at line 22258 of file exprtk.hpp.

◆ vector_holder_t

template<typename T >
typedef details::vector_holder<T> exprtk::parser< T >::vector_holder_t
private

Definition at line 22257 of file exprtk.hpp.

◆ vector_node_t

template<typename T >
typedef details::vector_node<T> exprtk::parser< T >::vector_node_t
private

Definition at line 22226 of file exprtk.hpp.

◆ vector_size_node_t

template<typename T >
typedef details::vector_size_node<T> exprtk::parser< T >::vector_size_node_t
private

Definition at line 22227 of file exprtk.hpp.

◆ voc_t

template<typename T >
typedef details::T0oT1_define<T, cref_t , const_t> exprtk::parser< T >::voc_t
private

Definition at line 22281 of file exprtk.hpp.

◆ vococ_t

template<typename T >
typedef details::T0oT1oT2_define<T, cref_t , const_t, const_t> exprtk::parser< T >::vococ_t
private

Definition at line 22289 of file exprtk.hpp.

◆ vococov_t

template<typename T >
typedef details::T0oT1oT2oT3_define<T, cref_t , const_t, const_t, cref_t > exprtk::parser< T >::vococov_t
private

Definition at line 22300 of file exprtk.hpp.

◆ vocov_t

template<typename T >
typedef details::T0oT1oT2_define<T, cref_t , const_t, cref_t > exprtk::parser< T >::vocov_t
private

Definition at line 22285 of file exprtk.hpp.

◆ vocovoc_t

template<typename T >
typedef details::T0oT1oT2oT3_define<T, cref_t , const_t, cref_t , const_t> exprtk::parser< T >::vocovoc_t
private

Definition at line 22298 of file exprtk.hpp.

◆ vocovov_t

template<typename T >
typedef details::T0oT1oT2oT3_define<T, cref_t , const_t, cref_t , cref_t > exprtk::parser< T >::vocovov_t
private

Definition at line 22294 of file exprtk.hpp.

◆ vov_t

template<typename T >
typedef details::T0oT1_define<T, cref_t , cref_t > exprtk::parser< T >::vov_t
private

Definition at line 22279 of file exprtk.hpp.

◆ vovoc_t

template<typename T >
typedef details::T0oT1oT2_define<T, cref_t , cref_t , const_t> exprtk::parser< T >::vovoc_t
private

Definition at line 22284 of file exprtk.hpp.

◆ vovocov_t

template<typename T >
typedef details::T0oT1oT2oT3_define<T, cref_t , cref_t , const_t, cref_t > exprtk::parser< T >::vovocov_t
private

Definition at line 22293 of file exprtk.hpp.

◆ vovov_t

template<typename T >
typedef details::T0oT1oT2_define<T, cref_t , cref_t , cref_t > exprtk::parser< T >::vovov_t
private

Definition at line 22283 of file exprtk.hpp.

◆ vovovoc_t

template<typename T >
typedef details::T0oT1oT2oT3_define<T, cref_t , cref_t , cref_t , const_t> exprtk::parser< T >::vovovoc_t
private

Definition at line 22292 of file exprtk.hpp.

◆ vovovov_t

template<typename T >
typedef details::T0oT1oT2oT3_define<T, cref_t , cref_t , cref_t , cref_t > exprtk::parser< T >::vovovov_t
private

Definition at line 22291 of file exprtk.hpp.

◆ while_loop_bc_node_t

template<typename T >
typedef details::while_loop_bc_node<T> exprtk::parser< T >::while_loop_bc_node_t
private

Definition at line 22209 of file exprtk.hpp.

◆ while_loop_bc_rtc_node_t

template<typename T >
typedef details::while_loop_bc_rtc_node<T> exprtk::parser< T >::while_loop_bc_rtc_node_t
private

Definition at line 22212 of file exprtk.hpp.

◆ while_loop_node_t

template<typename T >
typedef details::while_loop_node<T> exprtk::parser< T >::while_loop_node_t
private

Definition at line 22202 of file exprtk.hpp.

◆ while_loop_rtc_node_t

template<typename T >
typedef details::while_loop_rtc_node<T> exprtk::parser< T >::while_loop_rtc_node_t
private

Definition at line 22205 of file exprtk.hpp.

Member Enumeration Documentation

◆ collect_type

template<typename T >
enum exprtk::parser::collect_type
Enumerator
e_ct_none 
e_ct_variables 
e_ct_functions 
e_ct_assignments 

Definition at line 23474 of file exprtk.hpp.

23475 {
23476 e_ct_none = 0,
23477 e_ct_variables = 1,
23478 e_ct_functions = 2,
23480 };

◆ precedence_level

template<typename T >
enum exprtk::parser::precedence_level
private
Enumerator
e_level00 
e_level01 
e_level02 
e_level03 
e_level04 
e_level05 
e_level06 
e_level07 
e_level08 
e_level09 
e_level10 
e_level11 
e_level12 
e_level13 
e_level14 

Definition at line 22179 of file exprtk.hpp.

◆ symbol_type

template<typename T >
enum exprtk::parser::symbol_type
Enumerator
e_st_unknown 
e_st_variable 
e_st_vector 
e_st_vecelem 
e_st_string 
e_st_function 
e_st_local_variable 
e_st_local_vector 
e_st_local_string 

Definition at line 23482 of file exprtk.hpp.

23483 {
23484 e_st_unknown = 0,
23485 e_st_variable = 1,
23486 e_st_vector = 2,
23487 e_st_vecelem = 3,
23488 e_st_string = 4,
23489 e_st_function = 5,
23493 };

Constructor & Destructor Documentation

◆ parser() [1/2]

template<typename T >
exprtk::parser< T >::parser ( const settings_t settings = settings_t())
inlineexplicit

Definition at line 24337 of file exprtk.hpp.

24340 , results_context_(0)
24341 , unknown_symbol_resolver_(reinterpret_cast<unknown_symbol_resolver*>(0))
24342 #ifdef _MSC_VER
24343 #pragma warning(push)
24344 #pragma warning (disable:4355)
24345 #endif
24346 , sem_(*this)
24347 #ifdef _MSC_VER
24348 #pragma warning(pop)
24349 #endif
24355 , assert_check_(0)
24356 {
24358
24365
24374 }
void set_ibom(inv_binary_op_map_t &inv_binary_op_map)
Definition exprtk.hpp:31399
void set_bom(binary_op_map_t &binary_op_map)
Definition exprtk.hpp:31394
void set_uom(unary_op_map_t &unary_op_map)
Definition exprtk.hpp:31389
void set_strength_reduction_state(const bool enabled)
Definition exprtk.hpp:31419
void set_sf3m(sf3_map_t &sf3_map)
Definition exprtk.hpp:31404
void set_sf4m(sf4_map_t &sf4_map)
Definition exprtk.hpp:31409
bool strength_reduction_enabled() const
Definition exprtk.hpp:23894
sf4_map_t sf4_map_
Definition exprtk.hpp:41631
settings_store settings_
Definition exprtk.hpp:41614
void init_precompilation()
Definition exprtk.hpp:24379
binary_op_map_t binary_op_map_
Definition exprtk.hpp:41628
void load_unary_operations_map(unary_op_map_t &m)
Definition exprtk.hpp:41419
inv_binary_op_map_t inv_binary_op_map_
Definition exprtk.hpp:41629
void load_sf3_map(sf3_map_t &sf3_map)
Definition exprtk.hpp:41522
loop_runtime_check_ptr loop_runtime_check_
Definition exprtk.hpp:41650
lexer::helper::operator_joiner operator_joiner_3_
Definition exprtk.hpp:41643
unknown_symbol_resolver * unknown_symbol_resolver_
Definition exprtk.hpp:41624
vector_access_runtime_check_ptr vector_access_runtime_check_
Definition exprtk.hpp:41651
lexer::helper::operator_joiner operator_joiner_2_
Definition exprtk.hpp:41642
results_context_t * results_context_
Definition exprtk.hpp:41623
compilation_check_ptr compilation_check_ptr_
Definition exprtk.hpp:41652
sf3_map_t sf3_map_
Definition exprtk.hpp:41630
expression_generator< T > expression_generator_
Definition exprtk.hpp:41615
assert_check_ptr assert_check_
Definition exprtk.hpp:41653
void load_inv_binary_operations_map(inv_binary_op_map_t &m)
Definition exprtk.hpp:41494
void load_binary_operations_map(binary_op_map_t &m)
Definition exprtk.hpp:41466
unary_op_map_t unary_op_map_
Definition exprtk.hpp:41627
scope_element_manager sem_
Definition exprtk.hpp:41633
base_ops_map_t base_ops_map_
Definition exprtk.hpp:41626
void load_sf4_map(sf4_map_t &sf4_map)
Definition exprtk.hpp:41546
settings_store & settings()
Definition exprtk.hpp:24707
bool resolve_unknown_symbol_
Definition exprtk.hpp:41622
void load_operations_map(std::multimap< std::string, details::base_operation_t, details::ilesscompare > &m)
Definition exprtk.hpp:19395

References exprtk::parser< T >::base_ops_map_, exprtk::parser< T >::binary_op_map_, exprtk::parser< T >::expression_generator_, exprtk::parser< T >::init_precompilation(), exprtk::parser< T >::expression_generator< Type >::init_synthesize_map(), exprtk::parser< T >::inv_binary_op_map_, exprtk::parser< T >::load_binary_operations_map(), exprtk::parser< T >::load_inv_binary_operations_map(), exprtk::parser< T >::load_sf3_map(), exprtk::parser< T >::load_sf4_map(), exprtk::parser< T >::load_unary_operations_map(), exprtk::parser< T >::expression_generator< Type >::set_bom(), exprtk::parser< T >::expression_generator< Type >::set_ibom(), exprtk::parser< T >::expression_generator< Type >::set_parser(), exprtk::parser< T >::expression_generator< Type >::set_sf3m(), exprtk::parser< T >::expression_generator< Type >::set_sf4m(), exprtk::parser< T >::expression_generator< Type >::set_strength_reduction_state(), exprtk::parser< T >::expression_generator< Type >::set_uom(), exprtk::parser< T >::settings_, exprtk::parser< T >::sf3_map_, exprtk::parser< T >::sf4_map_, exprtk::parser< T >::settings_store::strength_reduction_enabled(), and exprtk::parser< T >::unary_op_map_.

Here is the call graph for this function:

◆ ~parser()

template<typename T >
exprtk::parser< T >::~parser ( )
inline

Definition at line 24376 of file exprtk.hpp.

24377 {}

◆ parser() [2/2]

template<typename T >
exprtk::parser< T >::parser ( const parser< T > &  )
private

Member Function Documentation

◆ clear_assert_check()

template<typename T >
void exprtk::parser< T >::clear_assert_check ( )
inline

Definition at line 24818 of file exprtk.hpp.

24819 {
24821 }
assert_check * assert_check_ptr
Definition exprtk.hpp:2212

References exprtk::parser< T >::assert_check_.

◆ clear_compilation_timeout_check()

template<typename T >
void exprtk::parser< T >::clear_compilation_timeout_check ( )
inline

Definition at line 24813 of file exprtk.hpp.

24814 {
24816 }
compilation_check * compilation_check_ptr
Definition exprtk.hpp:2227

References exprtk::parser< T >::compilation_check_ptr_.

Referenced by exprtk::function_compositor< T >::clear_compilation_timeout_check().

Here is the caller graph for this function:

◆ clear_loop_runtime_check()

template<typename T >
void exprtk::parser< T >::clear_loop_runtime_check ( )
inline

Definition at line 24803 of file exprtk.hpp.

24804 {
24806 }
loop_runtime_check * loop_runtime_check_ptr
Definition exprtk.hpp:2168

References exprtk::parser< T >::loop_runtime_check_.

Referenced by exprtk::function_compositor< T >::clear_loop_runtime_check().

Here is the caller graph for this function:

◆ clear_vector_access_runtime_check()

template<typename T >
void exprtk::parser< T >::clear_vector_access_runtime_check ( )
inline

Definition at line 24808 of file exprtk.hpp.

24809 {
24811 }
vector_access_runtime_check * vector_access_runtime_check_ptr
Definition exprtk.hpp:2192

References exprtk::parser< T >::vector_access_runtime_check_.

Referenced by exprtk::function_compositor< T >::clear_vector_access_runtime_check().

Here is the caller graph for this function:

◆ compile() [1/2]

template<typename T >
bool exprtk::parser< T >::compile ( const std::string &  expression_string,
expression< T > &  expr 
)
inline

Definition at line 24443 of file exprtk.hpp.

24444 {
24445 state_ .reset();
24446 error_list_ .clear();
24447 brkcnt_list_ .clear();
24448 synthesis_error_ .clear();
24450 immutable_symtok_map_.clear();
24451 current_state_stack_ .clear();
24452 assert_ids_ .clear();
24453 sem_ .cleanup();
24454
24456
24458
24459 if (expression_string.empty())
24460 {
24463 "ERR001 - Empty expression!",
24465
24466 return false;
24467 }
24468
24469 if (!init(expression_string))
24470 {
24472 return false;
24473 }
24474
24475 if (lexer().empty())
24476 {
24479 "ERR002 - Empty expression!",
24481
24482 return false;
24483 }
24484
24486 {
24487 exprtk_debug(("halt_compilation_check() - compile checkpoint 0\n"));
24488 return false;
24489 }
24490
24491 if (!run_assemblies())
24492 {
24493 return false;
24494 }
24495
24497 {
24498 exprtk_debug(("halt_compilation_check() - compile checkpoint 1\n"));
24499 return false;
24500 }
24501
24502 symtab_store_.symtab_list_ = expr.get_symbol_table_list();
24503 dec_.clear();
24504
24505 lexer().begin();
24506
24507 next_token();
24508
24510
24511 if ((0 != e) && (token_t::e_eof == current_token().type))
24512 {
24513 bool* retinvk_ptr = 0;
24514
24516 {
24517 dec_.return_present_ = true;
24518
24520 .return_envelope(e, results_context_, retinvk_ptr);
24521 }
24522
24523 expr.set_expression(e);
24524 expr.set_retinvk(retinvk_ptr);
24525
24526 register_local_vars(expr);
24528
24529 return !(!expr);
24530 }
24531 else
24532 {
24533 if (error_list_.empty())
24534 {
24537 current_token(),
24538 "ERR003 - Invalid expression encountered",
24540 }
24541
24542 if ((0 != e) && branch_deletable(e))
24543 {
24544 destroy_node(e);
24545 }
24546
24547 dec_.clear ();
24548 sem_.cleanup ();
24550
24551 return false;
24552 }
24553 }
bool init(const std::string &str)
Definition exprtk.hpp:4353
const token_t & current_token() const
Definition exprtk.hpp:4394
void set_allocator(details::node_allocator &na)
Definition exprtk.hpp:31414
expression_node_ptr return_envelope(expression_node_ptr body, results_context_t *rc, bool *&return_invoked)
Definition exprtk.hpp:33675
std::set< std::string > assert_ids_
Definition exprtk.hpp:41654
expression_node_t * expression_node_ptr
Definition exprtk.hpp:22253
void return_cleanup()
Definition exprtk.hpp:41596
dependent_entity_collector dec_
Definition exprtk.hpp:41618
std::vector< state_t > current_state_stack_
Definition exprtk.hpp:41634
expression_node_ptr parse_corpus()
Definition exprtk.hpp:24904
std::deque< parser_error::type > error_list_
Definition exprtk.hpp:41619
void register_local_vars(expression< T > &e)
Definition exprtk.hpp:41351
void process_lexer_errors()
Definition exprtk.hpp:24563
immutable_symtok_map_t immutable_symtok_map_
Definition exprtk.hpp:41637
symtab_store symtab_store_
Definition exprtk.hpp:41617
bool run_assemblies()
Definition exprtk.hpp:24600
parser_state state_
Definition exprtk.hpp:41621
void set_error(const parser_error::type &error_type)
Definition exprtk.hpp:41330
details::node_allocator node_allocator_
Definition exprtk.hpp:41616
std::string synthesis_error_
Definition exprtk.hpp:41632
void register_return_results(expression< T > &e)
Definition exprtk.hpp:41413
std::deque< bool > brkcnt_list_
Definition exprtk.hpp:41620
immutable_memory_map_t immutable_memory_map_
Definition exprtk.hpp:41636
bool halt_compilation_check()
Definition exprtk.hpp:25044
#define exprtk_debug(params)
Definition exprtk.hpp:64
#define exprtk_error_location
Definition exprtk.hpp:67
bool branch_deletable(const expression_node< T > *node)
Definition exprtk.hpp:5852
void destroy_node(expression_node< T > *&node)
Definition exprtk.hpp:6019
type make_error(const error_mode mode, const std::string &diagnostic="", const std::string &src_location="")
Definition exprtk.hpp:22071
symbol_table_list_t symtab_list_
Definition exprtk.hpp:22822

References exprtk::parser< T >::assert_ids_, exprtk::lexer::generator::begin(), exprtk::parser< T >::brkcnt_list_, exprtk::parser< T >::scope_element_manager::cleanup(), exprtk::parser< T >::dependent_entity_collector::clear(), exprtk::parser< T >::current_state_stack_, exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::dec_, exprtk::lexer::token::e_eof, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_list_, exprtk::parser< T >::expression_generator_, exprtk_debug, exprtk_error_location, exprtk::expression< T >::get_symbol_table_list(), exprtk::parser< T >::halt_compilation_check(), exprtk::parser< T >::immutable_memory_map_, exprtk::parser< T >::immutable_symtok_map_, exprtk::lexer::parser_helper::init(), exprtk::lexer::parser_helper::lexer(), exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_corpus(), exprtk::parser< T >::process_lexer_errors(), exprtk::parser< T >::register_local_vars(), exprtk::parser< T >::register_return_results(), exprtk::parser< T >::interval_container_t< IntervalPointType, RangePolicy >::reset(), exprtk::parser< T >::parser_state::reset(), exprtk::parser< T >::results_context_, exprtk::parser< T >::return_cleanup(), exprtk::parser< T >::expression_generator< Type >::return_envelope(), exprtk::parser< T >::dependent_entity_collector::return_present_, exprtk::parser< T >::parser_state::return_stmt_present, exprtk::parser< T >::run_assemblies(), exprtk::parser< T >::sem_, exprtk::parser< T >::expression_generator< Type >::set_allocator(), exprtk::parser< T >::set_error(), exprtk::expression< T >::set_expression(), exprtk::expression< T >::set_retinvk(), exprtk::parser< T >::state_, exprtk::parser< T >::symtab_store::symtab_list_, exprtk::parser< T >::symtab_store_, and exprtk::parser< T >::synthesis_error_.

Referenced by bubble_sort(), exprtk::details::collector_helper< T >::collection_pass(), exprtk::parser< T >::compile(), exprtk::function_compositor< T >::compile_expression(), exprtk::compute(), exprtk::compute(), exprtk::compute(), exprtk::compute(), e_10k_digits(), load_expression(), logic(), main(), pi_10k_digits(), expression_processor< T >::process(), run_parse_benchmark(), run_test01(), run_test02(), run_test03(), run_test04(), run_test05(), run_test06(), run_test07(), run_test08(), run_test09(), run_test10(), run_test11(), run_test12(), run_test14(), run_test15(), run_test16(), run_test17(), run_test18(), run_test20(), sieve_of_eratosthenes(), stddev_example(), test_expression(), test_gen(), trig_function(), vector_function(), and vector_randu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ compile() [2/2]

template<typename T >
expression_t exprtk::parser< T >::compile ( const std::string &  expression_string,
symbol_table_t symtab 
)
inline

Definition at line 24555 of file exprtk.hpp.

24556 {
24557 expression_t expression;
24558 expression.register_symbol_table(symtab);
24559 compile(expression_string,expression);
24560 return expression;
24561 }
bool compile(const std::string &expression_string, expression< T > &expr)
Definition exprtk.hpp:24443
expression< T > expression_t
Definition exprtk.hpp:22254

References exprtk::parser< T >::compile(), and exprtk::expression< T >::register_symbol_table().

Here is the call graph for this function:

◆ construct_subexpr()

template<typename T >
std::string exprtk::parser< T >::construct_subexpr ( lexer::token begin_token,
lexer::token end_token,
const bool  cleanup_whitespace = true 
)
inlineprivate

Definition at line 24980 of file exprtk.hpp.

24983 {
24984 std::string result = lexer().substr(begin_token.position,end_token.position);
24985 if (cleanup_whitespace)
24986 {
24987 for (std::size_t i = 0; i < result.size(); ++i)
24988 {
24989 if (details::is_whitespace(result[i])) result[i] = ' ';
24990 }
24991 }
24992
24993 return result;
24994 }
std::string substr(const std::size_t &begin, const std::size_t &end) const
Definition exprtk.hpp:2535
bool is_whitespace(const char_t c)
Definition exprtk.hpp:103

References exprtk::details::is_whitespace(), exprtk::lexer::parser_helper::lexer(), exprtk::lexer::token::position, and exprtk::lexer::generator::substr().

Referenced by exprtk::parser< T >::parse_corpus().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ current_state()

template<typename T >
state_t exprtk::parser< T >::current_state ( ) const
inlineprivate

◆ dec()

template<typename T >
dependent_entity_collector & exprtk::parser< T >::dec ( )
inline

Definition at line 24737 of file exprtk.hpp.

24738 {
24739 return dec_;
24740 }

References exprtk::parser< T >::dec_.

Referenced by exprtk::details::collector_helper< T >::collection_pass(), exprtk::function_compositor< T >::compile_expression(), expression_processor< T >::process(), and run_test10().

Here is the caller graph for this function:

◆ disable_unknown_symbol_resolver()

template<typename T >
void exprtk::parser< T >::disable_unknown_symbol_resolver ( )
inline

Definition at line 24777 of file exprtk.hpp.

24778 {
24781 }
unknown_symbol_resolver default_usr_
Definition exprtk.hpp:41625

References exprtk::parser< T >::default_usr_, exprtk::parser< T >::resolve_unknown_symbol_, and exprtk::parser< T >::unknown_symbol_resolver_.

Referenced by expression_processor< T >::process().

Here is the caller graph for this function:

◆ enable_unknown_symbol_resolver() [1/2]

template<typename T >
void exprtk::parser< T >::enable_unknown_symbol_resolver ( unknown_symbol_resolver usr)
inline

Definition at line 24772 of file exprtk.hpp.

24773 {
24775 }
void enable_unknown_symbol_resolver(unknown_symbol_resolver *usr=reinterpret_cast< unknown_symbol_resolver * >(0))
Definition exprtk.hpp:24762

References exprtk::parser< T >::enable_unknown_symbol_resolver().

Here is the call graph for this function:

◆ enable_unknown_symbol_resolver() [2/2]

template<typename T >
void exprtk::parser< T >::enable_unknown_symbol_resolver ( unknown_symbol_resolver usr = reinterpret_cast<unknown_symbol_resolver*>(0))
inline

Definition at line 24762 of file exprtk.hpp.

24763 {
24765
24766 if (usr)
24768 else
24770 }

References exprtk::parser< T >::default_usr_, exprtk::parser< T >::resolve_unknown_symbol_, and exprtk::parser< T >::unknown_symbol_resolver_.

Referenced by exprtk::details::collector_helper< T >::collection_pass(), exprtk::parser< T >::enable_unknown_symbol_resolver(), expression_processor< T >::process(), and run_test20().

Here is the caller graph for this function:

◆ error()

template<typename T >
std::string exprtk::parser< T >::error ( ) const
inline

Definition at line 24722 of file exprtk.hpp.

24723 {
24724 if (!error_list_.empty())
24725 {
24726 return error_list_[0].diagnostic;
24727 }
24728 else
24729 return std::string("No Error");
24730 }

References exprtk::parser< T >::error_list_.

Referenced by exprtk::function_compositor< T >::compile_expression(), load_expression(), main(), expression_processor< T >::process(), run_parse_benchmark(), run_test01(), run_test02(), run_test03(), run_test04(), run_test05(), run_test06(), run_test07(), run_test08(), run_test09(), run_test10(), run_test11(), run_test12(), run_test14(), run_test15(), run_test16(), run_test17(), run_test18(), run_test20(), test_expression(), and test_gen().

Here is the caller graph for this function:

◆ error_count()

template<typename T >
std::size_t exprtk::parser< T >::error_count ( ) const
inline

Definition at line 24732 of file exprtk.hpp.

24733 {
24734 return error_list_.size();
24735 }

References exprtk::parser< T >::error_list_.

Referenced by exprtk::function_compositor< T >::compile_expression(), and expression_processor< T >::process().

Here is the caller graph for this function:

◆ error_node()

template<typename T >
static expression_node_ptr exprtk::parser< T >::error_node ( )
inlinestaticprivate

Definition at line 25405 of file exprtk.hpp.

25406 {
25407 return reinterpret_cast<expression_node_ptr>(0);
25408 }

Referenced by exprtk::parser< T >::expression_generator< Type >::assert_call(), exprtk::parser< T >::expression_generator< Type >::cardinal_pow_optimisation_impl(), exprtk::parser< T >::expression_generator< Type >::conditional(), exprtk::parser< T >::expression_generator< Type >::conditional_string(), exprtk::parser< T >::expression_generator< Type >::conditional_vector(), exprtk::parser< T >::expression_generator< Type >::const_optimise_mswitch(), exprtk::parser< T >::expression_generator< Type >::const_optimise_sf3(), exprtk::parser< T >::expression_generator< Type >::const_optimise_sf4(), exprtk::parser< T >::expression_generator< Type >::const_optimise_switch(), exprtk::parser< T >::expression_generator< Type >::const_optimise_varargfunc(), exprtk::parser< T >::expression_generator< Type >::for_loop(), exprtk::parser< T >::expression_generator< Type >::function(), exprtk::parser< T >::expression_generator< Type >::generic_function_call(), exprtk::parser< T >::expression_generator< Type >::multi_switch_statement(), exprtk::parser< T >::expression_generator< Type >::operator()(), exprtk::parser< T >::expression_generator< Type >::operator()(), exprtk::parser< T >::expression_generator< Type >::operator()(), exprtk::parser< T >::expression_generator< Type >::operator()(), exprtk::parser< T >::expression_generator< Type >::operator()(), exprtk::parser< T >::parse_assert_statement(), exprtk::parser< T >::parse_base_operation(), exprtk::parser< T >::parse_branch(), exprtk::parser< T >::parse_break_statement(), exprtk::parser< T >::parse_conditional_statement(), exprtk::parser< T >::parse_conditional_statement_01(), exprtk::parser< T >::parse_conditional_statement_02(), exprtk::parser< T >::parse_const_string(), exprtk::parser< T >::parse_continue_statement(), exprtk::parser< T >::parse_corpus(), exprtk::parser< T >::parse_define_constvar_statement(), exprtk::parser< T >::parse_define_string_statement(), exprtk::parser< T >::parse_define_var_statement(), exprtk::parser< T >::parse_define_vector_statement(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parse_for_loop(), exprtk::parser< T >::parse_function_call(), exprtk::parser< T >::parse_function_call_0(), exprtk::parser< T >::parse_function_invocation(), exprtk::parser< T >::parse_generic_function_call(), exprtk::parser< T >::parse_multi_sequence(), exprtk::parser< T >::parse_multi_switch_statement(), exprtk::parser< T >::parse_not_statement(), exprtk::parser< T >::parse_overload_function_call(), exprtk::parser< T >::parse_pending_vector_index_operator(), exprtk::parser< T >::parse_repeat_until_loop(), exprtk::parser< T >::parse_return_statement(), exprtk::parser< T >::parse_special_function(), exprtk::parser< T >::parse_string(), exprtk::parser< T >::parse_string_function_call(), exprtk::parser< T >::parse_string_range_statement(), exprtk::parser< T >::parse_swap_statement(), exprtk::parser< T >::parse_switch_statement(), exprtk::parser< T >::parse_symbol(), exprtk::parser< T >::parse_symtab_symbol(), exprtk::parser< T >::parse_ternary_conditional_statement(), exprtk::parser< T >::parse_uninitialised_var_statement(), exprtk::parser< T >::parse_vararg_function(), exprtk::parser< T >::parse_vararg_function_call(), exprtk::parser< T >::parse_vector(), exprtk::parser< T >::parse_vector_index(), exprtk::parser< T >::parse_while_loop(), exprtk::parser< T >::expression_generator< Type >::synthesize_cocov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococ_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococov_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococov_expression4::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_binary_ext_expression::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vob_expression::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_bov_expression::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_cob_expression::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_boc_expression::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_cocob_expression::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_coboc_expression::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vov_expression::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_cov_expression::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_voc_expression::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovoc_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covoc_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_cocov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococ_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovocov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covocov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovoc_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovocov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covocov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovoc_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovoc_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovov_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovoc_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovocov_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovov_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovov_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covocov_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovoc_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovoc_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovov_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovoc_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovocov_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovov_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovov_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covocov_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovoc_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovoc_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococov_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovov_expression4::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovoc_expression4::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovocov_expression4::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovov_expression4::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovov_expression4::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covocov_expression4::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovoc_expression4::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovoc_expression4::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_sf3ext_expression::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_sf4ext_expression::process(), exprtk::parser< T >::parse_special_function_impl< Type, NumberOfParameters >::process(), exprtk::parser< T >::expression_generator< Type >::repeat_until_loop(), exprtk::parser< T >::expression_generator< Type >::return_call(), exprtk::parser< T >::simplify(), exprtk::parser< T >::simplify_unary_negation_branch(), exprtk::parser< T >::expression_generator< Type >::special_function(), exprtk::parser< T >::expression_generator< Type >::special_function(), exprtk::parser< T >::expression_generator< Type >::string_function_call(), exprtk::parser< T >::expression_generator< Type >::switch_statement(), exprtk::parser< T >::expression_generator< Type >::synthesize_assignment_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_assignment_operation_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_csocs_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_null_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_shortcircuit_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_sos_expression_impl(), exprtk::parser< T >::expression_generator< Type >::synthesize_str_xoxr_expression_impl(), exprtk::parser< T >::expression_generator< Type >::synthesize_str_xrox_expression_impl(), exprtk::parser< T >::expression_generator< Type >::synthesize_str_xroxr_expression_impl(), exprtk::parser< T >::expression_generator< Type >::synthesize_string_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_string_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_strogen_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_swap_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_unary_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_uv_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_uvec_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_uvouv_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_vecarithmetic_operation_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_veceqineqlogic_operation_expression(), exprtk::parser< T >::synthesize_vector_element(), exprtk::parser< T >::expression_generator< Type >::vararg_function(), exprtk::parser< T >::expression_generator< Type >::vararg_function_call(), exprtk::parser< T >::expression_generator< Type >::varnode_optimise_sf3(), exprtk::parser< T >::expression_generator< Type >::varnode_optimise_sf4(), exprtk::parser< T >::expression_generator< Type >::varnode_optimise_varargfunc(), exprtk::parser< T >::expression_generator< Type >::vector_element(), exprtk::parser< T >::expression_generator< Type >::vectorize_func(), and exprtk::parser< T >::expression_generator< Type >::while_loop().

Here is the caller graph for this function:

◆ get_error()

template<typename T >
parser_error::type exprtk::parser< T >::get_error ( const std::size_t &  index) const
inline

Definition at line 24712 of file exprtk.hpp.

24713 {
24714 if (index < error_list_.size())
24715 {
24716 return error_list_[index];
24717 }
24718
24719 throw std::invalid_argument("parser::get_error() - Invalid error index specified");
24720 }

References exprtk::parser< T >::error_list_.

Referenced by exprtk::function_compositor< T >::compile_expression(), and expression_processor< T >::process().

Here is the caller graph for this function:

◆ halt_compilation_check()

template<typename T >
bool exprtk::parser< T >::halt_compilation_check ( )
inlineprivate

Definition at line 25044 of file exprtk.hpp.

25045 {
25046 compilation_check::compilation_context context;
25047
25049 {
25050 const std::string error_message =
25051 !context.error_message.empty() ? " Details: " + context.error_message : "";
25052
25055 token_t(),
25056 "ERR010 - Internal compilation check failed." + error_message,
25058
25059 return true;
25060 }
25061
25062 return false;
25063 }
lexer::token token_t
Definition exprtk.hpp:22252
virtual bool continue_compilation(compilation_context &)=0

References exprtk::parser< T >::compilation_check_ptr_, exprtk::compilation_check::continue_compilation(), exprtk::parser_error::e_parser, exprtk::compilation_check::compilation_context::error_message, exprtk_error_location, and exprtk::parser< T >::set_error().

Referenced by exprtk::parser< T >::compile(), and exprtk::parser< T >::parse_expression().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ handle_brkcnt_scope_exit()

template<typename T >
void exprtk::parser< T >::handle_brkcnt_scope_exit ( )
inlineprivate

Definition at line 26431 of file exprtk.hpp.

26432 {
26433 assert(!brkcnt_list_.empty());
26434 brkcnt_list_.pop_front();
26435 }

References exprtk::parser< T >::brkcnt_list_.

Referenced by exprtk::parser< T >::parse_for_loop(), exprtk::parser< T >::parse_repeat_until_loop(), and exprtk::parser< T >::parse_while_loop().

Here is the caller graph for this function:

◆ init_precompilation()

template<typename T >
void exprtk::parser< T >::init_precompilation ( )
inline

Definition at line 24379 of file exprtk.hpp.

24380 {
24383
24386
24389
24391 {
24397 }
24398
24400 {
24401 for (std::size_t i = 0; i < details::reserved_words_size; ++i)
24402 {
24404 }
24405
24408 }
24409
24411 {
24415 }
24416
24417 if (
24421 )
24422 {
24424
24426 {
24428 }
24429
24431 {
24433 }
24434
24436 {
24439 }
24440 }
24441 }
void ignore_symbol(const std::string &symbol)
Definition exprtk.hpp:3487
bool add_replace(const std::string &target_symbol, const std::string &replace_symbol, const lexer::token::token_type token_type=lexer::token::e_symbol)
Definition exprtk.hpp:3884
bool collect_functions_enabled() const
Definition exprtk.hpp:23896
bool collect_variables_enabled() const
Definition exprtk.hpp:23895
bool commutative_check_enabled() const
Definition exprtk.hpp:23889
bool collect_assignments_enabled() const
Definition exprtk.hpp:23897
lexer::helper::bracket_checker bracket_checker_
Definition exprtk.hpp:41645
lexer::helper::symbol_replacer symbol_replacer_
Definition exprtk.hpp:41644
lexer::helper::sequence_validator sequence_validator_
Definition exprtk.hpp:41647
lexer::helper::commutative_inserter commutative_inserter_
Definition exprtk.hpp:41641
lexer::helper::sequence_validator_3tokens sequence_validator_3tkns_
Definition exprtk.hpp:41648
lexer::helper::numeric_checker< T > numeric_checker_
Definition exprtk.hpp:41646
lexer::helper::helper_assembly helper_assembly_
Definition exprtk.hpp:41639
static const std::string reserved_words[]
Definition exprtk.hpp:433
static const std::size_t reserved_words_size
Definition exprtk.hpp:442
std::vector< lexer::token_inserter * > token_inserter_list
Definition exprtk.hpp:4337
bool register_inserter(lexer::token_inserter *inserter)
Definition exprtk.hpp:4232
std::vector< lexer::token_joiner * > token_joiner_list
Definition exprtk.hpp:4336
bool register_scanner(lexer::token_scanner *scanner)
Definition exprtk.hpp:4190
std::vector< lexer::token_modifier * > token_modifier_list
Definition exprtk.hpp:4335
bool register_joiner(lexer::token_joiner *joiner)
Definition exprtk.hpp:4218
bool register_modifier(lexer::token_modifier *modifier)
Definition exprtk.hpp:4204
std::vector< lexer::token_scanner * > token_scanner_list
Definition exprtk.hpp:4334

References exprtk::lexer::helper::symbol_replacer::add_replace(), exprtk::parser< T >::settings_store::bracket_check_enabled(), exprtk::parser< T >::bracket_checker_, exprtk::lexer::helper::symbol_replacer::clear(), exprtk::parser< T >::dependent_entity_collector::collect_assignments(), exprtk::parser< T >::settings_store::collect_assignments_enabled(), exprtk::parser< T >::dependent_entity_collector::collect_functions(), exprtk::parser< T >::settings_store::collect_functions_enabled(), exprtk::parser< T >::dependent_entity_collector::collect_variables(), exprtk::parser< T >::settings_store::collect_variables_enabled(), exprtk::parser< T >::settings_store::commutative_check_enabled(), exprtk::parser< T >::commutative_inserter_, exprtk::parser< T >::dec_, exprtk::lexer::token::e_number, exprtk::parser< T >::helper_assembly_, exprtk::lexer::helper::commutative_inserter::ignore_symbol(), exprtk::parser< T >::settings_store::joiner_enabled(), exprtk::parser< T >::settings_store::numeric_check_enabled(), exprtk::parser< T >::numeric_checker_, exprtk::parser< T >::operator_joiner_2_, exprtk::parser< T >::operator_joiner_3_, exprtk::lexer::helper::helper_assembly::register_inserter(), exprtk::lexer::helper::helper_assembly::register_joiner(), exprtk::lexer::helper::helper_assembly::register_modifier(), exprtk::lexer::helper::helper_assembly::register_scanner(), exprtk::parser< T >::settings_store::replacer_enabled(), exprtk::details::reserved_words, exprtk::details::reserved_words_size, exprtk::parser< T >::settings_store::sequence_check_enabled(), exprtk::parser< T >::sequence_validator_, exprtk::parser< T >::sequence_validator_3tkns_, exprtk::parser< T >::settings_, exprtk::parser< T >::symbol_replacer_, exprtk::lexer::helper::helper_assembly::token_inserter_list, exprtk::lexer::helper::helper_assembly::token_joiner_list, exprtk::lexer::helper::helper_assembly::token_modifier_list, and exprtk::lexer::helper::helper_assembly::token_scanner_list.

Referenced by exprtk::parser< T >::parser().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_invalid_arithmetic_operation()

template<typename T >
bool exprtk::parser< T >::is_invalid_arithmetic_operation ( const details::operator_type  operation) const
inlineprivate

Definition at line 24871 of file exprtk.hpp.

24872 {
24873 return settings_.arithmetic_disabled(operation);
24874 }
bool arithmetic_disabled(const details::operator_type arithmetic_operation) const
Definition exprtk.hpp:23995

References exprtk::parser< T >::settings_store::arithmetic_disabled(), and exprtk::parser< T >::settings_.

Referenced by exprtk::parser< T >::parse_expression().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_invalid_assignment_operation()

template<typename T >
bool exprtk::parser< T >::is_invalid_assignment_operation ( const details::operator_type  operation) const
inlineprivate

Definition at line 24876 of file exprtk.hpp.

24877 {
24878 return settings_.assignment_disabled(operation);
24879 }
bool assignment_disabled(const details::operator_type assignment_operation) const
Definition exprtk.hpp:23977

References exprtk::parser< T >::settings_store::assignment_disabled(), and exprtk::parser< T >::settings_.

Referenced by exprtk::parser< T >::parse_expression().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_invalid_inequality_operation()

template<typename T >
bool exprtk::parser< T >::is_invalid_inequality_operation ( const details::operator_type  operation) const
inlineprivate

Definition at line 24881 of file exprtk.hpp.

24882 {
24883 return settings_.inequality_disabled(operation);
24884 }
bool inequality_disabled(const details::operator_type &inequality) const
Definition exprtk.hpp:24004

References exprtk::parser< T >::settings_store::inequality_disabled(), and exprtk::parser< T >::settings_.

Referenced by exprtk::parser< T >::parse_expression().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_invalid_logic_operation()

template<typename T >
bool exprtk::parser< T >::is_invalid_logic_operation ( const details::operator_type  operation) const
inlineprivate

Definition at line 24866 of file exprtk.hpp.

24867 {
24868 return settings_.logic_disabled(operation);
24869 }
bool logic_disabled(const std::string &logic_operation) const
Definition exprtk.hpp:23969

References exprtk::parser< T >::settings_store::logic_disabled(), and exprtk::parser< T >::settings_.

Referenced by exprtk::parser< T >::parse_expression().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ load_binary_operations_map()

template<typename T >
void exprtk::parser< T >::load_binary_operations_map ( binary_op_map_t m)
inlineprivate

Definition at line 41466 of file exprtk.hpp.

41467 {
41468 typedef typename binary_op_map_t::value_type value_type;
41469
41470 #define register_binary_op(Op, BinaryFunctor) \
41471 m.insert(value_type(Op,BinaryFunctor<T>::process)); \
41472
41473 register_binary_op(details::e_add , details::add_op )
41474 register_binary_op(details::e_sub , details::sub_op )
41475 register_binary_op(details::e_mul , details::mul_op )
41476 register_binary_op(details::e_div , details::div_op )
41477 register_binary_op(details::e_mod , details::mod_op )
41478 register_binary_op(details::e_pow , details::pow_op )
41479 register_binary_op(details::e_lt , details::lt_op )
41480 register_binary_op(details::e_lte , details::lte_op )
41481 register_binary_op(details::e_gt , details::gt_op )
41482 register_binary_op(details::e_gte , details::gte_op )
41483 register_binary_op(details::e_eq , details::eq_op )
41484 register_binary_op(details::e_ne , details::ne_op )
41485 register_binary_op(details::e_and , details::and_op )
41486 register_binary_op(details::e_nand , details::nand_op)
41487 register_binary_op(details::e_or , details::or_op )
41488 register_binary_op(details::e_nor , details::nor_op )
41489 register_binary_op(details::e_xor , details::xor_op )
41490 register_binary_op(details::e_xnor , details::xnor_op)
41491 #undef register_binary_op
41492 }
#define register_binary_op(Op, BinaryFunctor)

References exprtk::details::e_add, exprtk::details::e_and, exprtk::details::e_div, exprtk::details::e_eq, exprtk::details::e_gt, exprtk::details::e_gte, exprtk::details::e_lt, exprtk::details::e_lte, exprtk::details::e_mod, exprtk::details::e_mul, exprtk::details::e_nand, exprtk::details::e_ne, exprtk::details::e_nor, exprtk::details::e_or, exprtk::details::e_pow, exprtk::details::e_sub, exprtk::details::e_xnor, exprtk::details::e_xor, and register_binary_op.

Referenced by exprtk::parser< T >::parser().

Here is the caller graph for this function:

◆ load_inv_binary_operations_map()

template<typename T >
void exprtk::parser< T >::load_inv_binary_operations_map ( inv_binary_op_map_t m)
inlineprivate

Definition at line 41494 of file exprtk.hpp.

41495 {
41496 typedef typename inv_binary_op_map_t::value_type value_type;
41497
41498 #define register_binary_op(Op, BinaryFunctor) \
41499 m.insert(value_type(BinaryFunctor<T>::process,Op)); \
41500
41501 register_binary_op(details::e_add , details::add_op )
41502 register_binary_op(details::e_sub , details::sub_op )
41503 register_binary_op(details::e_mul , details::mul_op )
41504 register_binary_op(details::e_div , details::div_op )
41505 register_binary_op(details::e_mod , details::mod_op )
41506 register_binary_op(details::e_pow , details::pow_op )
41507 register_binary_op(details::e_lt , details::lt_op )
41508 register_binary_op(details::e_lte , details::lte_op )
41509 register_binary_op(details::e_gt , details::gt_op )
41510 register_binary_op(details::e_gte , details::gte_op )
41511 register_binary_op(details::e_eq , details::eq_op )
41512 register_binary_op(details::e_ne , details::ne_op )
41513 register_binary_op(details::e_and , details::and_op )
41514 register_binary_op(details::e_nand , details::nand_op)
41515 register_binary_op(details::e_or , details::or_op )
41516 register_binary_op(details::e_nor , details::nor_op )
41517 register_binary_op(details::e_xor , details::xor_op )
41518 register_binary_op(details::e_xnor , details::xnor_op)
41519 #undef register_binary_op
41520 }

References exprtk::details::e_add, exprtk::details::e_and, exprtk::details::e_div, exprtk::details::e_eq, exprtk::details::e_gt, exprtk::details::e_gte, exprtk::details::e_lt, exprtk::details::e_lte, exprtk::details::e_mod, exprtk::details::e_mul, exprtk::details::e_nand, exprtk::details::e_ne, exprtk::details::e_nor, exprtk::details::e_or, exprtk::details::e_pow, exprtk::details::e_sub, exprtk::details::e_xnor, exprtk::details::e_xor, and register_binary_op.

Referenced by exprtk::parser< T >::parser().

Here is the caller graph for this function:

◆ load_sf3_map()

template<typename T >
void exprtk::parser< T >::load_sf3_map ( sf3_map_t sf3_map)
inlineprivate

Definition at line 41522 of file exprtk.hpp.

41523 {
41524 typedef std::pair<trinary_functor_t,details::operator_type> pair_t;
41525
41526 #define register_sf3(Op) \
41527 sf3_map[details::sf##Op##_op<T>::id()] = pair_t(details::sf##Op##_op<T>::process,details::e_sf##Op); \
41528
41537 #undef register_sf3
41538
41539 #define register_sf3_extid(Id, Op) \
41540 sf3_map[Id] = pair_t(details::sf##Op##_op<T>::process,details::e_sf##Op); \
41541
41542 register_sf3_extid("(t-t)-t",23) // (t-t)-t --> t-(t+t)
41543 #undef register_sf3_extid
41544 }
#define register_sf3_extid(Id, Op)
#define register_sf3(Op)

References register_sf3, and register_sf3_extid.

Referenced by exprtk::parser< T >::parser().

Here is the caller graph for this function:

◆ load_sf4_map()

template<typename T >
void exprtk::parser< T >::load_sf4_map ( sf4_map_t sf4_map)
inlineprivate

Definition at line 41546 of file exprtk.hpp.

41547 {
41548 typedef std::pair<quaternary_functor_t,details::operator_type> pair_t;
41549
41550 #define register_sf4(Op) \
41551 sf4_map[details::sf##Op##_op<T>::id()] = pair_t(details::sf##Op##_op<T>::process,details::e_sf##Op); \
41552
41562 #undef register_sf4
41563
41564 #define register_sf4ext(Op) \
41565 sf4_map[details::sfext##Op##_op<T>::id()] = pair_t(details::sfext##Op##_op<T>::process,details::e_sf4ext##Op); \
41566
41583 #undef register_sf4ext
41584 }
#define register_sf4(Op)
#define register_sf4ext(Op)

References register_sf4, and register_sf4ext.

Referenced by exprtk::parser< T >::parser().

Here is the caller graph for this function:

◆ load_unary_operations_map()

template<typename T >
void exprtk::parser< T >::load_unary_operations_map ( unary_op_map_t m)
inlineprivate

Definition at line 41419 of file exprtk.hpp.

41420 {
41421 #define register_unary_op(Op, UnaryFunctor) \
41422 m.insert(std::make_pair(Op,UnaryFunctor<T>::process)); \
41423
41424 register_unary_op(details::e_abs , details::abs_op )
41425 register_unary_op(details::e_acos , details::acos_op )
41426 register_unary_op(details::e_acosh , details::acosh_op)
41427 register_unary_op(details::e_asin , details::asin_op )
41428 register_unary_op(details::e_asinh , details::asinh_op)
41429 register_unary_op(details::e_atanh , details::atanh_op)
41430 register_unary_op(details::e_ceil , details::ceil_op )
41431 register_unary_op(details::e_cos , details::cos_op )
41432 register_unary_op(details::e_cosh , details::cosh_op )
41433 register_unary_op(details::e_exp , details::exp_op )
41434 register_unary_op(details::e_expm1 , details::expm1_op)
41435 register_unary_op(details::e_floor , details::floor_op)
41436 register_unary_op(details::e_log , details::log_op )
41437 register_unary_op(details::e_log10 , details::log10_op)
41438 register_unary_op(details::e_log2 , details::log2_op )
41439 register_unary_op(details::e_log1p , details::log1p_op)
41440 register_unary_op(details::e_neg , details::neg_op )
41441 register_unary_op(details::e_pos , details::pos_op )
41442 register_unary_op(details::e_round , details::round_op)
41443 register_unary_op(details::e_sin , details::sin_op )
41444 register_unary_op(details::e_sinc , details::sinc_op )
41445 register_unary_op(details::e_sinh , details::sinh_op )
41446 register_unary_op(details::e_sqrt , details::sqrt_op )
41447 register_unary_op(details::e_tan , details::tan_op )
41448 register_unary_op(details::e_tanh , details::tanh_op )
41449 register_unary_op(details::e_cot , details::cot_op )
41450 register_unary_op(details::e_sec , details::sec_op )
41451 register_unary_op(details::e_csc , details::csc_op )
41452 register_unary_op(details::e_r2d , details::r2d_op )
41453 register_unary_op(details::e_d2r , details::d2r_op )
41454 register_unary_op(details::e_d2g , details::d2g_op )
41455 register_unary_op(details::e_g2d , details::g2d_op )
41456 register_unary_op(details::e_notl , details::notl_op )
41457 register_unary_op(details::e_sgn , details::sgn_op )
41458 register_unary_op(details::e_erf , details::erf_op )
41459 register_unary_op(details::e_erfc , details::erfc_op )
41460 register_unary_op(details::e_ncdf , details::ncdf_op )
41461 register_unary_op(details::e_frac , details::frac_op )
41462 register_unary_op(details::e_trunc , details::trunc_op)
41463 #undef register_unary_op
41464 }
#define register_unary_op(Op, UnaryFunctor)

References exprtk::details::e_abs, exprtk::details::e_acos, exprtk::details::e_acosh, exprtk::details::e_asin, exprtk::details::e_asinh, exprtk::details::e_atanh, exprtk::details::e_ceil, exprtk::details::e_cos, exprtk::details::e_cosh, exprtk::details::e_cot, exprtk::details::e_csc, exprtk::details::e_d2g, exprtk::details::e_d2r, exprtk::details::e_erf, exprtk::details::e_erfc, exprtk::details::e_exp, exprtk::details::e_expm1, exprtk::details::e_floor, exprtk::details::e_frac, exprtk::details::e_g2d, exprtk::details::e_log, exprtk::details::e_log10, exprtk::details::e_log1p, exprtk::details::e_log2, exprtk::details::e_ncdf, exprtk::details::e_neg, exprtk::details::e_notl, exprtk::details::e_pos, exprtk::details::e_r2d, exprtk::details::e_round, exprtk::details::e_sec, exprtk::details::e_sgn, exprtk::details::e_sin, exprtk::details::e_sinc, exprtk::details::e_sinh, exprtk::details::e_sqrt, exprtk::details::e_tan, exprtk::details::e_tanh, exprtk::details::e_trunc, and register_unary_op.

Referenced by exprtk::parser< T >::parser().

Here is the caller graph for this function:

◆ local_variable_is_shadowed()

template<typename T >
bool exprtk::parser< T >::local_variable_is_shadowed ( const std::string &  symbol)
inlineprivate

Definition at line 29552 of file exprtk.hpp.

29553 {
29554 const scope_element& se = sem_.get_element(symbol);
29555 return (se.name == symbol) && se.active;
29556 }
scope_element & get_element(const std::size_t &index)
Definition exprtk.hpp:22419

References exprtk::parser< T >::scope_element::active, exprtk::parser< T >::scope_element_manager::get_element(), exprtk::parser< T >::scope_element::name, and exprtk::parser< T >::sem_.

Referenced by exprtk::parser< T >::parse_define_constvar_statement(), and exprtk::parser< T >::parse_define_var_statement().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ lodge_immutable_symbol()

template<typename T >
void exprtk::parser< T >::lodge_immutable_symbol ( const lexer::token token,
const interval_t  interval 
)
inlineprivate

Definition at line 30636 of file exprtk.hpp.

30637 {
30639 immutable_symtok_map_[interval] = token;
30640 }
bool add_interval(const interval_point_t begin, const interval_point_t end)
Definition exprtk.hpp:22757

References exprtk::parser< T >::interval_container_t< IntervalPointType, RangePolicy >::add_interval(), exprtk::parser< T >::immutable_memory_map_, and exprtk::parser< T >::immutable_symtok_map_.

Referenced by exprtk::parser< T >::parse_string(), exprtk::parser< T >::parse_symtab_symbol(), and exprtk::parser< T >::parse_vector().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ lodge_symbol()

template<typename T >
void exprtk::parser< T >::lodge_symbol ( const std::string &  symbol,
const symbol_type  st 
)
inlineprivate

Definition at line 27805 of file exprtk.hpp.

27807 {
27808 dec_.add_symbol(symbol,st);
27809 }
void add_symbol(const std::string &symbol, const symbol_type st)
Definition exprtk.hpp:23606

References exprtk::parser< T >::dependent_entity_collector::add_symbol(), and exprtk::parser< T >::dec_.

Referenced by exprtk::parser< T >::parse_define_constvar_statement(), exprtk::parser< T >::parse_define_string_statement(), exprtk::parser< T >::parse_define_var_statement(), exprtk::parser< T >::parse_define_vector_statement(), exprtk::parser< T >::parse_string(), exprtk::parser< T >::parse_swap_statement(), exprtk::parser< T >::parse_symtab_symbol(), exprtk::parser< T >::parse_uninitialised_var_statement(), and exprtk::parser< T >::parse_vararg_function().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ make_memory_range() [1/3]

template<typename T >
interval_t exprtk::parser< T >::make_memory_range ( const T &  t)
inlineprivate

Definition at line 30619 of file exprtk.hpp.

30620 {
30621 const T* begin = reinterpret_cast<const T*>(&t);
30622 const T* end = begin + 1;
30623 return interval_t(begin, end);
30624 }
interval_container_t< constvoid * >::interval_t interval_t
Definition exprtk.hpp:30615

Referenced by exprtk::parser< T >::parse_string(), exprtk::parser< T >::parse_symtab_symbol(), and exprtk::parser< T >::parse_vector().

Here is the caller graph for this function:

◆ make_memory_range() [2/3]

template<typename T >
interval_t exprtk::parser< T >::make_memory_range ( const T *  begin,
const std::size_t  size 
)
inlineprivate

Definition at line 30626 of file exprtk.hpp.

30627 {
30628 return interval_t(begin, begin + size);
30629 }

◆ make_memory_range() [3/3]

template<typename T >
interval_t exprtk::parser< T >::make_memory_range ( details::char_cptr  begin,
const std::size_t  size 
)
inlineprivate

Definition at line 30631 of file exprtk.hpp.

30632 {
30633 return interval_t(begin, begin + size);
30634 }

◆ operator=()

template<typename T >
parser< T > & exprtk::parser< T >::operator= ( const parser< T > &  )
private

◆ parse_assert_statement()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_assert_statement ( )
inlineprivate

Definition at line 30350 of file exprtk.hpp.

30351 {
30352 assert(details::imatch(current_token().value, "assert"));
30353
30355 {
30358 current_token(),
30359 "ERR212 - Assert statement within an assert statement is not allowed",
30361
30362 return error_node();
30363 }
30364
30365 scoped_bool_negator sbn(state_.parsing_assert_stmt);
30366
30367 next_token();
30368
30369 std::vector<expression_node_ptr> assert_arg_list(3, error_node());
30370 scoped_vec_delete<expression_node_t> sdd((*this), assert_arg_list);
30371
30372 expression_node_ptr& assert_condition = assert_arg_list[0];
30373 expression_node_ptr& assert_message = assert_arg_list[1];
30374 expression_node_ptr& assert_id = assert_arg_list[2];
30375
30377 {
30380 current_token(),
30381 "ERR213 - Expected '(' at start of assert statement",
30383
30384 return error_node();
30385 }
30386
30387 const token_t start_token = current_token();
30388
30389 // Parse the assert condition
30390 if (0 == (assert_condition = parse_expression()))
30391 {
30394 current_token(),
30395 "ERR214 - Failed to parse condition for assert statement",
30397
30398 return error_node();
30399 }
30400
30401 const token_t end_token = current_token();
30402
30404 {
30406 {
30409 current_token(),
30410 "ERR215 - Expected ',' between condition and message for assert statement",
30412
30413 return error_node();
30414 }
30415 // Parse the assert message
30416 else if (
30417 (0 == (assert_message = parse_expression())) ||
30418 !details::is_generally_string_node(assert_message)
30419 )
30420 {
30423 current_token(),
30424 "ERR216 - " +
30425 (assert_message ?
30426 std::string("Expected string for assert message") :
30427 std::string("Failed to parse message for assert statement")),
30429
30430 return error_node();
30431 }
30432 else if (!token_is(token_t::e_rbracket))
30433 {
30435 {
30438 current_token(),
30439 "ERR217 - Expected ',' between message and ID for assert statement",
30441
30442 return error_node();
30443 }
30444 // Parse assert ID
30445 else if (
30446 (0 == (assert_id = parse_expression())) ||
30448 )
30449 {
30452 current_token(),
30453 "ERR218 - " +
30454 (assert_id ?
30455 std::string("Expected literal string for assert ID") :
30456 std::string("Failed to parse string for assert ID")),
30458
30459 return error_node();
30460 }
30461 else if (!token_is(token_t::e_rbracket))
30462 {
30465 current_token(),
30466 "ERR219 - Expected ')' at start of assert statement",
30468
30469 return error_node();
30470 }
30471 }
30472 }
30473
30475 context.condition = lexer().substr(start_token.position, end_token.position);
30476 context.offet = start_token.position;
30477
30478 if (0 == assert_check_)
30479 {
30480 exprtk_debug(("parse_assert_statement() - assert functionality is disabled. assert condition: %s\n",
30481 context.condition.c_str()));
30482
30483 return new details::null_node<T>();
30484 }
30485
30486 #ifndef exprtk_disable_string_capabilities
30487 if (assert_message && details::is_const_string_node(assert_message))
30488 {
30489 context.message = dynamic_cast<details::string_base_node<T>*>(assert_message)->str();
30490 }
30491
30492 if (assert_id && details::is_const_string_node(assert_id))
30493 {
30494 context.id = dynamic_cast<details::string_base_node<T>*>(assert_id)->str();
30495
30496 if (assert_ids_.end() != assert_ids_.find(context.id))
30497 {
30500 current_token(),
30501 "ERR220 - Duplicate assert ID: " + context.id,
30503
30504 return error_node();
30505 }
30506
30507 assert_ids_.insert(context.id);
30508 free_node(node_allocator_, assert_id);
30509 }
30510 #endif
30511
30512 expression_node_ptr result_node =
30514 assert_condition,
30515 assert_message,
30516 context);
30517
30518 exprtk_debug(("parse_assert_statement() - assert condition: [%s]\n", context.condition.c_str() ));
30519 exprtk_debug(("parse_assert_statement() - assert message: [%s]\n", context.message .c_str() ));
30520 exprtk_debug(("parse_assert_statement() - assert id: [%s]\n", context.id .c_str() ));
30521 exprtk_debug(("parse_assert_statement() - assert offset: [%d]\n", static_cast<int>(context.offet)));
30522
30523 if (0 == result_node)
30524 {
30527 current_token(),
30528 "ERR221 - Failed to synthesize assert",
30530
30531 return error_node();
30532 }
30533
30534 sdd.delete_ptr = false;
30535 return result_node;
30536 }
bool token_is(const token_t::token_type &ttype, const token_advance_mode mode=e_advance)
Definition exprtk.hpp:4418
expression_node_ptr assert_call(expression_node_ptr &assert_condition, expression_node_ptr &assert_message, const assert_check::assert_context &context)
Definition exprtk.hpp:32885
expression_node_ptr parse_expression(precedence_level precedence=e_level00)
Definition exprtk.hpp:25065
static expression_node_ptr error_node()
Definition exprtk.hpp:25405
bool imatch(const char_t c1, const char_t c2)
Definition exprtk.hpp:190
bool match_impl(const Iterator pattern_begin, const Iterator pattern_end, const Iterator data_begin, const Iterator data_end, const typename std::iterator_traits< Iterator >::value_type &zero_or_more, const typename std::iterator_traits< Iterator >::value_type &exactly_one)
Definition exprtk.hpp:598
bool is_const_string_node(const expression_node< T > *node)
Definition exprtk.hpp:18931
bool is_generally_string_node(const expression_node< T > *node)
Definition exprtk.hpp:18985
void free_node(NodeAllocator &, expression_node< T > *&node)
Definition exprtk.hpp:6007

References exprtk::parser< T >::expression_generator< Type >::assert_call(), exprtk::parser< T >::assert_check_, exprtk::parser< T >::assert_ids_, exprtk::assert_check::assert_context::condition, exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scoped_vec_delete< Type >::delete_ptr, exprtk::lexer::token::e_comma, exprtk::lexer::token::e_lbracket, exprtk::lexer::token::e_rbracket, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_debug, exprtk_error_location, exprtk::assert_check::assert_context::id, exprtk::details::imatch(), exprtk::details::is_const_string_node(), exprtk::details::is_generally_string_node(), exprtk::lexer::parser_helper::lexer(), exprtk::details::match_impl(), exprtk::assert_check::assert_context::message, exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::assert_check::assert_context::offet, exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parser_state::parsing_assert_stmt, exprtk::lexer::token::position, exprtk::parser< T >::set_error(), exprtk::parser< T >::state_, exprtk::lexer::generator::substr(), and exprtk::lexer::parser_helper::token_is().

Referenced by exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_base_function_call()

template<typename T >
template<std::size_t MaxNumberofParameters>
std::size_t exprtk::parser< T >::parse_base_function_call ( expression_node_ptr(&)  param_list[MaxNumberofParameters],
const std::string &  function_name = "" 
)
inlineprivate

Definition at line 25760 of file exprtk.hpp.

25761 {
25762 std::fill_n(param_list, MaxNumberofParameters, reinterpret_cast<expression_node_ptr>(0));
25763
25764 scoped_delete<expression_node_t,MaxNumberofParameters> sd((*this),param_list);
25765
25766 next_token();
25767
25769 {
25772 current_token(),
25773 "ERR027 - Expected a '(' at start of function call to '" + function_name +
25774 "', instead got: '" + current_token().value + "'",
25776
25777 return 0;
25778 }
25779
25781 {
25784 current_token(),
25785 "ERR028 - Expected at least one input parameter for function call '" + function_name + "'",
25787
25788 return 0;
25789 }
25790
25791 std::size_t param_index = 0;
25792
25793 for (; param_index < MaxNumberofParameters; ++param_index)
25794 {
25795 param_list[param_index] = parse_expression();
25796
25797 if (0 == param_list[param_index])
25798 return 0;
25799 else if (token_is(token_t::e_rbracket))
25800 {
25801 sd.delete_ptr = false;
25802 break;
25803 }
25804 else if (token_is(token_t::e_comma))
25805 continue;
25806 else
25807 {
25810 current_token(),
25811 "ERR029 - Expected a ',' between function input parameters, instead got: '" + current_token().value + "'",
25813
25814 return 0;
25815 }
25816 }
25817
25818 if (sd.delete_ptr)
25819 {
25822 current_token(),
25823 "ERR030 - Invalid number of input parameters passed to function '" + function_name + "'",
25825
25826 return 0;
25827 }
25828
25829 return (param_index + 1);
25830 }

References exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scoped_delete< Type, N >::delete_ptr, exprtk::lexer::token::e_comma, exprtk::lexer::parser_helper::e_hold, exprtk::lexer::token::e_lbracket, exprtk::lexer::token::e_rbracket, exprtk::parser_error::e_syntax, exprtk_error_location, exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::set_error(), and exprtk::lexer::parser_helper::token_is().

Referenced by exprtk::parser< T >::parse_base_operation().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_base_operation()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_base_operation ( )
inlineprivate

Definition at line 25832 of file exprtk.hpp.

25833 {
25834 typedef std::pair<base_ops_map_t::iterator,base_ops_map_t::iterator> map_range_t;
25835
25836 const std::string operation_name = current_token().value;
25837 const token_t diagnostic_token = current_token();
25838
25839 map_range_t itr_range = base_ops_map_.equal_range(operation_name);
25840
25841 if (0 == std::distance(itr_range.first,itr_range.second))
25842 {
25845 diagnostic_token,
25846 "ERR031 - No entry found for base operation: " + operation_name,
25848
25849 return error_node();
25850 }
25851
25852 static const std::size_t MaxNumberofParameters = 4;
25853 expression_node_ptr param_list[MaxNumberofParameters] = {0};
25854
25855 const std::size_t parameter_count = parse_base_function_call(param_list, operation_name);
25856
25857 if ((parameter_count > 0) && (parameter_count <= MaxNumberofParameters))
25858 {
25859 for (base_ops_map_t::iterator itr = itr_range.first; itr != itr_range.second; ++itr)
25860 {
25861 const details::base_operation_t& operation = itr->second;
25862
25863 if (operation.num_params == parameter_count)
25864 {
25865 switch (parameter_count)
25866 {
25867 #define base_opr_case(N) \
25868 case N : { \
25869 expression_node_ptr pl##N[N] = {0}; \
25870 std::copy(param_list, param_list + N, pl##N); \
25871 lodge_symbol(operation_name, e_st_function); \
25872 return expression_generator_(operation.type, pl##N); \
25873 } \
25874
25875 base_opr_case(1)
25876 base_opr_case(2)
25877 base_opr_case(3)
25878 base_opr_case(4)
25879 #undef base_opr_case
25880 }
25881 }
25882 }
25883 }
25884
25885 for (std::size_t i = 0; i < MaxNumberofParameters; ++i)
25886 {
25887 free_node(node_allocator_, param_list[i]);
25888 }
25889
25892 diagnostic_token,
25893 "ERR032 - Invalid number of input parameters for call to function: '" + operation_name + "'",
25895
25896 return error_node();
25897 }
std::size_t parse_base_function_call(expression_node_ptr(&param_list)[MaxNumberofParameters], const std::string &function_name="")
Definition exprtk.hpp:25760
#define base_opr_case(N)
std::string value
Definition exprtk.hpp:2399

References base_opr_case, exprtk::parser< T >::base_ops_map_, exprtk::lexer::parser_helper::current_token(), exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk_error_location, exprtk::parser< T >::node_allocator_, exprtk::details::base_operation_t::num_params, exprtk::parser< T >::parse_base_function_call(), exprtk::parser< T >::set_error(), and exprtk::lexer::token::value.

Referenced by exprtk::parser< T >::parse_not_statement(), and exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_branch()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_branch ( precedence_level  precedence = e_level00)
inlineprivate

Definition at line 31099 of file exprtk.hpp.

31100 {
31101 stack_limit_handler slh(*this);
31102
31103 if (!slh)
31104 {
31105 return error_node();
31106 }
31107
31109
31110 if (token_t::e_number == current_token().type)
31111 {
31112 T numeric_value = T(0);
31113
31114 if (details::string_to_real(current_token().value, numeric_value))
31115 {
31116 expression_node_ptr literal_exp = expression_generator_(numeric_value);
31117
31118 if (0 == literal_exp)
31119 {
31122 current_token(),
31123 "ERR234 - Failed generate node for scalar: '" + current_token().value + "'",
31125
31126 return error_node();
31127 }
31128
31129 next_token();
31130 branch = literal_exp;
31131 }
31132 else
31133 {
31136 current_token(),
31137 "ERR235 - Failed to convert '" + current_token().value + "' to a number",
31139
31140 return error_node();
31141 }
31142 }
31143 else if (token_t::e_symbol == current_token().type)
31144 {
31145 branch = parse_symbol();
31146 }
31147 #ifndef exprtk_disable_string_capabilities
31148 else if (token_t::e_string == current_token().type)
31149 {
31150 branch = parse_const_string();
31151 }
31152 #endif
31153 else if (token_t::e_lbracket == current_token().type)
31154 {
31155 next_token();
31156
31157 if (0 == (branch = parse_expression()))
31158 return error_node();
31159 else if (token_is(token_t::e_eof))
31160 {}
31161 else if (!token_is(token_t::e_rbracket))
31162 {
31165 current_token(),
31166 "ERR236 - Expected ')' instead of: '" + current_token().value + "'",
31168
31170
31171 return error_node();
31172 }
31173 else if (!post_bracket_process(token_t::e_lbracket,branch))
31174 {
31176
31177 return error_node();
31178 }
31179
31181 }
31182 else if (token_t::e_lsqrbracket == current_token().type)
31183 {
31184 next_token();
31185
31186 if (0 == (branch = parse_expression()))
31187 return error_node();
31189 {
31192 current_token(),
31193 "ERR237 - Expected ']' instead of: '" + current_token().value + "'",
31195
31197
31198 return error_node();
31199 }
31201 {
31203
31204 return error_node();
31205 }
31206 }
31207 else if (token_t::e_lcrlbracket == current_token().type)
31208 {
31209 next_token();
31210
31211 if (0 == (branch = parse_expression()))
31212 return error_node();
31214 {
31217 current_token(),
31218 "ERR238 - Expected '}' instead of: '" + current_token().value + "'",
31220
31222
31223 return error_node();
31224 }
31226 {
31228
31229 return error_node();
31230 }
31231 }
31232 else if (token_t::e_sub == current_token().type)
31233 {
31234 next_token();
31235 branch = parse_expression(e_level11);
31236
31237 if (
31238 branch &&
31239 !(
31240 details::is_neg_unary_node (branch) &&
31242 )
31243 )
31244 {
31246
31247 if (0 == result)
31248 {
31250
31251 return error_node();
31252 }
31253 else
31254 branch = result;
31255 }
31256 }
31257 else if (token_t::e_add == current_token().type)
31258 {
31259 next_token();
31260 branch = parse_expression(e_level13);
31261 }
31262 else if (token_t::e_eof == current_token().type)
31263 {
31266 current_token(),
31267 "ERR239 - Premature end of expression[1]",
31269
31270 return error_node();
31271 }
31272 else
31273 {
31276 current_token(),
31277 "ERR240 - Premature end of expression[2]",
31279
31280 return error_node();
31281 }
31282
31283 if (
31284 branch &&
31285 (e_level00 == precedence) &&
31286 token_is(token_t::e_ternary,prsrhlpr_t::e_hold)
31287 )
31288 {
31289 branch = parse_ternary_conditional_statement(branch);
31290 }
31291
31293
31294 return branch;
31295 }
expression_node_ptr parse_const_string()
Definition exprtk.hpp:27918
void parse_pending_vector_index_operator(expression_node_ptr &expression)
Definition exprtk.hpp:27403
bool post_bracket_process(const typename token_t::token_type &token, expression_node_ptr &branch)
Definition exprtk.hpp:30563
bool simplify_unary_negation_branch(expression_node_ptr &node)
Definition exprtk.hpp:25350
expression_node_ptr parse_ternary_conditional_statement(expression_node_ptr condition)
Definition exprtk.hpp:26295
expression_node_ptr parse_symbol()
Definition exprtk.hpp:30973
bool parse_pending_string_rangesize(expression_node_ptr &expression)
Definition exprtk.hpp:27381
bool string_to_real(Iterator &itr_external, const Iterator end, T &t, numeric::details::real_type_tag)
Definition exprtk.hpp:1932
bool is_neg_unary_node(const expression_node< T > *node)
Definition exprtk.hpp:5667

References exprtk::lexer::parser_helper::current_token(), exprtk::lexer::token::e_add, exprtk::lexer::token::e_eof, exprtk::lexer::token::e_lbracket, exprtk::lexer::token::e_lcrlbracket, exprtk::parser< T >::e_level00, exprtk::parser< T >::e_level11, exprtk::parser< T >::e_level13, exprtk::lexer::token::e_lsqrbracket, exprtk::details::e_neg, exprtk::lexer::token::e_number, exprtk::parser_error::e_numeric, exprtk::lexer::token::e_rbracket, exprtk::lexer::token::e_rcrlbracket, exprtk::lexer::token::e_rsqrbracket, exprtk::lexer::token::e_string, exprtk::lexer::token::e_sub, exprtk::lexer::token::e_symbol, exprtk::parser_error::e_syntax, exprtk::lexer::token::e_ternary, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::details::free_node(), exprtk::details::is_neg_unary_node(), exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_const_string(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parse_pending_string_rangesize(), exprtk::parser< T >::parse_pending_vector_index_operator(), exprtk::parser< T >::parse_symbol(), exprtk::parser< T >::parse_ternary_conditional_statement(), exprtk::parser< T >::post_bracket_process(), exprtk::parser< T >::set_error(), exprtk::parser< T >::simplify_unary_negation_branch(), exprtk::details::string_to_real(), and exprtk::lexer::parser_helper::token_is().

Referenced by exprtk::parser< T >::parse_expression().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_break_statement()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_break_statement ( )
inlineprivate

Definition at line 28911 of file exprtk.hpp.

28912 {
28914 {
28917 current_token(),
28918 "ERR149 - Invoking 'break' within a break call is not allowed",
28920
28921 return error_node();
28922 }
28923 else if (0 == state_.parsing_loop_stmt_count)
28924 {
28927 current_token(),
28928 "ERR150 - Invalid use of 'break', allowed only in the scope of a loop",
28930
28931 return error_node();
28932 }
28933
28934 scoped_bool_negator sbn(state_.parsing_break_stmt);
28935
28936 if (!brkcnt_list_.empty())
28937 {
28938 next_token();
28939
28940 brkcnt_list_.front() = true;
28941
28942 expression_node_ptr return_expr = error_node();
28943
28945 {
28946 if (0 == (return_expr = parse_expression()))
28947 {
28950 current_token(),
28951 "ERR151 - Failed to parse return expression for 'break' statement",
28953
28954 return error_node();
28955 }
28957 {
28960 current_token(),
28961 "ERR152 - Expected ']' at the completion of break's return expression",
28963
28964 free_node(node_allocator_, return_expr);
28965
28966 return error_node();
28967 }
28968 }
28969
28970 state_.activate_side_effect("parse_break_statement()");
28971
28972 return node_allocator_.allocate<details::break_node<T> >(return_expr);
28973 }
28974 else
28975 {
28978 current_token(),
28979 "ERR153 - Invalid use of 'break', allowed only in the scope of a loop",
28981 }
28982
28983 return error_node();
28984 }
expression_node< typename ResultNode::value_type > * allocate(OpType &operation, ExprNode(&branch)[1])
Definition exprtk.hpp:19014
void activate_side_effect(const std::string &)
Definition exprtk.hpp:23400
std::size_t parsing_loop_stmt_count
Definition exprtk.hpp:23421

References exprtk::parser< T >::parser_state::activate_side_effect(), exprtk::details::node_allocator::allocate(), exprtk::parser< T >::brkcnt_list_, exprtk::lexer::parser_helper::current_token(), exprtk::lexer::token::e_lsqrbracket, exprtk::lexer::token::e_rsqrbracket, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk_error_location, exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parser_state::parsing_break_stmt, exprtk::parser< T >::parser_state::parsing_loop_stmt_count, exprtk::parser< T >::set_error(), exprtk::parser< T >::state_, and exprtk::lexer::parser_helper::token_is().

Referenced by exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_conditional_statement()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_conditional_statement ( )
inlineprivate

Definition at line 26232 of file exprtk.hpp.

26233 {
26234 expression_node_ptr condition = error_node();
26235
26236 next_token();
26237
26239 {
26242 current_token(),
26243 "ERR051 - Expected '(' at start of if-statement, instead got: '" + current_token().value + "'",
26245
26246 return error_node();
26247 }
26248 else if (0 == (condition = parse_expression()))
26249 {
26252 current_token(),
26253 "ERR052 - Failed to parse condition for if-statement",
26255
26256 return error_node();
26257 }
26258 else if (token_is(token_t::e_comma,prsrhlpr_t::e_hold))
26259 {
26260 // if (x,y,z)
26261 return parse_conditional_statement_01(condition);
26262 }
26263 else if (token_is(token_t::e_rbracket))
26264 {
26265 /*
26266 00. if (x) y;
26267 01. if (x) y; else z;
26268 02. if (x) y; else {z0; ... zn;}
26269 03. if (x) y; else if (z) w;
26270 04. if (x) y; else if (z) w; else u;
26271 05. if (x) y; else if (z) w; else {u0; ... un;}
26272 06. if (x) y; else if (z) {w0; ... wn;}
26273 07. if (x) {y0; ... yn;}
26274 08. if (x) {y0; ... yn;} else z;
26275 09. if (x) {y0; ... yn;} else {z0; ... zn;};
26276 10. if (x) {y0; ... yn;} else if (z) w;
26277 11. if (x) {y0; ... yn;} else if (z) w; else u;
26278 12. if (x) {y0; ... nex;} else if (z) w; else {u0 ... un;}
26279 13. if (x) {y0; ... yn;} else if (z) {w0; ... wn;}
26280 */
26281 return parse_conditional_statement_02(condition);
26282 }
26283
26286 current_token(),
26287 "ERR053 - Invalid if-statement",
26289
26290 free_node(node_allocator_, condition);
26291
26292 return error_node();
26293 }
expression_node_ptr parse_conditional_statement_01(expression_node_ptr condition)
Definition exprtk.hpp:25899
expression_node_ptr parse_conditional_statement_02(expression_node_ptr condition)
Definition exprtk.hpp:26035

References exprtk::lexer::parser_helper::current_token(), exprtk::lexer::token::e_comma, exprtk::lexer::token::e_lbracket, exprtk::lexer::token::e_rbracket, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk_error_location, exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_conditional_statement_01(), exprtk::parser< T >::parse_conditional_statement_02(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::set_error(), and exprtk::lexer::parser_helper::token_is().

Referenced by exprtk::parser< T >::parse_conditional_statement_02(), and exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_conditional_statement_01()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_conditional_statement_01 ( expression_node_ptr  condition)
inlineprivate

Definition at line 25899 of file exprtk.hpp.

25900 {
25901 // Parse: [if][(][condition][,][consequent][,][alternative][)]
25902
25903 expression_node_ptr consequent = error_node();
25904 expression_node_ptr alternative = error_node();
25905
25906 bool result = true;
25907
25909 {
25912 current_token(),
25913 "ERR033 - Expected ',' between if-statement condition and consequent",
25915
25916 result = false;
25917 }
25918 else if (0 == (consequent = parse_expression()))
25919 {
25922 current_token(),
25923 "ERR034 - Failed to parse consequent for if-statement",
25925
25926 result = false;
25927 }
25928 else if (!token_is(token_t::e_comma))
25929 {
25932 current_token(),
25933 "ERR035 - Expected ',' between if-statement consequent and alternative",
25935
25936 result = false;
25937 }
25938 else if (0 == (alternative = parse_expression()))
25939 {
25942 current_token(),
25943 "ERR036 - Failed to parse alternative for if-statement",
25945
25946 result = false;
25947 }
25948 else if (!token_is(token_t::e_rbracket))
25949 {
25952 current_token(),
25953 "ERR037 - Expected ')' at the end of if-statement",
25955
25956 result = false;
25957 }
25958
25959 #ifndef exprtk_disable_string_capabilities
25960 if (result)
25961 {
25962 const bool consq_is_str = is_generally_string_node(consequent );
25963 const bool alter_is_str = is_generally_string_node(alternative);
25964
25965 if (consq_is_str || alter_is_str)
25966 {
25967 if (consq_is_str && alter_is_str)
25968 {
25969 expression_node_ptr result_node =
25971 .conditional_string(condition, consequent, alternative);
25972
25973 if (result_node && result_node->valid())
25974 {
25975 return result_node;
25976 }
25977
25980 current_token(),
25981 "ERR038 - Failed to synthesize node: conditional_string",
25983
25984 free_node(node_allocator_, result_node);
25985 return error_node();
25986 }
25987
25990 current_token(),
25991 "ERR039 - Return types of if-statement differ: string/non-string",
25993
25994 result = false;
25995 }
25996 }
25997 #endif
25998
25999 if (result)
26000 {
26001 const bool consq_is_vec = is_ivector_node(consequent );
26002 const bool alter_is_vec = is_ivector_node(alternative);
26003
26004 if (consq_is_vec || alter_is_vec)
26005 {
26006 if (consq_is_vec && alter_is_vec)
26007 {
26009 .conditional_vector(condition, consequent, alternative);
26010 }
26011
26014 current_token(),
26015 "ERR040 - Return types of if-statement differ: vector/non-vector",
26017
26018 result = false;
26019 }
26020 }
26021
26022 if (!result)
26023 {
26024 free_node(node_allocator_, condition );
26025 free_node(node_allocator_, consequent );
26026 free_node(node_allocator_, alternative);
26027
26028 return error_node();
26029 }
26030 else
26032 .conditional(condition, consequent, alternative);
26033 }
expression_node_ptr conditional(expression_node_ptr condition, expression_node_ptr consequent, expression_node_ptr alternative) const
Definition exprtk.hpp:32219
expression_node_ptr conditional_vector(expression_node_ptr condition, expression_node_ptr consequent, expression_node_ptr alternative) const
Definition exprtk.hpp:32371
expression_node_ptr conditional_string(expression_node_ptr condition, expression_node_ptr consequent, expression_node_ptr alternative) const
Definition exprtk.hpp:32295
bool is_ivector_node(const expression_node< T > *node)
Definition exprtk.hpp:5756

References exprtk::parser< T >::expression_generator< Type >::conditional(), exprtk::parser< T >::expression_generator< Type >::conditional_string(), exprtk::parser< T >::expression_generator< Type >::conditional_vector(), exprtk::lexer::parser_helper::current_token(), exprtk::lexer::token::e_comma, exprtk::lexer::token::e_rbracket, exprtk::parser_error::e_syntax, exprtk::parser_error::e_synthesis, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_expression(), exprtk::parser< T >::set_error(), exprtk::lexer::parser_helper::token_is(), and exprtk::details::expression_node< T >::valid().

Referenced by exprtk::parser< T >::parse_conditional_statement().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_conditional_statement_02()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_conditional_statement_02 ( expression_node_ptr  condition)
inlineprivate

Definition at line 26035 of file exprtk.hpp.

26036 {
26037 expression_node_ptr consequent = error_node();
26038 expression_node_ptr alternative = error_node();
26039
26040 bool result = true;
26041
26042 if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold))
26043 {
26044 if (0 == (consequent = parse_multi_sequence("if-statement-01")))
26045 {
26048 current_token(),
26049 "ERR041 - Failed to parse body of consequent for if-statement",
26051
26052 result = false;
26053 }
26054 else if
26055 (
26057 !token_is("else",prsrhlpr_t::e_hold) &&
26058 !token_is_loop(prsrhlpr_t::e_hold) &&
26059 !token_is_arithmetic_opr(prsrhlpr_t::e_hold) &&
26060 !token_is_right_bracket (prsrhlpr_t::e_hold) &&
26061 !token_is_ineq_opr (prsrhlpr_t::e_hold) &&
26062 !token_is(token_t::e_ternary,prsrhlpr_t::e_hold) &&
26064 )
26065 {
26068 current_token(),
26069 "ERR042 - Expected ';' at the end of the consequent for if-statement (1)",
26071
26072 result = false;
26073 }
26074 }
26075 else
26076 {
26077 if (
26079 token_is(token_t::e_mul,prsrhlpr_t::e_hold)
26080 )
26081 {
26082 next_token();
26083 }
26084
26085 if (0 != (consequent = parse_expression()))
26086 {
26088 {
26091 current_token(),
26092 "ERR043 - Expected ';' at the end of the consequent for if-statement (2)",
26094
26095 result = false;
26096 }
26097 }
26098 else
26099 {
26102 current_token(),
26103 "ERR044 - Failed to parse body of consequent for if-statement",
26105
26106 result = false;
26107 }
26108 }
26109
26110 if (result)
26111 {
26112 if (details::imatch(current_token().value,"else"))
26113 {
26114 next_token();
26115
26116 if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold))
26117 {
26118 if (0 == (alternative = parse_multi_sequence("else-statement-01")))
26119 {
26122 current_token(),
26123 "ERR045 - Failed to parse body of the 'else' for if-statement",
26125
26126 result = false;
26127 }
26128 }
26129 else if (details::imatch(current_token().value,"if"))
26130 {
26131 if (0 == (alternative = parse_conditional_statement()))
26132 {
26135 current_token(),
26136 "ERR046 - Failed to parse body of if-else statement",
26138
26139 result = false;
26140 }
26141 }
26142 else if (0 != (alternative = parse_expression()))
26143 {
26144 if (
26145 !token_is(token_t::e_ternary,prsrhlpr_t::e_hold) &&
26147 )
26148 {
26151 current_token(),
26152 "ERR047 - Expected ';' at the end of the 'else-if' for the if-statement",
26154
26155 result = false;
26156 }
26157 }
26158 else
26159 {
26162 current_token(),
26163 "ERR048 - Failed to parse body of the 'else' for if-statement",
26165
26166 result = false;
26167 }
26168 }
26169 }
26170
26171 #ifndef exprtk_disable_string_capabilities
26172 if (result)
26173 {
26174 const bool consq_is_str = is_generally_string_node(consequent );
26175 const bool alter_is_str = is_generally_string_node(alternative);
26176
26177 if (consq_is_str || alter_is_str)
26178 {
26179 if (consq_is_str && alter_is_str)
26180 {
26182 .conditional_string(condition, consequent, alternative);
26183 }
26184
26187 current_token(),
26188 "ERR049 - Return types of if-statement differ: string/non-string",
26190
26191 result = false;
26192 }
26193 }
26194 #endif
26195
26196 if (result)
26197 {
26198 const bool consq_is_vec = is_ivector_node(consequent );
26199 const bool alter_is_vec = is_ivector_node(alternative);
26200
26201 if (consq_is_vec || alter_is_vec)
26202 {
26203 if (consq_is_vec && alter_is_vec)
26204 {
26206 .conditional_vector(condition, consequent, alternative);
26207 }
26208
26211 current_token(),
26212 "ERR050 - Return types of if-statement differ: vector/non-vector",
26214
26215 result = false;
26216 }
26217 }
26218
26219 if (!result)
26220 {
26221 free_node(node_allocator_, condition );
26222 free_node(node_allocator_, consequent );
26223 free_node(node_allocator_, alternative);
26224
26225 return error_node();
26226 }
26227 else
26229 .conditional(condition, consequent, alternative);
26230 }
bool token_is_loop(const token_advance_mode mode=e_advance)
Definition exprtk.hpp:4526
bool token_is_arithmetic_opr(const token_advance_mode mode=e_advance)
Definition exprtk.hpp:4460
bool token_is_right_bracket(const token_advance_mode mode=e_advance)
Definition exprtk.hpp:4511
bool token_is_ineq_opr(const token_advance_mode mode=e_advance)
Definition exprtk.hpp:4478
expression_node_ptr parse_conditional_statement()
Definition exprtk.hpp:26232
expression_node_ptr parse_multi_sequence(const std::string &source="", const bool enforce_crlbrackets=false)
Definition exprtk.hpp:27538

References exprtk::parser< T >::settings_store::commutative_check_enabled(), exprtk::parser< T >::expression_generator< Type >::conditional(), exprtk::parser< T >::expression_generator< Type >::conditional_string(), exprtk::parser< T >::expression_generator< Type >::conditional_vector(), exprtk::lexer::parser_helper::current_token(), exprtk::lexer::token::e_eof, exprtk::lexer::token::e_lcrlbracket, exprtk::lexer::token::e_mul, exprtk::parser_error::e_syntax, exprtk::lexer::token::e_ternary, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::details::imatch(), exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_conditional_statement(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parse_multi_sequence(), exprtk::parser< T >::set_error(), exprtk::parser< T >::settings_, exprtk::lexer::parser_helper::token_is(), exprtk::lexer::parser_helper::token_is_arithmetic_opr(), exprtk::lexer::parser_helper::token_is_ineq_opr(), exprtk::lexer::parser_helper::token_is_loop(), and exprtk::lexer::parser_helper::token_is_right_bracket().

Referenced by exprtk::parser< T >::parse_conditional_statement().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_const_string()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_const_string ( )
inlineprivate

Definition at line 27918 of file exprtk.hpp.

27919 {
27920 const std::string const_str = current_token().value;
27921 expression_node_ptr result = expression_generator_(const_str);
27922
27924 {
27925 next_token();
27926
27928 {
27929 next_token();
27930 next_token();
27931
27932 free_node(node_allocator_, result);
27933
27934 return expression_generator_(T(const_str.size()));
27935 }
27936
27937 range_t rp;
27938
27939 if (!parse_range(rp))
27940 {
27941 free_node(node_allocator_, result);
27942 rp.free();
27943
27944 return error_node();
27945 }
27946
27947 free_node(node_allocator_, result);
27948
27949 if (rp.n1_c.first && (rp.n1_c.second == std::numeric_limits<std::size_t>::max()))
27950 {
27951 rp.n1_c.second = const_str.size() - 1;
27952 rp.cache.second = rp.n1_c.second;
27953 }
27954
27955 if (
27956 (rp.n0_c.first && (rp.n0_c.second >= const_str.size())) ||
27957 (rp.n1_c.first && (rp.n1_c.second >= const_str.size()))
27958 )
27959 {
27962 current_token(),
27963 "ERR120 - Overflow in range for string: '" + const_str + "'[" +
27964 (rp.n0_c.first ? details::to_str(static_cast<int>(rp.n0_c.second)) : "?") + ":" +
27965 (rp.n1_c.first ? details::to_str(static_cast<int>(rp.n1_c.second)) : "?") + "]",
27967
27968 rp.free();
27969
27970 return error_node();
27971 }
27972
27973 result = expression_generator_(const_str,rp);
27974
27975 if (result)
27976 rp.clear();
27977 }
27978 else
27979 next_token();
27980
27981 return result;
27982 }
bool peek_token_is(const token_t::token_type &ttype)
Definition exprtk.hpp:4533
bool parse_range(range_t &rp, const bool skip_lsqr=false)
Definition exprtk.hpp:27621
details::range_pack< T > range_t
Definition exprtk.hpp:22228
std::string to_str(int i)
Definition exprtk.hpp:277
std::string to_str(const StringView &view)
Definition exprtk.hpp:4869

References exprtk::details::range_pack< T >::cache, exprtk::details::range_pack< T >::clear(), exprtk::lexer::parser_helper::current_token(), exprtk::lexer::token::e_lsqrbracket, exprtk::lexer::token::e_rsqrbracket, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::details::range_pack< T >::free(), exprtk::details::range_pack< T >::n0_c, exprtk::details::range_pack< T >::n1_c, exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_range(), exprtk::lexer::parser_helper::peek_token_is(), exprtk::parser< T >::set_error(), exprtk::details::to_str(), and exprtk::lexer::token::value.

Referenced by exprtk::parser< T >::parse_branch().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_continue_statement()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_continue_statement ( )
inlineprivate

Definition at line 28986 of file exprtk.hpp.

28987 {
28989 {
28992 current_token(),
28993 "ERR154 - Invalid use of 'continue', allowed only in the scope of a loop",
28995
28996 return error_node();
28997 }
28998 else
28999 {
29000 next_token();
29001
29002 brkcnt_list_.front() = true;
29003 state_.activate_side_effect("parse_continue_statement()");
29004
29006 }
29007 }

References exprtk::parser< T >::parser_state::activate_side_effect(), exprtk::details::node_allocator::allocate(), exprtk::parser< T >::brkcnt_list_, exprtk::lexer::parser_helper::current_token(), exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk_error_location, exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parser_state::parsing_loop_stmt_count, exprtk::parser< T >::set_error(), and exprtk::parser< T >::state_.

Referenced by exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_corpus()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_corpus ( )
inlineprivate

Definition at line 24904 of file exprtk.hpp.

24905 {
24906 std::vector<expression_node_ptr> arg_list;
24907 std::vector<bool> side_effect_list;
24908
24909 scoped_vec_delete<expression_node_t> sdd((*this),arg_list);
24910
24911 lexer::token begin_token;
24912 lexer::token end_token;
24913
24914 for ( ; ; )
24915 {
24917
24918 begin_token = current_token();
24919
24921
24922 if (0 == arg)
24923 {
24924 if (error_list_.empty())
24925 {
24928 current_token(),
24929 "ERR009 - Invalid expression encountered",
24931 }
24932
24933 return error_node();
24934 }
24935 else
24936 {
24937 arg_list.push_back(arg);
24938
24939 side_effect_list.push_back(state_.side_effect_present);
24940
24941 end_token = current_token();
24942
24943 const std::string sub_expr = construct_subexpr(begin_token, end_token);
24944
24945 exprtk_debug(("parse_corpus(%02d) Subexpr: %s\n",
24946 static_cast<int>(arg_list.size() - 1),
24947 sub_expr.c_str()));
24948
24949 exprtk_debug(("parse_corpus(%02d) - Side effect present: %s\n",
24950 static_cast<int>(arg_list.size() - 1),
24951 state_.side_effect_present ? "true" : "false"));
24952
24953 exprtk_debug(("-------------------------------------------------\n"));
24954 }
24955
24956 if (token_is(token_t::e_eof,prsrhlpr_t::e_hold))
24957 {
24958 if (lexer().finished())
24959 break;
24960 else
24961 next_token();
24962 }
24963 }
24964
24965 if (
24966 !arg_list.empty() &&
24967 is_return_node(arg_list.back())
24968 )
24969 {
24970 dec_.final_stmt_return_ = true;
24971 }
24972
24973 const expression_node_ptr result = simplify(arg_list,side_effect_list);
24974
24975 sdd.delete_ptr = (0 == result);
24976
24977 return result;
24978 }
expression_node_ptr simplify(Sequence< expression_node_ptr, Allocator1 > &expression_list, Sequence< bool, Allocator2 > &side_effect_list, const bool specialise_on_final_type=false)
Definition exprtk.hpp:27459
std::string construct_subexpr(lexer::token &begin_token, lexer::token &end_token, const bool cleanup_whitespace=true)
Definition exprtk.hpp:24980
bool is_return_node(const expression_node< T > *node)
Definition exprtk.hpp:5827

References exprtk::parser< T >::construct_subexpr(), exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::dec_, exprtk::parser< T >::scoped_vec_delete< Type >::delete_ptr, exprtk::lexer::token::e_eof, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_list_, exprtk::parser< T >::error_node(), exprtk_debug, exprtk_error_location, exprtk::parser< T >::dependent_entity_collector::final_stmt_return_, exprtk::lexer::parser_helper::lexer(), exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::set_error(), exprtk::parser< T >::parser_state::side_effect_present, exprtk::parser< T >::simplify(), exprtk::parser< T >::state_, and exprtk::lexer::parser_helper::token_is().

Referenced by exprtk::parser< T >::compile().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_define_constvar_statement()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_define_constvar_statement ( )
inlineprivate

Definition at line 29741 of file exprtk.hpp.

29742 {
29744 {
29747 current_token(),
29748 "ERR183 - Illegal const variable definition",
29750
29751 return error_node();
29752 }
29753 else if (!token_is("const"))
29754 {
29757 current_token(),
29758 "ERR184 - Expected 'const' keyword for const-variable definition",
29760
29761 return error_node();
29762 }
29763 else if (!token_is("var"))
29764 {
29767 current_token(),
29768 "ERR185 - Expected 'var' keyword for const-variable definition",
29770
29771 return error_node();
29772 }
29773
29774 const std::string var_name = current_token().value;
29775
29776 expression_node_ptr initialisation_expression = error_node();
29777
29779 {
29782 current_token(),
29783 "ERR186 - Expected a symbol for const-variable definition",
29785
29786 return error_node();
29787 }
29788 else if (details::is_reserved_symbol(var_name))
29789 {
29792 current_token(),
29793 "ERR187 - Illegal redefinition of reserved keyword: '" + var_name + "'",
29795
29796 return error_node();
29797 }
29798 else if (symtab_store_.symbol_exists(var_name))
29799 {
29802 current_token(),
29803 "ERR188 - Illegal redefinition of variable '" + var_name + "'",
29805
29806 return error_node();
29807 }
29808 else if (local_variable_is_shadowed(var_name))
29809 {
29812 current_token(),
29813 "ERR189 - Illegal redefinition of local variable: '" + var_name + "'",
29815
29816 return error_node();
29817 }
29818 else if (token_is(token_t::e_assign))
29819 {
29820 if (0 == (initialisation_expression = parse_expression()))
29821 {
29824 current_token(),
29825 "ERR190 - Failed to parse initialisation expression for const-variable: '" + var_name + "'",
29827
29828 return error_node();
29829 }
29830 else if (!details::is_literal_node(initialisation_expression))
29831 {
29834 current_token(),
29835 "ERR191 - initialisation expression for const-variable: '" + var_name + "' must be a constant/literal",
29837
29838 free_node(node_allocator_, initialisation_expression);
29839
29840 return error_node();
29841 }
29842 }
29843
29844 const T init_value = initialisation_expression->value();
29845
29846 free_node(node_allocator_, initialisation_expression);
29847
29848 expression_node_ptr var_node = reinterpret_cast<expression_node_ptr>(0);
29849
29850 scope_element& se = sem_.get_element(var_name);
29851
29852 if (se.name == var_name)
29853 {
29854 if (se.active)
29855 {
29858 current_token(),
29859 "ERR192 - Illegal redefinition of local variable: '" + var_name + "'",
29861
29862 return error_node();
29863 }
29864 else if (scope_element::e_literal == se.type)
29865 {
29866 var_node = se.var_node;
29867 se.active = true;
29868 se.depth = state_.scope_depth;
29869 se.ref_count++;
29870 }
29871 }
29872
29873 if (0 == var_node)
29874 {
29875 scope_element nse;
29876 nse.name = var_name;
29877 nse.active = true;
29878 nse.ref_count = 1;
29879 nse.type = scope_element::e_literal;
29880 nse.depth = state_.scope_depth;
29881 nse.data = 0;
29882 nse.var_node = node_allocator_.allocate<literal_node_t>(init_value);
29883
29884 if (!sem_.add_element(nse))
29885 {
29888 current_token(),
29889 "ERR193 - Failed to add new local const-variable '" + var_name + "' to SEM",
29891
29892 sem_.free_element(nse);
29893
29894 return error_node();
29895 }
29896
29897 var_node = nse.var_node;
29898
29899 exprtk_debug(("parse_define_constvar_statement() - INFO - Added new local const-variable: %s\n", nse.name.c_str()));
29900 }
29901
29902 state_.activate_side_effect("parse_define_constvar_statement()");
29903
29905
29906 return expression_generator_(var_node->value());
29907 }
bool add_element(const scope_element &se)
Definition exprtk.hpp:22470
void free_element(scope_element &se)
Definition exprtk.hpp:22513
void lodge_symbol(const std::string &symbol, const symbol_type st)
Definition exprtk.hpp:27805
details::literal_node< T > literal_node_t
Definition exprtk.hpp:22195
bool local_variable_is_shadowed(const std::string &symbol)
Definition exprtk.hpp:29552
bool is_reserved_symbol(const std::string &symbol)
Definition exprtk.hpp:529
bool is_literal_node(const expression_node< T > *node)
Definition exprtk.hpp:5655
bool symbol_exists(const std::string &symbol) const
Definition exprtk.hpp:23219

References exprtk::parser< T >::parser_state::activate_side_effect(), exprtk::parser< T >::scope_element::active, exprtk::parser< T >::scope_element_manager::add_element(), exprtk::details::node_allocator::allocate(), exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scope_element::data, exprtk::parser< T >::scope_element::depth, exprtk::lexer::token::e_assign, exprtk::parser< T >::scope_element::e_literal, exprtk::parser< T >::e_st_local_variable, exprtk::lexer::token::e_symbol, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_debug, exprtk_error_location, exprtk::parser< T >::scope_element_manager::free_element(), exprtk::parser< T >::scope_element_manager::get_element(), exprtk::details::is_literal_node(), exprtk::details::is_reserved_symbol(), exprtk::parser< T >::local_variable_is_shadowed(), exprtk::parser< T >::lodge_symbol(), exprtk::parser< T >::scope_element::name, exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_expression(), exprtk::parser< T >::scope_element::ref_count, exprtk::parser< T >::parser_state::scope_depth, exprtk::parser< T >::sem_, exprtk::parser< T >::set_error(), exprtk::parser< T >::settings_, exprtk::parser< T >::state_, exprtk::parser< T >::symtab_store::symbol_exists(), exprtk::parser< T >::symtab_store_, exprtk::lexer::parser_helper::token_is(), exprtk::parser< T >::scope_element::type, exprtk::lexer::token::value, exprtk::details::expression_node< T >::value(), exprtk::parser< T >::scope_element::var_node, and exprtk::parser< T >::settings_store::vardef_disabled().

Referenced by exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_define_string_statement()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_define_string_statement ( const std::string &  str_name,
expression_node_ptr  initialisation_expression 
)
inlineprivate

Definition at line 29474 of file exprtk.hpp.

29475 {
29476 stringvar_node_t* str_node = reinterpret_cast<stringvar_node_t*>(0);
29477
29478 scope_element& se = sem_.get_element(str_name);
29479
29480 if (se.name == str_name)
29481 {
29482 if (se.active)
29483 {
29486 current_token(),
29487 "ERR172 - Illegal redefinition of local variable: '" + str_name + "'",
29489
29490 free_node(node_allocator_, initialisation_expression);
29491
29492 return error_node();
29493 }
29494 else if (scope_element::e_string == se.type)
29495 {
29496 str_node = se.str_node;
29497 se.active = true;
29498 se.depth = state_.scope_depth;
29499 se.ref_count++;
29500 }
29501 }
29502
29503 if (0 == str_node)
29504 {
29505 scope_element nse;
29506 nse.name = str_name;
29507 nse.active = true;
29508 nse.ref_count = 1;
29509 nse.type = scope_element::e_string;
29510 nse.depth = state_.scope_depth;
29511 nse.data = new std::string;
29512 nse.str_node = new stringvar_node_t(*reinterpret_cast<std::string*>(nse.data));
29513
29514 if (!sem_.add_element(nse))
29515 {
29518 current_token(),
29519 "ERR173 - Failed to add new local string variable '" + str_name + "' to SEM",
29521
29522 free_node(node_allocator_, initialisation_expression);
29523
29524 sem_.free_element(nse);
29525
29526 return error_node();
29527 }
29528
29529 str_node = nse.str_node;
29530
29531 exprtk_debug(("parse_define_string_statement() - INFO - Added new local string variable: %s\n", nse.name.c_str()));
29532 }
29533
29535
29536 state_.activate_side_effect("parse_define_string_statement()");
29537
29538 expression_node_ptr branch[2] = {0};
29539
29540 branch[0] = str_node;
29541 branch[1] = initialisation_expression;
29542
29544 }
details::stringvar_node< T > stringvar_node_t
Definition exprtk.hpp:22230

References exprtk::parser< T >::parser_state::activate_side_effect(), exprtk::parser< T >::scope_element::active, exprtk::parser< T >::scope_element_manager::add_element(), exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scope_element::data, exprtk::parser< T >::scope_element::depth, exprtk::details::e_assign, exprtk::parser< T >::e_st_local_string, exprtk::parser< T >::scope_element::e_string, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_debug, exprtk_error_location, exprtk::parser< T >::scope_element_manager::free_element(), exprtk::parser< T >::scope_element_manager::get_element(), exprtk::parser< T >::lodge_symbol(), exprtk::parser< T >::scope_element::name, exprtk::parser< T >::node_allocator_, exprtk::parser< T >::scope_element::ref_count, exprtk::parser< T >::parser_state::scope_depth, exprtk::parser< T >::sem_, exprtk::parser< T >::set_error(), exprtk::parser< T >::state_, exprtk::parser< T >::scope_element::str_node, and exprtk::parser< T >::scope_element::type.

Referenced by exprtk::parser< T >::parse_define_var_statement().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_define_var_statement()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_define_var_statement ( )
inlineprivate

Definition at line 29558 of file exprtk.hpp.

29559 {
29561 {
29564 current_token(),
29565 "ERR174 - Illegal variable definition",
29567
29568 return error_node();
29569 }
29570 else if (!details::imatch(current_token().value,"var"))
29571 {
29572 return error_node();
29573 }
29574 else
29575 next_token();
29576
29577 const std::string var_name = current_token().value;
29578
29579 expression_node_ptr initialisation_expression = error_node();
29580
29582 {
29585 current_token(),
29586 "ERR175 - Expected a symbol for variable definition",
29588
29589 return error_node();
29590 }
29591 else if (details::is_reserved_symbol(var_name))
29592 {
29595 current_token(),
29596 "ERR176 - Illegal redefinition of reserved keyword: '" + var_name + "'",
29598
29599 return error_node();
29600 }
29601 else if (symtab_store_.symbol_exists(var_name))
29602 {
29605 current_token(),
29606 "ERR177 - Illegal redefinition of variable '" + var_name + "'",
29608
29609 return error_node();
29610 }
29611 else if (local_variable_is_shadowed(var_name))
29612 {
29615 current_token(),
29616 "ERR178 - Illegal redefinition of local variable: '" + var_name + "'",
29618
29619 return error_node();
29620 }
29621 else if (token_is(token_t::e_lsqrbracket,prsrhlpr_t::e_hold))
29622 {
29623 return parse_define_vector_statement(var_name);
29624 }
29625 else if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold))
29626 {
29627 return parse_uninitialised_var_statement(var_name);
29628 }
29629 else if (token_is(token_t::e_assign))
29630 {
29631 if (0 == (initialisation_expression = parse_expression()))
29632 {
29635 current_token(),
29636 "ERR179 - Failed to parse initialisation expression",
29638
29639 return error_node();
29640 }
29641 }
29642
29643 if (
29644 !token_is(token_t::e_rbracket , prsrhlpr_t::e_hold) &&
29645 !token_is(token_t::e_rcrlbracket, prsrhlpr_t::e_hold) &&
29646 !token_is(token_t::e_rsqrbracket, prsrhlpr_t::e_hold)
29647 )
29648 {
29649 if (!token_is(token_t::e_eof,prsrhlpr_t::e_hold))
29650 {
29653 current_token(),
29654 "ERR180 - Expected ';' after variable definition",
29656
29657 free_node(node_allocator_, initialisation_expression);
29658
29659 return error_node();
29660 }
29661 }
29662
29663 if (
29664 (0 != initialisation_expression) &&
29665 details::is_generally_string_node(initialisation_expression)
29666 )
29667 {
29668 return parse_define_string_statement(var_name,initialisation_expression);
29669 }
29670
29671 expression_node_ptr var_node = reinterpret_cast<expression_node_ptr>(0);
29672
29673 scope_element& se = sem_.get_element(var_name);
29674
29675 if (se.name == var_name)
29676 {
29677 if (se.active)
29678 {
29681 current_token(),
29682 "ERR181 - Illegal redefinition of local variable: '" + var_name + "'",
29684
29685 free_node(node_allocator_, initialisation_expression);
29686
29687 return error_node();
29688 }
29689 else if (scope_element::e_variable == se.type)
29690 {
29691 var_node = se.var_node;
29692 se.active = true;
29693 se.depth = state_.scope_depth;
29694 se.ref_count++;
29695 }
29696 }
29697
29698 if (0 == var_node)
29699 {
29700 scope_element nse;
29701 nse.name = var_name;
29702 nse.active = true;
29703 nse.ref_count = 1;
29704 nse.type = scope_element::e_variable;
29705 nse.depth = state_.scope_depth;
29706 nse.data = new T(T(0));
29707 nse.var_node = node_allocator_.allocate<variable_node_t>(*reinterpret_cast<T*>(nse.data));
29708
29709 if (!sem_.add_element(nse))
29710 {
29713 current_token(),
29714 "ERR182 - Failed to add new local variable '" + var_name + "' to SEM",
29716
29717 free_node(node_allocator_, initialisation_expression);
29718
29719 sem_.free_element(nse);
29720
29721 return error_node();
29722 }
29723
29724 var_node = nse.var_node;
29725
29726 exprtk_debug(("parse_define_var_statement() - INFO - Added new local variable: %s\n", nse.name.c_str()));
29727 }
29728
29729 state_.activate_side_effect("parse_define_var_statement()");
29730
29732
29733 expression_node_ptr branch[2] = {0};
29734
29735 branch[0] = var_node;
29736 branch[1] = initialisation_expression ? initialisation_expression : expression_generator_(T(0));
29737
29739 }
details::variable_node< T > variable_node_t
Definition exprtk.hpp:22217
expression_node_ptr parse_define_vector_statement(const std::string &vec_name)
Definition exprtk.hpp:29010
expression_node_ptr parse_define_string_statement(const std::string &str_name, expression_node_ptr initialisation_expression)
Definition exprtk.hpp:29474
expression_node_ptr parse_uninitialised_var_statement(const std::string &var_name)
Definition exprtk.hpp:29909

References exprtk::parser< T >::parser_state::activate_side_effect(), exprtk::parser< T >::scope_element::active, exprtk::parser< T >::scope_element_manager::add_element(), exprtk::details::node_allocator::allocate(), exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scope_element::data, exprtk::parser< T >::scope_element::depth, exprtk::lexer::token::e_assign, exprtk::details::e_assign, exprtk::lexer::token::e_eof, exprtk::lexer::token::e_lcrlbracket, exprtk::lexer::token::e_lsqrbracket, exprtk::lexer::token::e_rbracket, exprtk::lexer::token::e_rcrlbracket, exprtk::lexer::token::e_rsqrbracket, exprtk::parser< T >::e_st_local_variable, exprtk::lexer::token::e_symbol, exprtk::parser_error::e_syntax, exprtk::parser< T >::scope_element::e_variable, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_debug, exprtk_error_location, exprtk::parser< T >::scope_element_manager::free_element(), exprtk::parser< T >::scope_element_manager::get_element(), exprtk::details::imatch(), exprtk::details::is_generally_string_node(), exprtk::details::is_reserved_symbol(), exprtk::parser< T >::local_variable_is_shadowed(), exprtk::parser< T >::lodge_symbol(), exprtk::parser< T >::scope_element::name, exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_define_string_statement(), exprtk::parser< T >::parse_define_vector_statement(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parse_uninitialised_var_statement(), exprtk::parser< T >::scope_element::ref_count, exprtk::parser< T >::parser_state::scope_depth, exprtk::parser< T >::sem_, exprtk::parser< T >::set_error(), exprtk::parser< T >::settings_, exprtk::parser< T >::state_, exprtk::parser< T >::symtab_store::symbol_exists(), exprtk::parser< T >::symtab_store_, exprtk::lexer::parser_helper::token_is(), exprtk::parser< T >::scope_element::type, exprtk::lexer::token::value, exprtk::parser< T >::scope_element::var_node, and exprtk::parser< T >::settings_store::vardef_disabled().

Referenced by exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_define_vector_statement()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_define_vector_statement ( const std::string &  vec_name)
inlineprivate

Definition at line 29010 of file exprtk.hpp.

29011 {
29012 expression_node_ptr size_expression_node = error_node();
29013
29015 {
29018 current_token(),
29019 "ERR155 - Expected '[' as part of vector size definition",
29021
29022 return error_node();
29023 }
29024 else if (0 == (size_expression_node = parse_expression()))
29025 {
29028 current_token(),
29029 "ERR156 - Failed to determine size of vector '" + vec_name + "'",
29031
29032 return error_node();
29033 }
29034 else if (!is_constant_node(size_expression_node))
29035 {
29036 const bool is_rebaseble_vector =
29037 (size_expression_node->type() == details::expression_node<T>::e_vecsize) &&
29038 static_cast<details::vector_size_node<T>*>(size_expression_node)->vec_holder()->rebaseable();
29039
29040 free_node(node_allocator_, size_expression_node);
29041
29042 const std::string error_msg = (is_rebaseble_vector) ?
29043 std::string("Rebasable/Resizable vector cannot be used to define the size of vector") :
29044 std::string("Expected a constant literal number as size of vector");
29047 current_token(),
29048 "ERR157 - " + error_msg + " '" + vec_name + "'",
29050
29051 return error_node();
29052 }
29053
29054 const T vector_size = size_expression_node->value();
29055
29056 free_node(node_allocator_, size_expression_node);
29057
29058 const std::size_t max_vector_size = settings_.max_local_vector_size();
29059
29060 if (
29061 (vector_size <= T(0)) ||
29062 std::not_equal_to<T>()
29063 (T(0),vector_size - details::numeric::trunc(vector_size)) ||
29064 (static_cast<std::size_t>(vector_size) > max_vector_size)
29065 )
29066 {
29069 current_token(),
29070 "ERR158 - Invalid vector size. Must be an integer in the "
29071 "range [0," + details::to_str(static_cast<std::size_t>(max_vector_size)) + "], size: " +
29074
29075 return error_node();
29076 }
29077
29079
29080 const std::size_t vec_size = static_cast<std::size_t>(details::numeric::to_int32(vector_size));
29081
29082 scope_element& se = sem_.get_element(vec_name);
29083
29084 if (se.name == vec_name)
29085 {
29086 if (se.active)
29087 {
29090 current_token(),
29091 "ERR159 - Illegal redefinition of local vector: '" + vec_name + "'",
29093
29094 return error_node();
29095 }
29096 else if (
29097 (se.size == vec_size) &&
29098 (scope_element::e_vector == se.type)
29099 )
29100 {
29101 vec_holder = se.vec_node;
29102 se.active = true;
29103 se.depth = state_.scope_depth;
29104 se.ref_count++;
29105 }
29106 }
29107
29108 if (0 == vec_holder)
29109 {
29110 scope_element nse;
29111 nse.name = vec_name;
29112 nse.active = true;
29113 nse.ref_count = 1;
29114 nse.type = scope_element::e_vector;
29115 nse.depth = state_.scope_depth;
29116 nse.size = vec_size;
29117 nse.data = new T[vec_size];
29118 nse.vec_node = new typename scope_element::vector_holder_t(reinterpret_cast<T*>(nse.data),nse.size);
29119
29120 details::set_zero_value(reinterpret_cast<T*>(nse.data),vec_size);
29121
29122 if (!sem_.add_element(nse))
29123 {
29126 current_token(),
29127 "ERR160 - Failed to add new local vector '" + vec_name + "' to SEM",
29129
29130 sem_.free_element(nse);
29131
29132 return error_node();
29133 }
29134
29135 vec_holder = nse.vec_node;
29136
29137 exprtk_debug(("parse_define_vector_statement() - INFO - Added new local vector: %s[%d]\n",
29138 nse.name.c_str(),
29139 static_cast<int>(nse.size)));
29140 }
29141
29142 state_.activate_side_effect("parse_define_vector_statement()");
29143
29145
29146 std::vector<expression_node_ptr> vec_initilizer_list;
29147
29148 scoped_vec_delete<expression_node_t> svd((*this),vec_initilizer_list);
29149
29150 bool single_value_initialiser = false;
29151 bool range_value_initialiser = false;
29152 bool vec_to_vec_initialiser = false;
29153 bool null_initialisation = false;
29154
29156 {
29159 current_token(),
29160 "ERR161 - Expected ']' as part of vector size definition",
29162
29163 return error_node();
29164 }
29165 else if (!token_is(token_t::e_eof))
29166 {
29168 {
29171 current_token(),
29172 "ERR162 - Expected ':=' as part of vector definition",
29174
29175 return error_node();
29176 }
29178 {
29179 expression_node_ptr initialiser_component = parse_expression();
29180
29181 if (0 == initialiser_component)
29182 {
29185 current_token(),
29186 "ERR163 - Failed to parse first component of vector initialiser for vector: " + vec_name,
29188
29189 return error_node();
29190 }
29191
29192 vec_initilizer_list.push_back(initialiser_component);
29193
29195 {
29196 initialiser_component = parse_expression();
29197
29198 if (0 == initialiser_component)
29199 {
29202 current_token(),
29203 "ERR164 - Failed to parse second component of vector initialiser for vector: " + vec_name,
29205
29206 return error_node();
29207 }
29208
29209 vec_initilizer_list.push_back(initialiser_component);
29210 }
29211
29213 {
29216 current_token(),
29217 "ERR165 - Expected ']' to close single value vector initialiser",
29219
29220 return error_node();
29221 }
29222
29223 switch (vec_initilizer_list.size())
29224 {
29225 case 1 : single_value_initialiser = true; break;
29226 case 2 : range_value_initialiser = true; break;
29227 }
29228 }
29230 {
29231 expression_node_ptr initialiser = error_node();
29232
29233 // Is this a vector to vector assignment and initialisation?
29234 if (token_t::e_symbol == current_token().type)
29235 {
29236 // Is it a locally defined vector?
29237 const scope_element& lcl_se = sem_.get_active_element(current_token().value);
29238
29239 if (scope_element::e_vector == lcl_se.type)
29240 {
29241 if (0 != (initialiser = parse_expression()))
29242 vec_initilizer_list.push_back(initialiser);
29243 else
29244 return error_node();
29245 }
29246 // Are we dealing with a user defined vector?
29247 else if (symtab_store_.is_vector(current_token().value))
29248 {
29250
29251 if (0 != (initialiser = parse_expression()))
29252 vec_initilizer_list.push_back(initialiser);
29253 else
29254 return error_node();
29255 }
29256 // Are we dealing with a null initialisation vector definition?
29257 else if (token_is(token_t::e_symbol,"null"))
29258 null_initialisation = true;
29259 }
29260
29261 if (!null_initialisation)
29262 {
29263 if (0 == initialiser)
29264 {
29267 current_token(),
29268 "ERR166 - Expected '{' as part of vector initialiser list",
29270
29271 return error_node();
29272 }
29273 else
29274 vec_to_vec_initialiser = true;
29275 }
29276 }
29278 {
29279 for ( ; ; )
29280 {
29281 expression_node_ptr initialiser = parse_expression();
29282
29283 if (0 == initialiser)
29284 {
29287 current_token(),
29288 "ERR167 - Expected '{' as part of vector initialiser list",
29290
29291 return error_node();
29292 }
29293 else
29294 vec_initilizer_list.push_back(initialiser);
29295
29297 break;
29298
29299 const bool is_next_close = peek_token_is(token_t::e_rcrlbracket);
29300
29301 if (!token_is(token_t::e_comma) && is_next_close)
29302 {
29305 current_token(),
29306 "ERR168 - Expected ',' between vector initialisers",
29308
29309 return error_node();
29310 }
29311
29313 break;
29314 }
29315 }
29316
29317 if (
29318 !token_is(token_t::e_rbracket , prsrhlpr_t::e_hold) &&
29319 !token_is(token_t::e_rcrlbracket, prsrhlpr_t::e_hold) &&
29320 !token_is(token_t::e_rsqrbracket, prsrhlpr_t::e_hold)
29321 )
29322 {
29324 {
29327 current_token(),
29328 "ERR169 - Expected ';' at end of vector definition",
29330
29331 return error_node();
29332 }
29333 }
29334
29335 if (
29336 !single_value_initialiser &&
29337 !range_value_initialiser &&
29338 (T(vec_initilizer_list.size()) > vector_size)
29339 )
29340 {
29343 current_token(),
29344 "ERR170 - Initialiser list larger than the number of elements in the vector: '" + vec_name + "'",
29346
29347 return error_node();
29348 }
29349 }
29350
29352
29353 if (
29354 (vec_initilizer_list.size() == 1) &&
29355 single_value_initialiser
29356 )
29357 {
29358 if (details::is_constant_node(vec_initilizer_list[0]))
29359 {
29360 // vector_init_zero_value_node var v[10] := [0]
29361 if (T(0) == vec_initilizer_list[0]->value())
29362 {
29363 result = node_allocator_
29365 (*vec_holder)[0],
29366 vec_size,
29367 vec_initilizer_list);
29368 }
29369 else
29370 {
29371 // vector_init_single_constvalue_node var v[10] := [123]
29372 result = node_allocator_
29374 (*vec_holder)[0],
29375 vec_size,
29376 vec_initilizer_list);
29377 }
29378 }
29379 else
29380 {
29381 // vector_init_single_value_node var v[10] := [123 + (x / y)]
29382 result = node_allocator_
29384 (*vec_holder)[0],
29385 vec_size,
29386 vec_initilizer_list);
29387 }
29388 }
29389 else if (
29390 (vec_initilizer_list.size() == 2) &&
29391 range_value_initialiser
29392 )
29393 {
29394 bool base_const = details::is_constant_node(vec_initilizer_list[0]);
29395 bool inc_const = details::is_constant_node(vec_initilizer_list[1]);
29396
29397 if (base_const && inc_const)
29398 {
29399 // vector_init_single_value_node var v[10] := [1 : 3.5]
29400 result = node_allocator_
29402 (*vec_holder)[0],
29403 vec_size,
29404 vec_initilizer_list);
29405 }
29406 else if (base_const && !inc_const)
29407 {
29408 // vector_init_single_value_node var v[10] := [1 : x + y]
29409 result = node_allocator_
29411 (*vec_holder)[0],
29412 vec_size,
29413 vec_initilizer_list);
29414 }
29415 else if (!base_const && inc_const)
29416 {
29417 // vector_init_single_value_node var v[10] := [x + y : 3]
29418 result = node_allocator_
29420 (*vec_holder)[0],
29421 vec_size,
29422 vec_initilizer_list);
29423 }
29424 else if (!base_const && !inc_const)
29425 {
29426 // vector_init_single_value_node var v[10] := [x + y : z / w]
29427 result = node_allocator_
29429 (*vec_holder)[0],
29430 vec_size,
29431 vec_initilizer_list);
29432 }
29433 }
29434 else if (null_initialisation)
29435 result = expression_generator_(T(0.0));
29436 else if (vec_to_vec_initialiser)
29437 {
29439
29440 result = expression_generator_(
29442 vec_node,
29443 vec_initilizer_list[0]);
29444 }
29445 else
29446 {
29447 result = node_allocator_
29449 (*vec_holder)[0],
29450 vec_size,
29451 vec_initilizer_list,
29452 single_value_initialiser);
29453 }
29454
29455 svd.delete_ptr = false;
29456
29457 if (result && result->valid())
29458 {
29459 return result;
29460 }
29461
29463
29466 current_token(),
29467 "ERR171 - Failed to generate initialisation node for vector: " + vec_name,
29469
29470 return error_node();
29471 }
scope_element & get_active_element(const std::string &var_name, const std::size_t index=std::numeric_limits< std::size_t >::max())
Definition exprtk.hpp:22448
std::size_t max_local_vector_size() const
Definition exprtk.hpp:24224
details::vector_node< T > vector_node_t
Definition exprtk.hpp:22226
vector_holder_t * vector_holder_ptr
Definition exprtk.hpp:20678
int to_int32(const T v)
Definition exprtk.hpp:1464
bool is_constant_node(const expression_node< T > *node)
Definition exprtk.hpp:5781
T value(details::expression_node< T > *n)
Definition exprtk.hpp:15749
void set_zero_value(T *data, const std::size_t size)
Definition exprtk.hpp:786
details::vector_holder< T > vector_holder_t
Definition exprtk.hpp:22318
bool is_vector(const std::string &vector_name) const
Definition exprtk.hpp:23325

References exprtk::parser< T >::parser_state::activate_side_effect(), exprtk::parser< T >::scope_element::active, exprtk::parser< T >::scope_element_manager::add_element(), exprtk::details::node_allocator::allocate(), exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scope_element::data, exprtk::parser< T >::scoped_vec_delete< Type >::delete_ptr, exprtk::parser< T >::scope_element::depth, exprtk::lexer::token::e_assign, exprtk::details::e_assign, exprtk::lexer::token::e_colon, exprtk::lexer::token::e_comma, exprtk::lexer::token::e_eof, exprtk::lexer::token::e_lcrlbracket, exprtk::lexer::token::e_lsqrbracket, exprtk::lexer::token::e_rbracket, exprtk::lexer::token::e_rcrlbracket, exprtk::lexer::token::e_rsqrbracket, exprtk::parser< T >::e_st_local_vector, exprtk::parser< T >::e_st_vector, exprtk::lexer::token::e_symbol, exprtk::parser_error::e_syntax, exprtk::parser_error::e_synthesis, exprtk::parser< T >::scope_element::e_vector, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_debug, exprtk_error_location, exprtk::parser< T >::scope_element_manager::free_element(), exprtk::details::free_node(), exprtk::parser< T >::scope_element_manager::get_active_element(), exprtk::parser< T >::scope_element_manager::get_element(), exprtk::details::is_constant_node(), exprtk::parser< T >::symtab_store::is_vector(), exprtk::parser< T >::lodge_symbol(), exprtk::parser< T >::settings_store::max_local_vector_size(), exprtk::parser< T >::scope_element::name, exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_expression(), exprtk::lexer::parser_helper::peek_token_is(), exprtk::details::vector_holder< Type >::rebaseable(), exprtk::parser< T >::scope_element::ref_count, exprtk::parser< T >::parser_state::scope_depth, exprtk::parser< T >::sem_, exprtk::parser< T >::set_error(), exprtk::details::set_zero_value(), exprtk::parser< T >::settings_, exprtk::parser< T >::scope_element::size, exprtk::parser< T >::state_, exprtk::parser< T >::symtab_store_, exprtk::details::numeric::to_int32(), exprtk::details::to_str(), exprtk::lexer::parser_helper::token_is(), exprtk::details::numeric::trunc(), exprtk::details::expression_node< T >::type(), exprtk::parser< T >::scope_element::type, exprtk::details::expression_node< T >::valid(), exprtk::details::expression_node< T >::value(), exprtk::details::vector_size_node< T >::vec_holder(), and exprtk::parser< T >::scope_element::vec_node.

Referenced by exprtk::parser< T >::parse_define_var_statement().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_expression()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_expression ( precedence_level  precedence = e_level00)
inlineprivate

Definition at line 25065 of file exprtk.hpp.

25066 {
25068 {
25069 exprtk_debug(("halt_compilation_check() - parse_expression checkpoint 2\n"));
25070 return error_node();
25071 }
25072
25073 stack_limit_handler slh(*this);
25074
25075 if (!slh)
25076 {
25077 return error_node();
25078 }
25079
25080 expression_node_ptr expression = parse_branch(precedence);
25081
25082 if (0 == expression)
25083 {
25084 return error_node();
25085 }
25086
25087 bool break_loop = false;
25088
25089 state_t current_state;
25090
25091 for ( ; ; )
25092 {
25094
25095 switch (current_token().type)
25096 {
25116 default :
25117 if (token_t::e_symbol == current_token().type)
25118 {
25119 static const std::string s_and = "and" ;
25120 static const std::string s_nand = "nand" ;
25121 static const std::string s_or = "or" ;
25122 static const std::string s_nor = "nor" ;
25123 static const std::string s_xor = "xor" ;
25124 static const std::string s_xnor = "xnor" ;
25125 static const std::string s_in = "in" ;
25126 static const std::string s_like = "like" ;
25127 static const std::string s_ilike = "ilike";
25128 static const std::string s_and1 = "&" ;
25129 static const std::string s_or1 = "|" ;
25130 static const std::string s_not = "not" ;
25131
25132 if (details::imatch(current_token().value,s_and))
25133 {
25135 break;
25136 }
25137 else if (details::imatch(current_token().value,s_and1))
25138 {
25139 #ifndef exprtk_disable_sc_andor
25141 #else
25143 #endif
25144 break;
25145 }
25146 else if (details::imatch(current_token().value,s_nand))
25147 {
25149 break;
25150 }
25151 else if (details::imatch(current_token().value,s_or))
25152 {
25154 break;
25155 }
25156 else if (details::imatch(current_token().value,s_or1))
25157 {
25158 #ifndef exprtk_disable_sc_andor
25160 #else
25162 #endif
25163 break;
25164 }
25165 else if (details::imatch(current_token().value,s_nor))
25166 {
25168 break;
25169 }
25170 else if (details::imatch(current_token().value,s_xor))
25171 {
25173 break;
25174 }
25175 else if (details::imatch(current_token().value,s_xnor))
25176 {
25178 break;
25179 }
25180 else if (details::imatch(current_token().value,s_in))
25181 {
25183 break;
25184 }
25185 else if (details::imatch(current_token().value,s_like))
25186 {
25188 break;
25189 }
25190 else if (details::imatch(current_token().value,s_ilike))
25191 {
25193 break;
25194 }
25195 else if (details::imatch(current_token().value,s_not))
25196 {
25197 break;
25198 }
25199 }
25200
25201 break_loop = true;
25202 }
25203
25204 if (break_loop)
25205 {
25207 break;
25208 }
25209 else if (current_state.left < precedence)
25210 break;
25211
25212 const lexer::token prev_token = current_token();
25213
25214 next_token();
25215
25216 expression_node_ptr right_branch = error_node();
25217 expression_node_ptr new_expression = error_node();
25218
25220 {
25221 free_node(node_allocator_, expression);
25222
25225 prev_token,
25226 "ERR011 - Invalid or disabled logic operation '" + details::to_str(current_state.operation) + "'",
25228
25229 return error_node();
25230 }
25232 {
25233 free_node(node_allocator_, expression);
25234
25237 prev_token,
25238 "ERR012 - Invalid or disabled arithmetic operation '" + details::to_str(current_state.operation) + "'",
25240
25241 return error_node();
25242 }
25244 {
25245 free_node(node_allocator_, expression);
25246
25249 prev_token,
25250 "ERR013 - Invalid inequality operation '" + details::to_str(current_state.operation) + "'",
25252
25253 return error_node();
25254 }
25256 {
25257 free_node(node_allocator_, expression);
25258
25261 prev_token,
25262 "ERR014 - Invalid or disabled assignment operation '" + details::to_str(current_state.operation) + "'",
25264
25265 return error_node();
25266 }
25267
25268 if (0 != (right_branch = parse_expression(current_state.right)))
25269 {
25270 if (
25271 details::is_return_node(expression ) ||
25272 details::is_return_node(right_branch)
25273 )
25274 {
25275 free_node(node_allocator_, expression );
25276 free_node(node_allocator_, right_branch);
25277
25280 prev_token,
25281 "ERR015 - Return statements cannot be part of sub-expressions",
25283
25284 return error_node();
25285 }
25286
25288
25289 new_expression = expression_generator_
25290 (
25292 expression,
25293 right_branch
25294 );
25295
25297 }
25298
25299 if (0 == new_expression)
25300 {
25301 if (error_list_.empty())
25302 {
25305 prev_token,
25306 !synthesis_error_.empty() ?
25308 "ERR016 - General parsing error at token: '" + prev_token.value + "'",
25310 }
25311
25312 free_node(node_allocator_, expression );
25313 free_node(node_allocator_, right_branch);
25314
25315 return error_node();
25316 }
25317 else
25318 {
25319 if (
25320 token_is(token_t::e_ternary,prsrhlpr_t::e_hold) &&
25321 (e_level00 == precedence)
25322 )
25323 {
25324 expression = parse_ternary_conditional_statement(new_expression);
25325 }
25326 else
25327 expression = new_expression;
25328
25330 }
25331 }
25332
25333 if ((0 != expression) && (expression->node_depth() > settings_.max_node_depth_))
25334 {
25337 current_token(),
25338 "ERR017 - Expression depth of " + details::to_str(static_cast<int>(expression->node_depth())) +
25339 " exceeds maximum allowed expression depth of " + details::to_str(static_cast<int>(settings_.max_node_depth_)),
25341
25342 free_node(node_allocator_, expression);
25343
25344 return error_node();
25345 }
25346
25347 return expression;
25348 }
bool is_invalid_inequality_operation(const details::operator_type operation) const
Definition exprtk.hpp:24881
bool is_invalid_assignment_operation(const details::operator_type operation) const
Definition exprtk.hpp:24876
bool is_invalid_logic_operation(const details::operator_type operation) const
Definition exprtk.hpp:24866
bool is_invalid_arithmetic_operation(const details::operator_type operation) const
Definition exprtk.hpp:24871
void pop_current_state()
Definition exprtk.hpp:25029
void push_current_state(const state_t current_state)
Definition exprtk.hpp:25024
expression_node_ptr parse_branch(precedence_level precedence=e_level00)
Definition exprtk.hpp:31099
state_t current_state() const
Definition exprtk.hpp:25037
precedence_level right
Definition exprtk.hpp:25019
void set(const precedence_level &l, const precedence_level &r, const details::operator_type &o, const token_t tkn=token_t())
Definition exprtk.hpp:25000
precedence_level left
Definition exprtk.hpp:25018
details::operator_type operation
Definition exprtk.hpp:25020

References exprtk::parser< T >::current_state(), exprtk::lexer::parser_helper::current_token(), exprtk::lexer::token::e_add, exprtk::details::e_add, exprtk::lexer::token::e_addass, exprtk::details::e_addass, exprtk::details::e_and, exprtk::lexer::token::e_assign, exprtk::details::e_assign, exprtk::lexer::token::e_div, exprtk::details::e_div, exprtk::lexer::token::e_divass, exprtk::details::e_divass, exprtk::lexer::token::e_eq, exprtk::details::e_eq, exprtk::lexer::token::e_gt, exprtk::details::e_gt, exprtk::lexer::token::e_gte, exprtk::details::e_gte, exprtk::details::e_ilike, exprtk::details::e_in, exprtk::parser< T >::e_level00, exprtk::parser< T >::e_level01, exprtk::parser< T >::e_level02, exprtk::parser< T >::e_level03, exprtk::parser< T >::e_level04, exprtk::parser< T >::e_level05, exprtk::parser< T >::e_level06, exprtk::parser< T >::e_level07, exprtk::parser< T >::e_level08, exprtk::parser< T >::e_level10, exprtk::parser< T >::e_level11, exprtk::parser< T >::e_level12, exprtk::details::e_like, exprtk::lexer::token::e_lt, exprtk::details::e_lt, exprtk::lexer::token::e_lte, exprtk::details::e_lte, exprtk::lexer::token::e_mod, exprtk::details::e_mod, exprtk::lexer::token::e_modass, exprtk::details::e_modass, exprtk::lexer::token::e_mul, exprtk::details::e_mul, exprtk::lexer::token::e_mulass, exprtk::details::e_mulass, exprtk::details::e_nand, exprtk::lexer::token::e_ne, exprtk::details::e_ne, exprtk::details::e_nor, exprtk::details::e_or, exprtk::lexer::token::e_pow, exprtk::details::e_pow, exprtk::details::e_scand, exprtk::details::e_scor, exprtk::lexer::token::e_sub, exprtk::details::e_sub, exprtk::lexer::token::e_subass, exprtk::details::e_subass, exprtk::lexer::token::e_swap, exprtk::details::e_swap, exprtk::lexer::token::e_symbol, exprtk::parser_error::e_syntax, exprtk::lexer::token::e_ternary, exprtk::details::e_xnor, exprtk::details::e_xor, exprtk::parser< T >::error_list_, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_debug, exprtk_error_location, exprtk::parser< T >::halt_compilation_check(), exprtk::details::imatch(), exprtk::parser< T >::is_invalid_arithmetic_operation(), exprtk::parser< T >::is_invalid_assignment_operation(), exprtk::parser< T >::is_invalid_inequality_operation(), exprtk::parser< T >::is_invalid_logic_operation(), exprtk::details::is_return_node(), exprtk::parser< T >::state_t::left, exprtk::parser< T >::settings_store::max_node_depth_, exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::state_t::operation, exprtk::parser< T >::parse_branch(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parse_pending_string_rangesize(), exprtk::parser< T >::parse_ternary_conditional_statement(), exprtk::parser< T >::pop_current_state(), exprtk::parser< T >::push_current_state(), exprtk::parser< T >::state_t::reset(), exprtk::parser< T >::state_t::right, exprtk::parser< T >::state_t::set(), exprtk::parser< T >::set_error(), exprtk::parser< T >::settings_, exprtk::parser< T >::synthesis_error_, exprtk::details::to_str(), exprtk::lexer::parser_helper::token_is(), and exprtk::lexer::token::value.

Referenced by exprtk::parser< T >::parse_assert_statement(), exprtk::parser< T >::parse_base_function_call(), exprtk::parser< T >::parse_branch(), exprtk::parser< T >::parse_break_statement(), exprtk::parser< T >::parse_conditional_statement(), exprtk::parser< T >::parse_conditional_statement_01(), exprtk::parser< T >::parse_conditional_statement_02(), exprtk::parser< T >::parse_corpus(), exprtk::parser< T >::parse_define_constvar_statement(), exprtk::parser< T >::parse_define_var_statement(), exprtk::parser< T >::parse_define_vector_statement(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parse_for_loop(), exprtk::parser< T >::parse_function_call(), exprtk::parser< T >::parse_generic_function_call(), exprtk::parser< T >::parse_igeneric_function_params(), exprtk::parser< T >::parse_multi_sequence(), exprtk::parser< T >::parse_multi_switch_statement(), exprtk::parser< T >::parse_range(), exprtk::parser< T >::parse_repeat_until_loop(), exprtk::parser< T >::parse_return_statement(), exprtk::parser< T >::parse_switch_statement(), exprtk::parser< T >::parse_ternary_conditional_statement(), exprtk::parser< T >::parse_vararg_function(), exprtk::parser< T >::parse_vararg_function_call(), exprtk::parser< T >::parse_vector_index(), exprtk::parser< T >::parse_while_loop(), and exprtk::parser< T >::parse_special_function_impl< Type, NumberOfParameters >::process().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_for_loop()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_for_loop ( )
inlineprivate

Definition at line 26694 of file exprtk.hpp.

26695 {
26696 expression_node_ptr initialiser = error_node();
26697 expression_node_ptr condition = error_node();
26698 expression_node_ptr incrementor = error_node();
26699 expression_node_ptr loop_body = error_node();
26700
26701 scope_element* se = 0;
26702 bool result = true;
26703
26704 next_token();
26705
26706 scope_handler sh(*this);
26707
26709 {
26712 current_token(),
26713 "ERR075 - Expected '(' at start of for-loop",
26715
26716 return error_node();
26717 }
26718
26720 {
26721 if (
26722 !token_is(token_t::e_symbol,prsrhlpr_t::e_hold) &&
26723 details::imatch(current_token().value,"var")
26724 )
26725 {
26726 next_token();
26727
26728 if (!token_is(token_t::e_symbol,prsrhlpr_t::e_hold))
26729 {
26732 current_token(),
26733 "ERR076 - Expected a variable at the start of initialiser section of for-loop",
26735
26736 return error_node();
26737 }
26739 {
26742 current_token(),
26743 "ERR077 - Expected variable assignment of initialiser section of for-loop",
26745
26746 return error_node();
26747 }
26748
26749 const std::string loop_counter_symbol = current_token().value;
26750
26751 se = &sem_.get_element(loop_counter_symbol);
26752
26753 if ((se->name == loop_counter_symbol) && se->active)
26754 {
26757 current_token(),
26758 "ERR078 - For-loop variable '" + loop_counter_symbol+ "' is being shadowed by a previous declaration",
26760
26761 return error_node();
26762 }
26763 else if (!symtab_store_.is_variable(loop_counter_symbol))
26764 {
26765 if (
26766 !se->active &&
26767 (se->name == loop_counter_symbol) &&
26768 (se->type == scope_element::e_variable)
26769 )
26770 {
26771 se->active = true;
26772 se->ref_count++;
26773 }
26774 else
26775 {
26776 scope_element nse;
26777 nse.name = loop_counter_symbol;
26778 nse.active = true;
26779 nse.ref_count = 1;
26780 nse.type = scope_element::e_variable;
26781 nse.depth = state_.scope_depth;
26782 nse.data = new T(T(0));
26783 nse.var_node = node_allocator_.allocate<variable_node_t>(*reinterpret_cast<T*>(nse.data));
26784
26785 if (!sem_.add_element(nse))
26786 {
26789 current_token(),
26790 "ERR079 - Failed to add new local variable '" + loop_counter_symbol + "' to SEM",
26792
26793 sem_.free_element(nse);
26794
26795 result = false;
26796 }
26797 else
26798 {
26799 exprtk_debug(("parse_for_loop() - INFO - Added new local variable: %s\n", nse.name.c_str()));
26800
26801 state_.activate_side_effect("parse_for_loop()");
26802 }
26803 }
26804 }
26805 }
26806
26807 if (0 == (initialiser = parse_expression()))
26808 {
26811 current_token(),
26812 "ERR080 - Failed to parse initialiser of for-loop",
26814
26815 result = false;
26816 }
26817 else if (!token_is(token_t::e_eof))
26818 {
26821 current_token(),
26822 "ERR081 - Expected ';' after initialiser of for-loop",
26824
26825 result = false;
26826 }
26827 }
26828
26830 {
26831 if (0 == (condition = parse_expression()))
26832 {
26835 current_token(),
26836 "ERR082 - Failed to parse condition of for-loop",
26838
26839 result = false;
26840 }
26841 else if (!token_is(token_t::e_eof))
26842 {
26845 current_token(),
26846 "ERR083 - Expected ';' after condition section of for-loop",
26848
26849 result = false;
26850 }
26851 }
26852
26854 {
26855 if (0 == (incrementor = parse_expression()))
26856 {
26859 current_token(),
26860 "ERR084 - Failed to parse incrementor of for-loop",
26862
26863 result = false;
26864 }
26865 else if (!token_is(token_t::e_rbracket))
26866 {
26869 current_token(),
26870 "ERR085 - Expected ')' after incrementor section of for-loop",
26872
26873 result = false;
26874 }
26875 }
26876
26877 if (result)
26878 {
26879 brkcnt_list_.push_front(false);
26880
26881 scoped_inc_dec sid(state_.parsing_loop_stmt_count);
26882
26883 if (0 == (loop_body = parse_multi_sequence("for-loop", true)))
26884 {
26887 current_token(),
26888 "ERR086 - Failed to parse body of for-loop",
26890
26891 result = false;
26892 }
26893 }
26894
26895 if (!result)
26896 {
26897 if (se)
26898 {
26899 se->ref_count--;
26900 }
26901
26902 free_node(node_allocator_, initialiser);
26903 free_node(node_allocator_, condition );
26904 free_node(node_allocator_, incrementor);
26905 free_node(node_allocator_, loop_body );
26906 return error_node();
26907 }
26908
26909 expression_node_ptr result_node =
26910 expression_generator_.for_loop(initialiser,
26911 condition,
26912 incrementor,
26913 loop_body,
26914 brkcnt_list_.front());
26916
26917 if (result_node && result_node->valid())
26918 {
26919 return result_node;
26920 }
26921
26924 current_token(),
26925 "ERR087 - Failed to synthesize 'valid' for-loop",
26927
26928 free_node(node_allocator_, result_node);
26929
26930 return error_node();
26931 }
expression_node_ptr for_loop(expression_node_ptr &initialiser, expression_node_ptr &condition, expression_node_ptr &incrementor, expression_node_ptr &loop_body, bool break_continue_present=false) const
Definition exprtk.hpp:32562
void handle_brkcnt_scope_exit()
Definition exprtk.hpp:26431
bool is_variable(const std::string &variable_name) const
Definition exprtk.hpp:23237

References exprtk::parser< T >::parser_state::activate_side_effect(), exprtk::parser< T >::scope_element::active, exprtk::parser< T >::scope_element_manager::add_element(), exprtk::details::node_allocator::allocate(), exprtk::parser< T >::brkcnt_list_, exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scope_element::data, exprtk::parser< T >::scope_element::depth, exprtk::lexer::token::e_assign, exprtk::lexer::token::e_eof, exprtk::lexer::token::e_lbracket, exprtk::lexer::token::e_rbracket, exprtk::lexer::token::e_symbol, exprtk::parser_error::e_syntax, exprtk::parser_error::e_synthesis, exprtk::parser< T >::scope_element::e_variable, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_debug, exprtk_error_location, exprtk::parser< T >::expression_generator< Type >::for_loop(), exprtk::parser< T >::scope_element_manager::free_element(), exprtk::parser< T >::scope_element_manager::get_element(), exprtk::parser< T >::handle_brkcnt_scope_exit(), exprtk::details::imatch(), exprtk::parser< T >::symtab_store::is_variable(), exprtk::parser< T >::scope_element::name, exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parse_multi_sequence(), exprtk::parser< T >::parser_state::parsing_loop_stmt_count, exprtk::lexer::parser_helper::peek_token_is(), exprtk::parser< T >::scope_element::ref_count, exprtk::parser< T >::parser_state::scope_depth, exprtk::parser< T >::sem_, exprtk::parser< T >::set_error(), exprtk::parser< T >::state_, exprtk::parser< T >::symtab_store_, exprtk::lexer::parser_helper::token_is(), exprtk::parser< T >::scope_element::type, exprtk::details::expression_node< T >::valid(), exprtk::lexer::token::value, and exprtk::parser< T >::scope_element::var_node.

Referenced by exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_function_call()

template<typename T >
template<std::size_t NumberofParameters>
expression_node_ptr exprtk::parser< T >::parse_function_call ( ifunction< T > *  function,
const std::string &  function_name 
)
inlineprivate

Definition at line 25645 of file exprtk.hpp.

25646 {
25647 #ifdef _MSC_VER
25648 #pragma warning(push)
25649 #pragma warning(disable: 4127)
25650 #endif
25651 if (0 == NumberofParameters)
25652 {
25655 current_token(),
25656 "ERR021 - Expecting ifunction '" + function_name + "' to have non-zero parameter count",
25658
25659 return error_node();
25660 }
25661 #ifdef _MSC_VER
25662 #pragma warning(pop)
25663 #endif
25664
25665 expression_node_ptr branch[NumberofParameters];
25667
25668 std::fill_n(branch, NumberofParameters, reinterpret_cast<expression_node_ptr>(0));
25669
25670 scoped_delete<expression_node_t,NumberofParameters> sd((*this),branch);
25671
25672 next_token();
25673
25675 {
25678 current_token(),
25679 "ERR022 - Expecting argument list for function: '" + function_name + "'",
25681
25682 return error_node();
25683 }
25684
25685 for (int i = 0; i < static_cast<int>(NumberofParameters); ++i)
25686 {
25687 branch[i] = parse_expression();
25688
25689 if (0 == branch[i])
25690 {
25693 current_token(),
25694 "ERR023 - Failed to parse argument " + details::to_str(i) + " for function: '" + function_name + "'",
25696
25697 return error_node();
25698 }
25699 else if (i < static_cast<int>(NumberofParameters - 1))
25700 {
25702 {
25705 current_token(),
25706 "ERR024 - Invalid number of arguments for function: '" + function_name + "'",
25708
25709 return error_node();
25710 }
25711 }
25712 }
25713
25715 {
25718 current_token(),
25719 "ERR025 - Invalid number of arguments for function: '" + function_name + "'",
25721
25722 return error_node();
25723 }
25724 else
25725 result = expression_generator_.function(function,branch);
25726
25727 sd.delete_ptr = (0 == result);
25728
25729 return result;
25730 }
expression_node_ptr function(ifunction_t *f, expression_node_ptr(&b)[N])
Definition exprtk.hpp:33381

References exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scoped_delete< Type, N >::delete_ptr, exprtk::lexer::token::e_comma, exprtk::lexer::token::e_lbracket, exprtk::lexer::token::e_rbracket, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::parser< T >::expression_generator< Type >::function(), exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::set_error(), exprtk::details::to_str(), and exprtk::lexer::parser_helper::token_is().

Here is the call graph for this function:

◆ parse_function_call_0()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_function_call_0 ( ifunction< T > *  function,
const std::string &  function_name 
)
inlineprivate

Definition at line 25732 of file exprtk.hpp.

25733 {
25735
25736 state_.side_effect_present = function->has_side_effects();
25737
25738 next_token();
25739
25740 if (
25743 )
25744 {
25747 current_token(),
25748 "ERR026 - Expecting '()' to proceed call to function: '" + function_name + "'",
25750
25751 free_node(node_allocator_, result);
25752
25753 return error_node();
25754 }
25755 else
25756 return result;
25757 }

References exprtk::lexer::parser_helper::current_token(), exprtk::lexer::token::e_lbracket, exprtk::lexer::token::e_rbracket, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::parser< T >::expression_generator< Type >::function(), exprtk::function_traits::has_side_effects(), exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::set_error(), exprtk::parser< T >::parser_state::side_effect_present, exprtk::parser< T >::state_, and exprtk::lexer::parser_helper::token_is().

Referenced by exprtk::parser< T >::parse_function_invocation().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_function_invocation()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_function_invocation ( ifunction< T > *  function,
const std::string &  function_name 
)
inlineprivate

Definition at line 25592 of file exprtk.hpp.

25593 {
25594 expression_node_ptr func_node = reinterpret_cast<expression_node_ptr>(0);
25595
25596 switch (function->param_count)
25597 {
25598 case 0 : func_node = parse_function_call_0 (function,function_name); break;
25599 case 1 : func_node = parse_function_call< 1>(function,function_name); break;
25600 case 2 : func_node = parse_function_call< 2>(function,function_name); break;
25601 case 3 : func_node = parse_function_call< 3>(function,function_name); break;
25602 case 4 : func_node = parse_function_call< 4>(function,function_name); break;
25603 case 5 : func_node = parse_function_call< 5>(function,function_name); break;
25604 case 6 : func_node = parse_function_call< 6>(function,function_name); break;
25605 case 7 : func_node = parse_function_call< 7>(function,function_name); break;
25606 case 8 : func_node = parse_function_call< 8>(function,function_name); break;
25607 case 9 : func_node = parse_function_call< 9>(function,function_name); break;
25608 case 10 : func_node = parse_function_call<10>(function,function_name); break;
25609 case 11 : func_node = parse_function_call<11>(function,function_name); break;
25610 case 12 : func_node = parse_function_call<12>(function,function_name); break;
25611 case 13 : func_node = parse_function_call<13>(function,function_name); break;
25612 case 14 : func_node = parse_function_call<14>(function,function_name); break;
25613 case 15 : func_node = parse_function_call<15>(function,function_name); break;
25614 case 16 : func_node = parse_function_call<16>(function,function_name); break;
25615 case 17 : func_node = parse_function_call<17>(function,function_name); break;
25616 case 18 : func_node = parse_function_call<18>(function,function_name); break;
25617 case 19 : func_node = parse_function_call<19>(function,function_name); break;
25618 case 20 : func_node = parse_function_call<20>(function,function_name); break;
25619 default : {
25622 current_token(),
25623 "ERR019 - Invalid number of parameters for function: '" + function_name + "'",
25625
25626 return error_node();
25627 }
25628 }
25629
25630 if (func_node)
25631 return func_node;
25632 else
25633 {
25636 current_token(),
25637 "ERR020 - Failed to generate call to function: '" + function_name + "'",
25639
25640 return error_node();
25641 }
25642 }
expression_node_ptr parse_function_call_0(ifunction< T > *function, const std::string &function_name)
Definition exprtk.hpp:25732

References exprtk::lexer::parser_helper::current_token(), exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk_error_location, exprtk::ifunction< T >::param_count, exprtk::parser< T >::parse_function_call_0(), and exprtk::parser< T >::set_error().

Referenced by exprtk::parser< T >::parse_symtab_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_generic_function_call()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_generic_function_call ( igeneric_function< T > *  function,
const std::string &  function_name 
)
inlineprivate

Definition at line 28480 of file exprtk.hpp.

28481 {
28482 std::vector<expression_node_ptr> arg_list;
28483
28484 scoped_vec_delete<expression_node_t> sdd((*this),arg_list);
28485
28486 next_token();
28487
28488 std::string param_type_list;
28489
28490 type_checker tc(
28491 (*this),
28492 function_name,
28493 function->parameter_sequence,
28495
28496 if (tc.invalid())
28497 {
28500 current_token(),
28501 "ERR134 - Type checker instantiation failure for generic function: " + function_name,
28503
28504 return error_node();
28505 }
28506
28508 {
28510 {
28511 if (
28512 !function->allow_zero_parameters() &&
28513 !tc .allow_zero_parameters()
28514 )
28515 {
28518 current_token(),
28519 "ERR135 - Zero parameter call to generic function: "
28520 + function_name + " not allowed",
28522
28523 return error_node();
28524 }
28525 }
28526 else
28527 {
28528 for ( ; ; )
28529 {
28531
28532 if (0 == arg)
28533 return error_node();
28534
28535 if (is_ivector_node(arg))
28536 param_type_list += 'V';
28537 else if (is_generally_string_node(arg))
28538 param_type_list += 'S';
28539 else // Everything else is assumed to be a scalar returning expression
28540 param_type_list += 'T';
28541
28542 arg_list.push_back(arg);
28543
28545 break;
28546 else if (!token_is(token_t::e_comma))
28547 {
28550 current_token(),
28551 "ERR136 - Expected ',' for call to generic function: " + function_name,
28553
28554 return error_node();
28555 }
28556 }
28557 }
28558 }
28559 else if (
28560 !function->parameter_sequence.empty() &&
28561 function->allow_zero_parameters () &&
28562 !tc .allow_zero_parameters ()
28563 )
28564 {
28567 current_token(),
28568 "ERR137 - Zero parameter call to generic function: "
28569 + function_name + " not allowed",
28571
28572 return error_node();
28573 }
28574
28575 std::size_t param_seq_index = 0;
28576
28577 if (
28579 !tc.verify(param_type_list, param_seq_index)
28580 )
28581 {
28584 current_token(),
28585 "ERR138 - Invalid input parameter sequence for call to generic function: " + function_name,
28587
28588 return error_node();
28589 }
28590
28592
28593 result = (tc.paramseq_count() <= 1) ?
28595 .generic_function_call(function, arg_list) :
28597 .generic_function_call(function, arg_list, param_seq_index);
28598
28599 sdd.delete_ptr = (0 == result);
28600
28601 return result;
28602 }
expression_node_ptr generic_function_call(igeneric_function_t *gf, std::vector< expression_node_ptr > &arg_list, const std::size_t &param_seq_index=std::numeric_limits< std::size_t >::max())
Definition exprtk.hpp:33482

References exprtk::function_traits::allow_zero_parameters(), exprtk::parser< T >::type_checker::allow_zero_parameters(), exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scoped_vec_delete< Type >::delete_ptr, exprtk::lexer::token::e_comma, exprtk::lexer::token::e_lbracket, exprtk::lexer::token::e_rbracket, exprtk::parser< T >::type_checker::e_string, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::parser< T >::expression_generator< Type >::generic_function_call(), exprtk::parser< T >::type_checker::invalid(), exprtk::lexer::parser_helper::next_token(), exprtk::igeneric_function< T >::parameter_sequence, exprtk::parser< T >::type_checker::paramseq_count(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::set_error(), exprtk::parser< T >::state_, exprtk::lexer::parser_helper::token_is(), exprtk::parser< T >::parser_state::type_check_enabled, and exprtk::parser< T >::type_checker::verify().

Referenced by exprtk::parser< T >::parse_symtab_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_igeneric_function_params()

template<typename T >
bool exprtk::parser< T >::parse_igeneric_function_params ( std::string &  param_type_list,
std::vector< expression_node_ptr > &  arg_list,
const std::string &  function_name,
igeneric_function< T > *  function,
const type_checker tc 
)
inlineprivate

Definition at line 28604 of file exprtk.hpp.

28609 {
28611 {
28613 {
28614 if (
28615 !function->allow_zero_parameters() &&
28616 !tc .allow_zero_parameters()
28617 )
28618 {
28621 current_token(),
28622 "ERR139 - Zero parameter call to generic function: "
28623 + function_name + " not allowed",
28625
28626 return false;
28627 }
28628 }
28629 else
28630 {
28631 for ( ; ; )
28632 {
28634
28635 if (0 == arg)
28636 return false;
28637
28638 if (is_ivector_node(arg))
28639 param_type_list += 'V';
28640 else if (is_generally_string_node(arg))
28641 param_type_list += 'S';
28642 else // Everything else is a scalar returning expression
28643 param_type_list += 'T';
28644
28645 arg_list.push_back(arg);
28646
28648 break;
28649 else if (!token_is(token_t::e_comma))
28650 {
28653 current_token(),
28654 "ERR140 - Expected ',' for call to string function: " + function_name,
28656
28657 return false;
28658 }
28659 }
28660 }
28661
28662 return true;
28663 }
28664 else
28665 return false;
28666 }

References exprtk::function_traits::allow_zero_parameters(), exprtk::parser< T >::type_checker::allow_zero_parameters(), exprtk::lexer::parser_helper::current_token(), exprtk::lexer::token::e_comma, exprtk::lexer::token::e_lbracket, exprtk::lexer::token::e_rbracket, exprtk::parser_error::e_syntax, exprtk_error_location, exprtk::parser< T >::parse_expression(), exprtk::parser< T >::set_error(), and exprtk::lexer::parser_helper::token_is().

Referenced by exprtk::parser< T >::parse_overload_function_call(), and exprtk::parser< T >::parse_string_function_call().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_multi_sequence()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_multi_sequence ( const std::string &  source = "",
const bool  enforce_crlbrackets = false 
)
inlineprivate

Definition at line 27538 of file exprtk.hpp.

27540 {
27544
27545 if (!token_is(open_bracket))
27546 {
27547 if (!enforce_crlbrackets && token_is(token_t::e_lbracket))
27548 {
27549 open_bracket = token_t::e_lbracket;
27550 close_bracket = token_t::e_rbracket;
27551 separator = token_t::e_comma;
27552 }
27553 else
27554 {
27557 current_token(),
27558 "ERR109 - Expected '" + token_t::to_str(open_bracket) + "' for call to multi-sequence" +
27559 ((!source.empty()) ? std::string(" section of " + source): ""),
27561
27562 return error_node();
27563 }
27564 }
27565 else if (token_is(close_bracket))
27566 {
27568 }
27569
27570 std::vector<expression_node_ptr> arg_list;
27571 std::vector<bool> side_effect_list;
27572
27574
27575 scoped_vec_delete<expression_node_t> sdd((*this),arg_list);
27576
27577 scope_handler sh(*this);
27578
27579 scoped_bool_or_restorer sbr(state_.side_effect_present);
27580
27581 for ( ; ; )
27582 {
27584
27586
27587 if (0 == arg)
27588 return error_node();
27589 else
27590 {
27591 arg_list.push_back(arg);
27592 side_effect_list.push_back(state_.side_effect_present);
27593 }
27594
27595 if (token_is(close_bracket))
27596 break;
27597
27598 const bool is_next_close = peek_token_is(close_bracket);
27599
27600 if (!token_is(separator) && is_next_close)
27601 {
27604 current_token(),
27605 "ERR110 - Expected '" + details::to_str(separator) + "' for call to multi-sequence section of " + source,
27607
27608 return error_node();
27609 }
27610
27611 if (token_is(close_bracket))
27612 break;
27613 }
27614
27615 result = simplify(arg_list, side_effect_list, source.empty());
27616
27617 sdd.delete_ptr = (0 == result);
27618 return result;
27619 }
static std::string to_str(token_type t)
Definition exprtk.hpp:2340

References exprtk::details::node_allocator::allocate(), exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scoped_vec_delete< Type >::delete_ptr, exprtk::lexer::token::e_comma, exprtk::lexer::token::e_eof, exprtk::lexer::token::e_lbracket, exprtk::lexer::token::e_lcrlbracket, exprtk::lexer::token::e_rbracket, exprtk::lexer::token::e_rcrlbracket, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk_error_location, exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_expression(), exprtk::lexer::parser_helper::peek_token_is(), exprtk::parser< T >::set_error(), exprtk::parser< T >::parser_state::side_effect_present, exprtk::parser< T >::simplify(), exprtk::parser< T >::state_, exprtk::details::to_str(), exprtk::lexer::token::to_str(), and exprtk::lexer::parser_helper::token_is().

Referenced by exprtk::parser< T >::parse_conditional_statement_02(), exprtk::parser< T >::parse_for_loop(), exprtk::parser< T >::parse_multi_switch_statement(), exprtk::parser< T >::parse_switch_statement(), exprtk::parser< T >::parse_vararg_function(), and exprtk::parser< T >::parse_while_loop().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_multi_switch_statement()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_multi_switch_statement ( )
inlineprivate

Definition at line 27106 of file exprtk.hpp.

27107 {
27108 std::vector<expression_node_ptr> arg_list;
27109
27110 if (!details::imatch(current_token().value,"[*]"))
27111 {
27114 current_token(),
27115 "ERR096 - Expected token '[*]'",
27117
27118 return error_node();
27119 }
27120
27121 scoped_vec_delete<expression_node_t> svd((*this),arg_list);
27122
27123 next_token();
27124
27126 {
27129 current_token(),
27130 "ERR097 - Expected '{' for call to [*] statement",
27132
27133 return error_node();
27134 }
27135
27136 for ( ; ; )
27137 {
27138 if (!details::imatch("case",current_token().value))
27139 {
27142 current_token(),
27143 "ERR098 - Expected a 'case' statement for multi-switch",
27145
27146 return error_node();
27147 }
27148
27149 next_token();
27150
27152
27153 if (0 == condition)
27154 return error_node();
27155
27157 {
27160 current_token(),
27161 "ERR099 - Expected ':' for case of [*] statement",
27163
27164 return error_node();
27165 }
27166
27167 expression_node_ptr consequent =
27168 (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold)) ?
27169 parse_multi_sequence("multi-switch-consequent") :
27171
27172 if (0 == consequent)
27173 return error_node();
27174
27176 {
27179 current_token(),
27180 "ERR100 - Expected ';' at end of case for [*] statement",
27182
27183 return error_node();
27184 }
27185
27186 // Can we optimise away the case statement?
27187 if (is_constant_node(condition) && is_false(condition))
27188 {
27189 free_node(node_allocator_, condition );
27190 free_node(node_allocator_, consequent);
27191 }
27192 else
27193 {
27194 arg_list.push_back(condition );
27195 arg_list.push_back(consequent);
27196 }
27197
27198 if (token_is(token_t::e_rcrlbracket,prsrhlpr_t::e_hold))
27199 {
27200 break;
27201 }
27202 }
27203
27205 {
27208 current_token(),
27209 "ERR101 - Expected '}' at end of [*] statement",
27211
27212 return error_node();
27213 }
27214
27216
27217 svd.delete_ptr = (0 == result);
27218
27219 return result;
27220 }
expression_node_ptr multi_switch_statement(Sequence< expression_node_ptr, Allocator > &arg_list)
Definition exprtk.hpp:32871
bool is_false(const complex_t v)

References exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scoped_vec_delete< Type >::delete_ptr, exprtk::lexer::token::e_colon, exprtk::lexer::token::e_eof, exprtk::lexer::token::e_lcrlbracket, exprtk::lexer::token::e_rcrlbracket, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::details::imatch(), exprtk::parser< T >::expression_generator< Type >::multi_switch_statement(), exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parse_multi_sequence(), exprtk::parser< T >::set_error(), and exprtk::lexer::parser_helper::token_is().

Referenced by exprtk::parser< T >::parse_vararg_function().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_not_statement()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_not_statement ( )
inlineprivate

Definition at line 26415 of file exprtk.hpp.

26416 {
26417 if (settings_.logic_disabled("not"))
26418 {
26421 current_token(),
26422 "ERR061 - Invalid or disabled logic operation 'not'",
26424
26425 return error_node();
26426 }
26427
26428 return parse_base_operation();
26429 }
expression_node_ptr parse_base_operation()
Definition exprtk.hpp:25832

References exprtk::lexer::parser_helper::current_token(), exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk_error_location, exprtk::parser< T >::settings_store::logic_disabled(), exprtk::parser< T >::parse_base_operation(), exprtk::parser< T >::set_error(), and exprtk::parser< T >::settings_.

Referenced by exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_null_statement()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_null_statement ( )
inlineprivate

Definition at line 28904 of file exprtk.hpp.

28905 {
28906 next_token();
28908 }

References exprtk::details::node_allocator::allocate(), exprtk::lexer::parser_helper::next_token(), and exprtk::parser< T >::node_allocator_.

Referenced by exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_overload_function_call()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_overload_function_call ( igeneric_function< T > *  function,
const std::string &  function_name 
)
inlineprivate

Definition at line 28720 of file exprtk.hpp.

28721 {
28722 // Move pass the function name
28723 next_token();
28724
28725 std::string param_type_list;
28726
28727 type_checker tc((*this), function_name, function->parameter_sequence, type_checker::e_overload);
28728
28729 if (
28730 (!function->parameter_sequence.empty()) &&
28731 (0 == tc.paramseq_count())
28732 )
28733 {
28734 return error_node();
28735 }
28736
28737 std::vector<expression_node_ptr> arg_list;
28738 scoped_vec_delete<expression_node_t> sdd((*this),arg_list);
28739
28740 if (!parse_igeneric_function_params(param_type_list, arg_list, function_name, function, tc))
28741 {
28742 return error_node();
28743 }
28744
28745 std::size_t param_seq_index = 0;
28746
28747 if (!tc.verify(param_type_list, param_seq_index))
28748 {
28751 current_token(),
28752 "ERR142 - Invalid input parameter sequence for call to overloaded function: " + function_name,
28754
28755 return error_node();
28756 }
28757
28759
28760 if (type_checker::e_numeric == tc.return_type(param_seq_index))
28761 {
28762 if (tc.paramseq_count() <= 1)
28763 result = expression_generator_
28764 .generic_function_call(function, arg_list);
28765 else
28766 result = expression_generator_
28767 .generic_function_call(function, arg_list, param_seq_index);
28768 }
28769 else if (type_checker::e_string == tc.return_type(param_seq_index))
28770 {
28771 if (tc.paramseq_count() <= 1)
28772 result = expression_generator_
28773 .string_function_call(function, arg_list);
28774 else
28775 result = expression_generator_
28776 .string_function_call(function, arg_list, param_seq_index);
28777 }
28778 else
28779 {
28782 current_token(),
28783 "ERR143 - Invalid return type for call to overloaded function: " + function_name,
28785 }
28786
28787 sdd.delete_ptr = (0 == result);
28788 return result;
28789 }
expression_node_ptr string_function_call(igeneric_function_t *gf, std::vector< expression_node_ptr > &arg_list, const std::size_t &param_seq_index=std::numeric_limits< std::size_t >::max())
Definition exprtk.hpp:33557
bool parse_igeneric_function_params(std::string &param_type_list, std::vector< expression_node_ptr > &arg_list, const std::string &function_name, igeneric_function< T > *function, const type_checker &tc)
Definition exprtk.hpp:28604

References exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scoped_vec_delete< Type >::delete_ptr, exprtk::parser< T >::type_checker::e_numeric, exprtk::parser< T >::type_checker::e_overload, exprtk::parser< T >::type_checker::e_string, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::parser< T >::expression_generator< Type >::generic_function_call(), exprtk::lexer::parser_helper::next_token(), exprtk::igeneric_function< T >::parameter_sequence, exprtk::parser< T >::type_checker::paramseq_count(), exprtk::parser< T >::parse_igeneric_function_params(), exprtk::parser< T >::type_checker::return_type(), exprtk::parser< T >::set_error(), exprtk::parser< T >::expression_generator< Type >::string_function_call(), and exprtk::parser< T >::type_checker::verify().

Referenced by exprtk::parser< T >::parse_symtab_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_pending_string_rangesize()

template<typename T >
bool exprtk::parser< T >::parse_pending_string_rangesize ( expression_node_ptr expression)
inlineprivate

Definition at line 27381 of file exprtk.hpp.

27382 {
27383 // Allow no more than 100 range calls, eg: s[][][]...[][]
27384 const std::size_t max_rangesize_parses = 100;
27385
27386 std::size_t i = 0;
27387
27388 while
27389 (
27390 (0 != expression) &&
27391 (i++ < max_rangesize_parses) &&
27392 error_list_.empty() &&
27393 is_generally_string_node(expression) &&
27394 token_is(token_t::e_lsqrbracket,prsrhlpr_t::e_hold)
27395 )
27396 {
27397 expression = parse_string_range_statement(expression);
27398 }
27399
27400 return (i > 1);
27401 }
expression_node_ptr parse_string_range_statement(expression_node_ptr &expression)
Definition exprtk.hpp:27315

References exprtk::lexer::token::e_lsqrbracket, exprtk::parser< T >::error_list_, exprtk::parser< T >::parse_string_range_statement(), and exprtk::lexer::parser_helper::token_is().

Referenced by exprtk::parser< T >::parse_branch(), and exprtk::parser< T >::parse_expression().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_pending_vector_index_operator()

template<typename T >
void exprtk::parser< T >::parse_pending_vector_index_operator ( expression_node_ptr expression)
inlineprivate

Definition at line 27403 of file exprtk.hpp.

27404 {
27405 if
27406 (
27407 (0 != expression) &&
27408 error_list_.empty() &&
27409 is_ivector_node(expression)
27410 )
27411 {
27412 if (
27414 token_is(token_t::e_mul,prsrhlpr_t::e_hold) &&
27416 )
27417 {
27420 }
27421 else if (token_is(token_t::e_lsqrbracket,prsrhlpr_t::e_hold))
27422 {
27424 }
27425 else if (
27426 token_is(token_t::e_rbracket,prsrhlpr_t::e_hold) &&
27428 )
27429 {
27432 }
27433 else
27434 return;
27435
27436 details::vector_interface<T>* vi = dynamic_cast<details::vector_interface<T>*>(expression);
27437
27438 if (vi)
27439 {
27440 details::vector_holder<T>& vec = vi->vec()->vec_holder();
27441 const std::string vector_name = sem_.get_vector_name(vec.data());
27442 expression_node_ptr index = parse_vector_index(vector_name);
27443
27444 if (index)
27445 {
27446 expression = synthesize_vector_element(vector_name, &vec, expression, index);
27447 return;
27448 }
27449 }
27450
27451 free_node(node_allocator_, expression);
27452 expression = error_node();
27453 }
27454 }
std::string get_vector_name(const T *data)
Definition exprtk.hpp:22587
expression_node_ptr synthesize_vector_element(const std::string &vector_name, vector_holder_ptr vec, expression_node_ptr vec_node, expression_node_ptr index_expr)
Definition exprtk.hpp:28092
expression_node_ptr parse_vector_index(const std::string &vector_name="")
Definition exprtk.hpp:27990

References exprtk::parser< T >::settings_store::commutative_check_enabled(), exprtk::details::vector_holder< Type >::data(), exprtk::lexer::token::e_lsqrbracket, exprtk::lexer::token::e_mul, exprtk::lexer::token::e_rbracket, exprtk::parser< T >::error_list_, exprtk::parser< T >::error_node(), exprtk::parser< T >::scope_element_manager::get_vector_name(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_vector_index(), exprtk::lexer::parser_helper::peek_token_is(), exprtk::parser< T >::sem_, exprtk::parser< T >::settings_, exprtk::parser< T >::synthesize_vector_element(), exprtk::lexer::parser_helper::token_is(), exprtk::details::vector_interface< T >::vec(), and exprtk::details::vector_node< T >::vec_holder().

Referenced by exprtk::parser< T >::parse_branch().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_range()

template<typename T >
bool exprtk::parser< T >::parse_range ( range_t rp,
const bool  skip_lsqr = false 
)
inlineprivate

Definition at line 27621 of file exprtk.hpp.

27622 {
27623 // Examples of valid ranges:
27624 // 1. [1:5] -> [1,5)
27625 // 2. [ :5] -> [0,5)
27626 // 3. [1: ] -> [1,end)
27627 // 4. [x:y] -> [x,y) where x <= y
27628 // 5. [x+1:y/2] -> [x+1,y/2) where x+1 <= y/2
27629 // 6. [ :y] -> [0,y) where 0 <= y
27630 // 7. [x: ] -> [x,end) where x <= end
27631
27632 rp.clear();
27633
27634 if (!skip_lsqr && !token_is(token_t::e_lsqrbracket))
27635 {
27638 current_token(),
27639 "ERR111 - Expected '[' for start of range",
27641
27642 return false;
27643 }
27644
27646 {
27647 rp.n0_c.first = true;
27648 rp.n0_c.second = 0;
27649 rp.cache.first = 0;
27650 }
27651 else
27652 {
27654
27655 if (0 == r0)
27656 {
27659 current_token(),
27660 "ERR112 - Failed parse begin section of range",
27662
27663 return false;
27664 }
27665 else if (is_constant_node(r0))
27666 {
27667 const T r0_value = r0->value();
27668
27669 if (r0_value >= T(0))
27670 {
27671 rp.n0_c.first = true;
27672 rp.n0_c.second = static_cast<std::size_t>(details::numeric::to_int64(r0_value));
27673 rp.cache.first = rp.n0_c.second;
27674 }
27675
27677
27678 if (r0_value < T(0))
27679 {
27682 current_token(),
27683 "ERR113 - Range lower bound less than zero! Constraint: r0 >= 0",
27685
27686 return false;
27687 }
27688 }
27689 else
27690 {
27691 rp.n0_e.first = true;
27692 rp.n0_e.second = r0;
27693 }
27694
27696 {
27699 current_token(),
27700 "ERR114 - Expected ':' for break in range",
27702
27703 rp.free();
27704
27705 return false;
27706 }
27707 }
27708
27710 {
27711 rp.n1_c.first = true;
27712 rp.n1_c.second = std::numeric_limits<std::size_t>::max();
27713 }
27714 else
27715 {
27717
27718 if (0 == r1)
27719 {
27722 current_token(),
27723 "ERR115 - Failed parse end section of range",
27725
27726 rp.free();
27727
27728 return false;
27729 }
27730 else if (is_constant_node(r1))
27731 {
27732 const T r1_value = r1->value();
27733
27734 if (r1_value >= T(0))
27735 {
27736 rp.n1_c.first = true;
27737 rp.n1_c.second = static_cast<std::size_t>(details::numeric::to_int64(r1_value));
27738 rp.cache.second = rp.n1_c.second;
27739 }
27740
27742
27743 if (r1_value < T(0))
27744 {
27747 current_token(),
27748 "ERR116 - Range upper bound less than zero! Constraint: r1 >= 0",
27750
27751 rp.free();
27752
27753 return false;
27754 }
27755 }
27756 else
27757 {
27758 rp.n1_e.first = true;
27759 rp.n1_e.second = r1;
27760 }
27761
27763 {
27766 current_token(),
27767 "ERR117 - Expected ']' for start of range",
27769
27770 rp.free();
27771
27772 return false;
27773 }
27774 }
27775
27776 if (rp.const_range())
27777 {
27778 std::size_t r0 = 0;
27779 std::size_t r1 = 0;
27780
27781 bool rp_result = false;
27782
27783 try
27784 {
27785 rp_result = rp(r0, r1);
27786 }
27787 catch (std::runtime_error&)
27788 {}
27789
27790 if (!rp_result || (r0 > r1))
27791 {
27794 current_token(),
27795 "ERR118 - Invalid range, Constraint: r0 <= r1",
27797
27798 return false;
27799 }
27800 }
27801
27802 return true;
27803 }
_int64_t to_int64(const T v)
Definition exprtk.hpp:1471

References exprtk::details::range_pack< T >::cache, exprtk::details::range_pack< T >::clear(), exprtk::details::range_pack< T >::const_range(), exprtk::lexer::parser_helper::current_token(), exprtk::lexer::token::e_colon, exprtk::lexer::token::e_lsqrbracket, exprtk::lexer::token::e_rsqrbracket, exprtk::parser_error::e_syntax, exprtk_error_location, exprtk::details::range_pack< T >::free(), exprtk::details::range_pack< T >::n0_c, exprtk::details::range_pack< T >::n0_e, exprtk::details::range_pack< T >::n1_c, exprtk::details::range_pack< T >::n1_e, exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_expression(), exprtk::parser< T >::set_error(), exprtk::details::numeric::to_int64(), exprtk::lexer::parser_helper::token_is(), and exprtk::details::expression_node< T >::value().

Referenced by exprtk::parser< T >::parse_const_string(), exprtk::parser< T >::parse_string(), and exprtk::parser< T >::parse_string_range_statement().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_repeat_until_loop()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_repeat_until_loop ( )
inlineprivate

Definition at line 26534 of file exprtk.hpp.

26535 {
26536 // Parse: [repeat][{][expression][}][until][(][test expr][)]
26537 expression_node_ptr condition = error_node();
26539 next_token();
26540
26541 std::vector<expression_node_ptr> arg_list;
26542 std::vector<bool> side_effect_list;
26543
26544 scoped_vec_delete<expression_node_t> sdd((*this),arg_list);
26545
26546 brkcnt_list_.push_front(false);
26547
26548 if (details::imatch(current_token().value,"until"))
26549 {
26550 next_token();
26552 }
26553 else
26554 {
26555 const token_t::token_type separator = token_t::e_eof;
26556
26557 scope_handler sh(*this);
26558
26559 scoped_bool_or_restorer sbr(state_.side_effect_present);
26560
26561 scoped_inc_dec sid(state_.parsing_loop_stmt_count);
26562
26563 for ( ; ; )
26564 {
26566
26568
26569 if (0 == arg)
26570 return error_node();
26571 else
26572 {
26573 arg_list.push_back(arg);
26574 side_effect_list.push_back(state_.side_effect_present);
26575 }
26576
26577 if (details::imatch(current_token().value,"until"))
26578 {
26579 next_token();
26580 break;
26581 }
26582
26583 const bool is_next_until = peek_token_is(token_t::e_symbol) &&
26584 peek_token_is("until");
26585
26586 if (!token_is(separator) && is_next_until)
26587 {
26590 current_token(),
26591 "ERR068 - Expected '" + token_t::to_str(separator) + "' in body of repeat until loop",
26593
26594 return error_node();
26595 }
26596
26597 if (details::imatch(current_token().value,"until"))
26598 {
26599 next_token();
26600 break;
26601 }
26602 }
26603
26604 branch = simplify(arg_list,side_effect_list);
26605
26606 sdd.delete_ptr = (0 == branch);
26607
26608 if (sdd.delete_ptr)
26609 {
26612 current_token(),
26613 "ERR069 - Failed to parse body of repeat until loop",
26615
26616 return error_node();
26617 }
26618 }
26619
26621 {
26624 current_token(),
26625 "ERR070 - Expected '(' before condition statement of repeat until loop",
26627
26628 free_node(node_allocator_, branch);
26629 return error_node();
26630 }
26631 else if (0 == (condition = parse_expression()))
26632 {
26635 current_token(),
26636 "ERR071 - Failed to parse condition for repeat until loop",
26638
26639 free_node(node_allocator_, branch);
26640 return error_node();
26641 }
26642 else if (!token_is(token_t::e_rbracket))
26643 {
26646 current_token(),
26647 "ERR072 - Expected ')' after condition of repeat until loop",
26649
26650 free_node(node_allocator_, branch );
26651 free_node(node_allocator_, condition);
26652
26653 return error_node();
26654 }
26655
26656 expression_node_ptr result_node =
26659 condition,
26660 branch,
26661 brkcnt_list_.front());
26662
26663 if (0 == result_node)
26664 {
26667 current_token(),
26668 "ERR073 - Failed to synthesize repeat until loop",
26670
26671 free_node(node_allocator_, condition);
26672
26673 return error_node();
26674 }
26675
26677
26678 if (result_node && result_node->valid())
26679 {
26680 return result_node;
26681 }
26682
26685 current_token(),
26686 "ERR074 - Failed to synthesize 'valid' repeat until loop",
26688
26689 free_node(node_allocator_, result_node);
26690
26691 return error_node();
26692 }
expression_node_ptr repeat_until_loop(expression_node_ptr &condition, expression_node_ptr &branch, const bool break_continue_present=false) const
Definition exprtk.hpp:32508

References exprtk::details::node_allocator::allocate(), exprtk::parser< T >::brkcnt_list_, exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scoped_vec_delete< Type >::delete_ptr, exprtk::lexer::token::e_eof, exprtk::lexer::token::e_lbracket, exprtk::lexer::token::e_rbracket, exprtk::lexer::token::e_symbol, exprtk::parser_error::e_syntax, exprtk::parser_error::e_synthesis, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::parser< T >::handle_brkcnt_scope_exit(), exprtk::details::imatch(), exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parser_state::parsing_loop_stmt_count, exprtk::lexer::parser_helper::peek_token_is(), exprtk::parser< T >::expression_generator< Type >::repeat_until_loop(), exprtk::parser< T >::set_error(), exprtk::parser< T >::parser_state::side_effect_present, exprtk::parser< T >::simplify(), exprtk::parser< T >::state_, exprtk::lexer::token::to_str(), exprtk::lexer::parser_helper::token_is(), and exprtk::details::expression_node< T >::valid().

Referenced by exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_return_statement()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_return_statement ( )
inlineprivate

Definition at line 30229 of file exprtk.hpp.

30230 {
30232 {
30235 current_token(),
30236 "ERR207 - Return call within a return call is not allowed",
30238
30239 return error_node();
30240 }
30241
30242 scoped_bool_negator sbn(state_.parsing_return_stmt);
30243
30244 std::vector<expression_node_ptr> arg_list;
30245
30246 scoped_vec_delete<expression_node_t> sdd((*this),arg_list);
30247
30248 if (!details::imatch(current_token().value,"return"))
30249 {
30250 return error_node();
30251 }
30252 else
30253 next_token();
30254
30256 {
30259 current_token(),
30260 "ERR208 - Expected '[' at start of return statement",
30262
30263 return error_node();
30264 }
30266 {
30267 for ( ; ; )
30268 {
30270
30271 if (0 == arg)
30272 return error_node();
30273
30274 arg_list.push_back(arg);
30275
30277 break;
30278 else if (!token_is(token_t::e_comma))
30279 {
30282 current_token(),
30283 "ERR209 - Expected ',' between values during call to return",
30285
30286 return error_node();
30287 }
30288 }
30289 }
30291 {
30294 current_token(),
30295 "ERR210 - Zero parameter return statement not allowed",
30297
30298 return error_node();
30299 }
30300
30301 const lexer::token prev_token = current_token();
30302
30304 {
30305 if (!arg_list.empty())
30306 {
30309 prev_token,
30310 "ERR211 - Invalid ']' found during return call",
30312
30313 return error_node();
30314 }
30315 }
30316
30317 std::string ret_param_type_list;
30318
30319 for (std::size_t i = 0; i < arg_list.size(); ++i)
30320 {
30321 if (0 == arg_list[i])
30322 return error_node();
30323 else if (is_ivector_node(arg_list[i]))
30324 ret_param_type_list += 'V';
30325 else if (is_generally_string_node(arg_list[i]))
30326 ret_param_type_list += 'S';
30327 else
30328 ret_param_type_list += 'T';
30329 }
30330
30331 dec_.retparam_list_.push_back(ret_param_type_list);
30332
30334
30335 sdd.delete_ptr = (0 == result);
30336
30338
30339 state_.activate_side_effect("parse_return_statement()");
30340
30341 return result;
30342 }
expression_node_ptr return_call(std::vector< expression_node_ptr > &arg_list)
Definition exprtk.hpp:33632

References exprtk::parser< T >::parser_state::activate_side_effect(), exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::dec_, exprtk::parser< T >::scoped_vec_delete< Type >::delete_ptr, exprtk::lexer::token::e_comma, exprtk::lexer::token::e_lsqrbracket, exprtk::lexer::token::e_rsqrbracket, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::details::imatch(), exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parser_state::parsing_return_stmt, exprtk::parser< T >::dependent_entity_collector::retparam_list_, exprtk::parser< T >::expression_generator< Type >::return_call(), exprtk::parser< T >::parser_state::return_stmt_present, exprtk::parser< T >::set_error(), exprtk::parser< T >::settings_, exprtk::parser< T >::state_, exprtk::lexer::parser_helper::token_is(), and exprtk::parser< T >::settings_store::zero_return_disabled().

Referenced by exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_special_function()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_special_function ( )
inlineprivate

Definition at line 28859 of file exprtk.hpp.

28860 {
28861 const std::string sf_name = current_token().value;
28862
28863 // Expect: $fDD(expr0,expr1,expr2) or $fDD(expr0,expr1,expr2,expr3)
28864 if (
28865 !details::is_digit(sf_name[2]) ||
28866 !details::is_digit(sf_name[3])
28867 )
28868 {
28871 current_token(),
28872 "ERR147 - Invalid special function[1]: " + sf_name,
28874
28875 return error_node();
28876 }
28877
28878 const int id = (sf_name[2] - '0') * 10 +
28879 (sf_name[3] - '0');
28880
28881 if (id >= details::e_sffinal)
28882 {
28885 current_token(),
28886 "ERR148 - Invalid special function[2]: " + sf_name,
28888
28889 return error_node();
28890 }
28891
28892 const int sf_3_to_4 = details::e_sf48;
28893 const details::operator_type opt_type = details::operator_type(id + 1000);
28894 const std::size_t NumberOfParameters = (id < (sf_3_to_4 - 1000)) ? 3U : 4U;
28895
28896 switch (NumberOfParameters)
28897 {
28898 case 3 : return parse_special_function_impl<T,3>::process((*this), opt_type, sf_name);
28899 case 4 : return parse_special_function_impl<T,4>::process((*this), opt_type, sf_name);
28900 default : return error_node();
28901 }
28902 }
bool is_digit(const char_t c)
Definition exprtk.hpp:132
static expression_node_ptr process(parser< Type > &p, const details::operator_type opt_type, const std::string &sf_name)
Definition exprtk.hpp:28795

References exprtk::lexer::parser_helper::current_token(), exprtk::details::e_sf48, exprtk::details::e_sffinal, exprtk::parser_error::e_token, exprtk::parser< T >::error_node(), exprtk_error_location, exprtk::details::is_digit(), exprtk::parser< T >::parse_special_function_impl< Type, NumberOfParameters >::process(), exprtk::parser< T >::set_error(), and exprtk::lexer::token::value.

Referenced by exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_string()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_string ( )
inlineprivate

Definition at line 27812 of file exprtk.hpp.

27813 {
27814 const std::string symbol = current_token().value;
27815
27816 typedef details::stringvar_node<T>* strvar_node_t;
27817
27819 strvar_node_t const_str_node = static_cast<strvar_node_t>(0);
27820
27821 scope_element& se = sem_.get_active_element(symbol);
27822
27823 if (scope_element::e_string == se.type)
27824 {
27825 se.active = true;
27826 result = se.str_node;
27828 }
27829 else
27830 {
27831 typedef typename symtab_store::string_context str_ctxt_t;
27832 str_ctxt_t str_ctx = symtab_store_.get_string_context(symbol);
27833
27834 if ((0 == str_ctx.str_var) || !symtab_store_.is_conststr_stringvar(symbol))
27835 {
27838 current_token(),
27839 "ERR119 - Unknown string symbol",
27841
27842 return error_node();
27843 }
27844
27845 assert(str_ctx.str_var != 0);
27846 assert(str_ctx.symbol_table != 0);
27847
27848 result = str_ctx.str_var;
27849
27851 {
27852 const_str_node = static_cast<strvar_node_t>(result);
27853 result = expression_generator_(const_str_node->str());
27854 }
27855 else if (symbol_table_t::e_immutable == str_ctx.symbol_table->mutability())
27856 {
27858 current_token(),
27859 make_memory_range(str_ctx.str_var->base(), str_ctx.str_var->size()));
27860 }
27861
27862 lodge_symbol(symbol, e_st_string);
27863 }
27864
27866 {
27867 next_token();
27868
27870 {
27871 next_token();
27872 next_token();
27873
27874 if (const_str_node)
27875 {
27876 free_node(node_allocator_, result);
27877
27878 return expression_generator_(T(const_str_node->size()));
27879 }
27880 else
27882 (static_cast<details::stringvar_node<T>*>(result)->ref());
27883 }
27884
27885 range_t rp;
27886
27887 if (!parse_range(rp))
27888 {
27889 free_node(node_allocator_, result);
27890
27891 return error_node();
27892 }
27893 else if (const_str_node)
27894 {
27895 free_node(node_allocator_, result);
27896 result = expression_generator_(const_str_node->ref(),rp);
27897 }
27898 else
27900 (result)->ref(), rp);
27901
27902 if (result)
27903 rp.clear();
27904 }
27905 else
27906 next_token();
27907
27908 return result;
27909 }
void lodge_immutable_symbol(const lexer::token &token, const interval_t interval)
Definition exprtk.hpp:30636
interval_t make_memory_range(const T &t)
Definition exprtk.hpp:30619
bool is_conststr_stringvar(const std::string &symbol_name) const
Definition exprtk.hpp:23270
string_context get_string_context(const std::string &string_name) const
Definition exprtk.hpp:22975
bool is_constant_string(const std::string &symbol_name) const
Definition exprtk.hpp:23200

References exprtk::parser< T >::scope_element::active, exprtk::details::node_allocator::allocate(), exprtk::details::range_pack< T >::clear(), exprtk::lexer::parser_helper::current_token(), exprtk::symbol_table< T >::e_immutable, exprtk::lexer::token::e_lsqrbracket, exprtk::lexer::token::e_rsqrbracket, exprtk::parser< T >::e_st_local_string, exprtk::parser< T >::e_st_string, exprtk::parser< T >::scope_element::e_string, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::parser< T >::scope_element_manager::get_active_element(), exprtk::parser< T >::symtab_store::get_string_context(), exprtk::parser< T >::symtab_store::is_constant_string(), exprtk::parser< T >::symtab_store::is_conststr_stringvar(), exprtk::parser< T >::lodge_immutable_symbol(), exprtk::parser< T >::lodge_symbol(), exprtk::parser< T >::make_memory_range(), exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_range(), exprtk::lexer::parser_helper::peek_token_is(), exprtk::parser< T >::sem_, exprtk::parser< T >::set_error(), exprtk::parser< T >::scope_element::str_node, exprtk::parser< T >::symtab_store_, exprtk::parser< T >::scope_element::type, and exprtk::lexer::token::value.

Referenced by exprtk::parser< T >::parse_symtab_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_string_function_call()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_string_function_call ( igeneric_function< T > *  function,
const std::string &  function_name 
)
inlineprivate

Definition at line 28669 of file exprtk.hpp.

28670 {
28671 // Move pass the function name
28672 next_token();
28673
28674 std::string param_type_list;
28675
28676 type_checker tc((*this), function_name, function->parameter_sequence, type_checker::e_string);
28677
28678 if (
28679 (!function->parameter_sequence.empty()) &&
28680 (0 == tc.paramseq_count())
28681 )
28682 {
28683 return error_node();
28684 }
28685
28686 std::vector<expression_node_ptr> arg_list;
28687 scoped_vec_delete<expression_node_t> sdd((*this),arg_list);
28688
28689 if (!parse_igeneric_function_params(param_type_list, arg_list, function_name, function, tc))
28690 {
28691 return error_node();
28692 }
28693
28694 std::size_t param_seq_index = 0;
28695
28696 if (!tc.verify(param_type_list, param_seq_index))
28697 {
28700 current_token(),
28701 "ERR141 - Invalid input parameter sequence for call to string function: " + function_name,
28703
28704 return error_node();
28705 }
28706
28708
28709 result = (tc.paramseq_count() <= 1) ?
28711 .string_function_call(function, arg_list) :
28713 .string_function_call(function, arg_list, param_seq_index);
28714
28715 sdd.delete_ptr = (0 == result);
28716
28717 return result;
28718 }

References exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scoped_vec_delete< Type >::delete_ptr, exprtk::parser< T >::type_checker::e_string, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::lexer::parser_helper::next_token(), exprtk::igeneric_function< T >::parameter_sequence, exprtk::parser< T >::type_checker::paramseq_count(), exprtk::parser< T >::parse_igeneric_function_params(), exprtk::parser< T >::set_error(), exprtk::parser< T >::expression_generator< Type >::string_function_call(), and exprtk::parser< T >::type_checker::verify().

Referenced by exprtk::parser< T >::parse_symtab_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_string_range_statement()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_string_range_statement ( expression_node_ptr expression)
inlineprivate

Definition at line 27315 of file exprtk.hpp.

27316 {
27318 {
27321 current_token(),
27322 "ERR106 - Expected '[' as start of string range definition",
27324
27325 free_node(node_allocator_, expression);
27326
27327 return error_node();
27328 }
27330 {
27332 }
27333
27334 range_t rp;
27335
27336 if (!parse_range(rp,true))
27337 {
27338 free_node(node_allocator_, expression);
27339
27340 return error_node();
27341 }
27342
27343 expression_node_ptr result = expression_generator_(expression,rp);
27344
27345 if (0 == result)
27346 {
27349 current_token(),
27350 "ERR107 - Failed to generate string range node",
27352
27353 free_node(node_allocator_, expression);
27354 rp.free();
27355 }
27356
27357 rp.clear();
27358
27359 if (result && result->valid())
27360 {
27361 return result;
27362 }
27363
27366 current_token(),
27367 "ERR108 - Failed to synthesize node: string_range_node",
27369
27370 free_node(node_allocator_, result);
27371 rp.free();
27372 return error_node();
27373 }

References exprtk::details::node_allocator::allocate(), exprtk::details::range_pack< T >::clear(), exprtk::lexer::parser_helper::current_token(), exprtk::lexer::token::e_lsqrbracket, exprtk::lexer::token::e_rsqrbracket, exprtk::parser_error::e_syntax, exprtk::parser_error::e_synthesis, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::details::range_pack< T >::free(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_range(), exprtk::parser< T >::set_error(), exprtk::lexer::parser_helper::token_is(), and exprtk::details::expression_node< T >::valid().

Referenced by exprtk::parser< T >::parse_pending_string_rangesize().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_swap_statement()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_swap_statement ( )
inlineprivate

Definition at line 29995 of file exprtk.hpp.

29996 {
29997 if (!details::imatch(current_token().value,"swap"))
29998 {
29999 return error_node();
30000 }
30001 else
30002 next_token();
30003
30005 {
30008 current_token(),
30009 "ERR198 - Expected '(' at start of swap statement",
30011
30012 return error_node();
30013 }
30014
30015 expression_node_ptr variable0 = error_node();
30016 expression_node_ptr variable1 = error_node();
30017
30018 bool variable0_generated = false;
30019 bool variable1_generated = false;
30020
30021 const std::string var0_name = current_token().value;
30022
30023 if (!token_is(token_t::e_symbol,prsrhlpr_t::e_hold))
30024 {
30027 current_token(),
30028 "ERR199 - Expected a symbol for variable or vector element definition",
30030
30031 return error_node();
30032 }
30034 {
30035 if (0 == (variable0 = parse_vector()))
30036 {
30039 current_token(),
30040 "ERR200 - First parameter to swap is an invalid vector element: '" + var0_name + "'",
30042
30043 return error_node();
30044 }
30045
30046 variable0_generated = true;
30047 }
30048 else
30049 {
30050 if (symtab_store_.is_variable(var0_name))
30051 {
30052 variable0 = symtab_store_.get_variable(var0_name);
30053 }
30054
30055 const scope_element& se = sem_.get_element(var0_name);
30056
30057 if (
30058 (se.active) &&
30059 (se.name == var0_name) &&
30060 (scope_element::e_variable == se.type)
30061 )
30062 {
30063 variable0 = se.var_node;
30064 }
30065
30066 lodge_symbol(var0_name, e_st_variable);
30067
30068 if (0 == variable0)
30069 {
30072 current_token(),
30073 "ERR201 - First parameter to swap is an invalid variable: '" + var0_name + "'",
30075
30076 return error_node();
30077 }
30078 else
30079 next_token();
30080 }
30081
30083 {
30086 current_token(),
30087 "ERR202 - Expected ',' between parameters to swap",
30089
30090 if (variable0_generated)
30091 {
30092 free_node(node_allocator_, variable0);
30093 }
30094
30095 return error_node();
30096 }
30097
30098 const std::string var1_name = current_token().value;
30099
30100 if (!token_is(token_t::e_symbol,prsrhlpr_t::e_hold))
30101 {
30104 current_token(),
30105 "ERR203 - Expected a symbol for variable or vector element definition",
30107
30108 if (variable0_generated)
30109 {
30110 free_node(node_allocator_, variable0);
30111 }
30112
30113 return error_node();
30114 }
30116 {
30117 if (0 == (variable1 = parse_vector()))
30118 {
30121 current_token(),
30122 "ERR204 - Second parameter to swap is an invalid vector element: '" + var1_name + "'",
30124
30125 if (variable0_generated)
30126 {
30127 free_node(node_allocator_, variable0);
30128 }
30129
30130 return error_node();
30131 }
30132
30133 variable1_generated = true;
30134 }
30135 else
30136 {
30137 if (symtab_store_.is_variable(var1_name))
30138 {
30139 variable1 = symtab_store_.get_variable(var1_name);
30140 }
30141
30142 const scope_element& se = sem_.get_element(var1_name);
30143
30144 if (
30145 (se.active) &&
30146 (se.name == var1_name) &&
30147 (scope_element::e_variable == se.type)
30148 )
30149 {
30150 variable1 = se.var_node;
30151 }
30152
30153 lodge_symbol(var1_name, e_st_variable);
30154
30155 if (0 == variable1)
30156 {
30159 current_token(),
30160 "ERR205 - Second parameter to swap is an invalid variable: '" + var1_name + "'",
30162
30163 if (variable0_generated)
30164 {
30165 free_node(node_allocator_, variable0);
30166 }
30167
30168 return error_node();
30169 }
30170 else
30171 next_token();
30172 }
30173
30175 {
30178 current_token(),
30179 "ERR206 - Expected ')' at end of swap statement",
30181
30182 if (variable0_generated)
30183 {
30184 free_node(node_allocator_, variable0);
30185 }
30186
30187 if (variable1_generated)
30188 {
30189 free_node(node_allocator_, variable1);
30190 }
30191
30192 return error_node();
30193 }
30194
30195 typedef details::variable_node<T>* variable_node_ptr;
30196
30197 variable_node_ptr v0 = variable_node_ptr(0);
30198 variable_node_ptr v1 = variable_node_ptr(0);
30199
30201
30202 if (
30203 (0 != (v0 = dynamic_cast<variable_node_ptr>(variable0))) &&
30204 (0 != (v1 = dynamic_cast<variable_node_ptr>(variable1)))
30205 )
30206 {
30208
30209 if (variable0_generated)
30210 {
30211 free_node(node_allocator_, variable0);
30212 }
30213
30214 if (variable1_generated)
30215 {
30216 free_node(node_allocator_, variable1);
30217 }
30218 }
30219 else
30221 (variable0, variable1);
30222
30223 state_.activate_side_effect("parse_swap_statement()");
30224
30225 return result;
30226 }
expression_node_ptr parse_vector()
Definition exprtk.hpp:28020
expression_node_ptr var_node
Definition exprtk.hpp:22389
variable_ptr get_variable(const std::string &variable_name) const
Definition exprtk.hpp:22935

References exprtk::parser< T >::parser_state::activate_side_effect(), exprtk::parser< T >::scope_element::active, exprtk::details::node_allocator::allocate(), exprtk::lexer::parser_helper::current_token(), exprtk::lexer::token::e_comma, exprtk::lexer::token::e_lbracket, exprtk::lexer::token::e_lsqrbracket, exprtk::lexer::token::e_rbracket, exprtk::parser< T >::e_st_variable, exprtk::lexer::token::e_symbol, exprtk::parser_error::e_syntax, exprtk::parser< T >::scope_element::e_variable, exprtk::parser< T >::error_node(), exprtk_error_location, exprtk::parser< T >::scope_element_manager::get_element(), exprtk::parser< T >::symtab_store::get_variable(), exprtk::details::imatch(), exprtk::parser< T >::symtab_store::is_variable(), exprtk::parser< T >::lodge_symbol(), exprtk::parser< T >::scope_element::name, exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_vector(), exprtk::lexer::parser_helper::peek_token_is(), exprtk::parser< T >::sem_, exprtk::parser< T >::set_error(), exprtk::parser< T >::state_, exprtk::parser< T >::symtab_store_, exprtk::lexer::parser_helper::token_is(), exprtk::parser< T >::scope_element::type, exprtk::lexer::token::value, and exprtk::parser< T >::scope_element::var_node.

Referenced by exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_switch_statement()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_switch_statement ( )
inlineprivate

Definition at line 26933 of file exprtk.hpp.

26934 {
26935 std::vector<expression_node_ptr> arg_list;
26937
26938 if (!details::imatch(current_token().value,"switch"))
26939 {
26942 current_token(),
26943 "ERR088 - Expected keyword 'switch'",
26945
26946 return error_node();
26947 }
26948
26949 scoped_vec_delete<expression_node_t> svd((*this),arg_list);
26950
26951 next_token();
26952
26954 {
26957 current_token(),
26958 "ERR089 - Expected '{' for call to switch statement",
26960
26961 return error_node();
26962 }
26963
26964 expression_node_ptr default_statement = error_node();
26965
26966 scoped_expression_delete defstmt_delete((*this), default_statement);
26967
26968 for ( ; ; )
26969 {
26970 if (details::imatch("case",current_token().value))
26971 {
26972 next_token();
26973
26975
26976 if (0 == condition)
26977 return error_node();
26978 else if (!token_is(token_t::e_colon))
26979 {
26982 current_token(),
26983 "ERR090 - Expected ':' for case of switch statement",
26985
26986 free_node(node_allocator_, condition);
26987
26988 return error_node();
26989 }
26990
26991 expression_node_ptr consequent =
26992 (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold)) ?
26993 parse_multi_sequence("switch-consequent") :
26995
26996 if (0 == consequent)
26997 {
26998 free_node(node_allocator_, condition);
26999
27000 return error_node();
27001 }
27002 else if (!token_is(token_t::e_eof))
27003 {
27006 current_token(),
27007 "ERR091 - Expected ';' at end of case for switch statement",
27009
27010 free_node(node_allocator_, condition );
27011 free_node(node_allocator_, consequent);
27012
27013 return error_node();
27014 }
27015
27016 // Can we optimise away the case statement?
27017 if (is_constant_node(condition) && is_false(condition))
27018 {
27019 free_node(node_allocator_, condition );
27020 free_node(node_allocator_, consequent);
27021 }
27022 else
27023 {
27024 arg_list.push_back(condition );
27025 arg_list.push_back(consequent);
27026 }
27027
27028 }
27029 else if (details::imatch("default",current_token().value))
27030 {
27031 if (0 != default_statement)
27032 {
27035 current_token(),
27036 "ERR092 - Multiple default cases for switch statement",
27038
27039 return error_node();
27040 }
27041
27042 next_token();
27043
27045 {
27048 current_token(),
27049 "ERR093 - Expected ':' for default of switch statement",
27051
27052 return error_node();
27053 }
27054
27055 default_statement =
27056 (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold)) ?
27057 parse_multi_sequence("switch-default"):
27059
27060 if (0 == default_statement)
27061 return error_node();
27062 else if (!token_is(token_t::e_eof))
27063 {
27066 current_token(),
27067 "ERR094 - Expected ';' at end of default for switch statement",
27069
27070 return error_node();
27071 }
27072 }
27074 break;
27075 else
27076 {
27079 current_token(),
27080 "ERR095 - Expected '}' at end of switch statement",
27082
27083 return error_node();
27084 }
27085 }
27086
27087 const bool default_statement_present = (0 != default_statement);
27088
27089 if (default_statement_present)
27090 {
27091 arg_list.push_back(default_statement);
27092 }
27093 else
27094 {
27095 arg_list.push_back(node_allocator_.allocate_c<literal_node_t>(std::numeric_limits<T>::quiet_NaN()));
27096 }
27097
27098 result = expression_generator_.switch_statement(arg_list, (0 != default_statement));
27099
27100 svd.delete_ptr = (0 == result);
27101 defstmt_delete.delete_ptr = (0 == result);
27102
27103 return result;
27104 }
expression_node< typename node_type::value_type > * allocate_c(const T1 &t1) const
Definition exprtk.hpp:19095
expression_node_ptr switch_statement(Sequence< expression_node_ptr, Allocator > &arg_list, const bool default_statement_present)
Definition exprtk.hpp:32832

References exprtk::details::node_allocator::allocate_c(), exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scoped_expression_delete::delete_ptr, exprtk::parser< T >::scoped_vec_delete< Type >::delete_ptr, exprtk::lexer::token::e_colon, exprtk::lexer::token::e_eof, exprtk::lexer::token::e_lcrlbracket, exprtk::lexer::token::e_rcrlbracket, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::details::imatch(), exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parse_multi_sequence(), exprtk::parser< T >::set_error(), exprtk::parser< T >::expression_generator< Type >::switch_statement(), and exprtk::lexer::parser_helper::token_is().

Referenced by exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_symbol()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_symbol ( )
inlineprivate

Definition at line 30973 of file exprtk.hpp.

30974 {
30975 static const std::string symbol_if = "if" ;
30976 static const std::string symbol_while = "while" ;
30977 static const std::string symbol_repeat = "repeat" ;
30978 static const std::string symbol_for = "for" ;
30979 static const std::string symbol_switch = "switch" ;
30980 static const std::string symbol_null = "null" ;
30981 static const std::string symbol_break = "break" ;
30982 static const std::string symbol_continue = "continue";
30983 static const std::string symbol_var = "var" ;
30984 static const std::string symbol_const = "const" ;
30985 static const std::string symbol_swap = "swap" ;
30986 static const std::string symbol_return = "return" ;
30987 static const std::string symbol_not = "not" ;
30988 static const std::string symbol_assert = "assert" ;
30989
30990 const std::string symbol = current_token().value;
30991
30992 if (valid_vararg_operation(symbol))
30993 {
30994 return parse_vararg_function();
30995 }
30996 else if (details::imatch(symbol, symbol_not))
30997 {
30998 return parse_not_statement();
30999 }
31000 else if (valid_base_operation(symbol))
31001 {
31002 return parse_base_operation();
31003 }
31004 else if (
31005 details::imatch(symbol, symbol_if) &&
31007 )
31008 {
31010 }
31011 else if (
31012 details::imatch(symbol, symbol_while) &&
31014 )
31015 {
31016 return parse_while_loop();
31017 }
31018 else if (
31019 details::imatch(symbol, symbol_repeat) &&
31021 )
31022 {
31023 return parse_repeat_until_loop();
31024 }
31025 else if (
31026 details::imatch(symbol, symbol_for) &&
31028 )
31029 {
31030 return parse_for_loop();
31031 }
31032 else if (
31033 details::imatch(symbol, symbol_switch) &&
31035 )
31036 {
31037 return parse_switch_statement();
31038 }
31039 else if (details::is_valid_sf_symbol(symbol))
31040 {
31041 return parse_special_function();
31042 }
31043 else if (details::imatch(symbol, symbol_null))
31044 {
31045 return parse_null_statement();
31046 }
31047 #ifndef exprtk_disable_break_continue
31048 else if (details::imatch(symbol, symbol_break))
31049 {
31050 return parse_break_statement();
31051 }
31052 else if (details::imatch(symbol, symbol_continue))
31053 {
31054 return parse_continue_statement();
31055 }
31056 #endif
31057 else if (details::imatch(symbol, symbol_var))
31058 {
31060 }
31061 else if (details::imatch(symbol, symbol_const))
31062 {
31064 }
31065 else if (details::imatch(symbol, symbol_swap))
31066 {
31067 return parse_swap_statement();
31068 }
31069 #ifndef exprtk_disable_return_statement
31070 else if (
31071 details::imatch(symbol, symbol_return) &&
31073 )
31074 {
31075 return parse_return_statement();
31076 }
31077 #endif
31078 else if (details::imatch(symbol, symbol_assert))
31079 {
31080 return parse_assert_statement();
31081 }
31082 else if (symtab_store_.valid() || !sem_.empty())
31083 {
31084 return parse_symtab_symbol();
31085 }
31086 else
31087 {
31090 current_token(),
31091 "ERR233 - Unknown variable or function encountered. Symbol table(s) "
31092 "is either invalid or does not contain symbol: '" + symbol + "'",
31094
31095 return error_node();
31096 }
31097 }
bool control_struct_enabled(const std::string &control_struct) const
Definition exprtk.hpp:23910
expression_node_ptr parse_swap_statement()
Definition exprtk.hpp:29995
expression_node_ptr parse_for_loop()
Definition exprtk.hpp:26694
expression_node_ptr parse_special_function()
Definition exprtk.hpp:28859
bool valid_vararg_operation(const std::string &symbol) const
Definition exprtk.hpp:24839
bool valid_base_operation(const std::string &symbol) const
Definition exprtk.hpp:24825
expression_node_ptr parse_continue_statement()
Definition exprtk.hpp:28986
expression_node_ptr parse_switch_statement()
Definition exprtk.hpp:26933
expression_node_ptr parse_while_loop()
Definition exprtk.hpp:26437
expression_node_ptr parse_define_var_statement()
Definition exprtk.hpp:29558
expression_node_ptr parse_vararg_function()
Definition exprtk.hpp:27222
expression_node_ptr parse_break_statement()
Definition exprtk.hpp:28911
expression_node_ptr parse_not_statement()
Definition exprtk.hpp:26415
expression_node_ptr parse_assert_statement()
Definition exprtk.hpp:30350
expression_node_ptr parse_null_statement()
Definition exprtk.hpp:28904
expression_node_ptr parse_return_statement()
Definition exprtk.hpp:30229
expression_node_ptr parse_symtab_symbol()
Definition exprtk.hpp:30642
expression_node_ptr parse_repeat_until_loop()
Definition exprtk.hpp:26534
expression_node_ptr parse_define_constvar_statement()
Definition exprtk.hpp:29741
bool is_valid_sf_symbol(const std::string &symbol)
Definition exprtk.hpp:257

References exprtk::parser< T >::settings_store::control_struct_enabled(), exprtk::lexer::parser_helper::current_token(), exprtk::parser_error::e_symtab, exprtk::parser< T >::scope_element_manager::empty(), exprtk::parser< T >::error_node(), exprtk_error_location, exprtk::details::imatch(), exprtk::details::is_valid_sf_symbol(), exprtk::parser< T >::parse_assert_statement(), exprtk::parser< T >::parse_base_operation(), exprtk::parser< T >::parse_break_statement(), exprtk::parser< T >::parse_conditional_statement(), exprtk::parser< T >::parse_continue_statement(), exprtk::parser< T >::parse_define_constvar_statement(), exprtk::parser< T >::parse_define_var_statement(), exprtk::parser< T >::parse_for_loop(), exprtk::parser< T >::parse_not_statement(), exprtk::parser< T >::parse_null_statement(), exprtk::parser< T >::parse_repeat_until_loop(), exprtk::parser< T >::parse_return_statement(), exprtk::parser< T >::parse_special_function(), exprtk::parser< T >::parse_swap_statement(), exprtk::parser< T >::parse_switch_statement(), exprtk::parser< T >::parse_symtab_symbol(), exprtk::parser< T >::parse_vararg_function(), exprtk::parser< T >::parse_while_loop(), exprtk::parser< T >::sem_, exprtk::parser< T >::set_error(), exprtk::parser< T >::settings_, exprtk::parser< T >::symtab_store_, exprtk::parser< T >::symtab_store::valid(), exprtk::parser< T >::valid_base_operation(), exprtk::parser< T >::valid_vararg_operation(), and exprtk::lexer::token::value.

Referenced by exprtk::parser< T >::parse_branch().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_symtab_symbol()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_symtab_symbol ( )
inlineprivate

Definition at line 30642 of file exprtk.hpp.

30643 {
30644 const std::string symbol = current_token().value;
30645
30646 // Are we dealing with a variable or a special constant?
30647 typedef typename symtab_store::variable_context var_ctxt_t;
30648 var_ctxt_t var_ctx = symtab_store_.get_variable_context(symbol);
30649
30650 if (var_ctx.variable)
30651 {
30652 assert(var_ctx.symbol_table);
30653
30654 expression_node_ptr result_variable = var_ctx.variable;
30655
30656 if (symtab_store_.is_constant_node(symbol))
30657 {
30658 result_variable = expression_generator_(var_ctx.variable->value());
30659 }
30660 else if (symbol_table_t::e_immutable == var_ctx.symbol_table->mutability())
30661 {
30662 lodge_immutable_symbol(current_token(), make_memory_range(var_ctx.variable->ref()));
30663 result_variable = var_ctx.variable;
30664 }
30665
30666 if (!post_variable_process(symbol))
30667 return error_node();
30668
30669 lodge_symbol(symbol, e_st_variable);
30670
30671 next_token();
30672
30673 return result_variable;
30674 }
30675
30676 // Are we dealing with a locally defined variable, vector or string?
30677 if (!sem_.empty())
30678 {
30679 scope_element& se = sem_.get_active_element(symbol);
30680
30681 if (se.active && details::imatch(se.name, symbol))
30682 {
30683 if (
30684 (scope_element::e_variable == se.type) ||
30685 (scope_element::e_literal == se.type)
30686 )
30687 {
30688 se.active = true;
30690
30691 if (!post_variable_process(symbol))
30692 return error_node();
30693
30694 next_token();
30695
30696 return (scope_element::e_variable == se.type) ?
30697 se.var_node :
30698 expression_generator_(se.var_node->value());
30699 }
30700 else if (scope_element::e_vector == se.type)
30701 {
30702 return parse_vector();
30703 }
30704 #ifndef exprtk_disable_string_capabilities
30705 else if (scope_element::e_string == se.type)
30706 {
30707 return parse_string();
30708 }
30709 #endif
30710 }
30711 }
30712
30713 #ifndef exprtk_disable_string_capabilities
30714 // Are we dealing with a string variable?
30715 if (symtab_store_.is_stringvar(symbol))
30716 {
30717 return parse_string();
30718 }
30719 #endif
30720
30721 {
30722 // Are we dealing with a function?
30723 ifunction<T>* function = symtab_store_.get_function(symbol);
30724
30725 if (function)
30726 {
30727 lodge_symbol(symbol, e_st_function);
30728
30729 expression_node_ptr func_node =
30730 parse_function_invocation(function,symbol);
30731
30732 if (func_node)
30733 return func_node;
30734 else
30735 {
30738 current_token(),
30739 "ERR224 - Failed to generate node for function: '" + symbol + "'",
30741
30742 return error_node();
30743 }
30744 }
30745 }
30746
30747 {
30748 // Are we dealing with a vararg function?
30749 ivararg_function<T>* vararg_function = symtab_store_.get_vararg_function(symbol);
30750
30751 if (vararg_function)
30752 {
30753 lodge_symbol(symbol, e_st_function);
30754
30755 expression_node_ptr vararg_func_node =
30756 parse_vararg_function_call(vararg_function, symbol);
30757
30758 if (vararg_func_node)
30759 return vararg_func_node;
30760 else
30761 {
30764 current_token(),
30765 "ERR225 - Failed to generate node for vararg function: '" + symbol + "'",
30767
30768 return error_node();
30769 }
30770 }
30771 }
30772
30773 {
30774 // Are we dealing with a vararg generic function?
30775 igeneric_function<T>* generic_function = symtab_store_.get_generic_function(symbol);
30776
30777 if (generic_function)
30778 {
30779 lodge_symbol(symbol, e_st_function);
30780
30781 expression_node_ptr genericfunc_node =
30782 parse_generic_function_call(generic_function, symbol);
30783
30784 if (genericfunc_node)
30785 return genericfunc_node;
30786 else
30787 {
30790 current_token(),
30791 "ERR226 - Failed to generate node for generic function: '" + symbol + "'",
30793
30794 return error_node();
30795 }
30796 }
30797 }
30798
30799 #ifndef exprtk_disable_string_capabilities
30800 {
30801 // Are we dealing with a vararg string returning function?
30802 igeneric_function<T>* string_function = symtab_store_.get_string_function(symbol);
30803
30804 if (string_function)
30805 {
30806 lodge_symbol(symbol, e_st_function);
30807
30808 expression_node_ptr stringfunc_node =
30809 parse_string_function_call(string_function, symbol);
30810
30811 if (stringfunc_node)
30812 return stringfunc_node;
30813 else
30814 {
30817 current_token(),
30818 "ERR227 - Failed to generate node for string function: '" + symbol + "'",
30820
30821 return error_node();
30822 }
30823 }
30824 }
30825
30826 {
30827 // Are we dealing with a vararg overloaded scalar/string returning function?
30828 igeneric_function<T>* overload_function = symtab_store_.get_overload_function(symbol);
30829
30830 if (overload_function)
30831 {
30832 lodge_symbol(symbol, e_st_function);
30833
30834 expression_node_ptr overloadfunc_node =
30835 parse_overload_function_call(overload_function, symbol);
30836
30837 if (overloadfunc_node)
30838 return overloadfunc_node;
30839 else
30840 {
30843 current_token(),
30844 "ERR228 - Failed to generate node for overload function: '" + symbol + "'",
30846
30847 return error_node();
30848 }
30849 }
30850 }
30851 #endif
30852
30853 // Are we dealing with a vector?
30854 if (symtab_store_.is_vector(symbol))
30855 {
30856 lodge_symbol(symbol, e_st_vector);
30857 return parse_vector();
30858 }
30859
30860 if (details::is_reserved_symbol(symbol))
30861 {
30862 if (
30863 settings_.function_enabled(symbol) ||
30865 )
30866 {
30869 current_token(),
30870 "ERR229 - Invalid use of reserved symbol '" + symbol + "'",
30872
30873 return error_node();
30874 }
30875 }
30876
30877 // Should we handle unknown symbols?
30879 {
30881 {
30883
30884 std::string error_message;
30885
30887 {
30888 T default_value = T(0);
30889
30891
30892 if (unknown_symbol_resolver_->process(symbol, usr_symbol_type, default_value, error_message))
30893 {
30894 bool create_result = false;
30895
30896 switch (usr_symbol_type)
30897 {
30899 create_result = symtab.create_variable(symbol, default_value);
30900 break;
30901
30903 create_result = symtab.add_constant(symbol, default_value);
30904 break;
30905
30906 default : create_result = false;
30907 }
30908
30909 if (create_result)
30910 {
30912
30913 if (var)
30914 {
30915 if (symtab_store_.is_constant_node(symbol))
30916 {
30917 var = expression_generator_(var->value());
30918 }
30919
30920 lodge_symbol(symbol, e_st_variable);
30921
30922 if (!post_variable_process(symbol))
30923 return error_node();
30924
30925 next_token();
30926
30927 return var;
30928 }
30929 }
30930 }
30931
30934 current_token(),
30935 "ERR230 - Failed to create variable: '" + symbol + "'" +
30936 (error_message.empty() ? "" : " - " + error_message),
30938
30939 }
30941 {
30942 if (unknown_symbol_resolver_->process(symbol, symtab, error_message))
30943 {
30945
30946 if (result)
30947 {
30948 return result;
30949 }
30950 }
30951
30954 current_token(),
30955 "ERR231 - Failed to resolve symbol: '" + symbol + "'" +
30956 (error_message.empty() ? "" : " - " + error_message),
30958 }
30959
30960 return error_node();
30961 }
30962 }
30963
30966 current_token(),
30967 "ERR232 - Undefined symbol: '" + symbol + "'",
30969
30970 return error_node();
30971 }
bool function_enabled(const std::string &function_name) const
Definition exprtk.hpp:23902
expression_node_ptr parse_string_function_call(igeneric_function< T > *function, const std::string &function_name)
Definition exprtk.hpp:28669
expression_node_ptr parse_function_invocation(ifunction< T > *function, const std::string &function_name)
Definition exprtk.hpp:25592
expression_node_ptr parse_generic_function_call(igeneric_function< T > *function, const std::string &function_name)
Definition exprtk.hpp:28480
expression_node_ptr parse_vararg_function_call(ivararg_function< T > *vararg_function, const std::string &vararg_function_name)
Definition exprtk.hpp:28122
expression_node_ptr parse_overload_function_call(igeneric_function< T > *function, const std::string &function_name)
Definition exprtk.hpp:28720
bool post_variable_process(const std::string &symbol)
Definition exprtk.hpp:30538
expression_node_ptr parse_string()
Definition exprtk.hpp:27812
symbol_table< T > symbol_table_t
Definition exprtk.hpp:22255
bool is_base_function(const std::string &function_name)
Definition exprtk.hpp:542
function_ptr get_function(const std::string &function_name) const
Definition exprtk.hpp:23023
bool is_stringvar(const std::string &stringvar_name) const
Definition exprtk.hpp:23254
generic_function_ptr get_generic_function(const std::string &function_name) const
Definition exprtk.hpp:23065
bool is_constant_node(const std::string &symbol_name) const
Definition exprtk.hpp:23178
variable_context get_variable_context(const std::string &variable_name) const
Definition exprtk.hpp:22909
symbol_table_t & get_symbol_table(const std::size_t &index=0)
Definition exprtk.hpp:23373
vararg_function_ptr get_vararg_function(const std::string &vararg_function_name) const
Definition exprtk.hpp:23044
generic_function_ptr get_overload_function(const std::string &function_name) const
Definition exprtk.hpp:23107
generic_function_ptr get_string_function(const std::string &function_name) const
Definition exprtk.hpp:23086
virtual bool process(const std::string &, usr_symbol_type &st, T &default_value, std::string &error_message)
Definition exprtk.hpp:23451

References exprtk::parser< T >::scope_element::active, exprtk::symbol_table< T >::add_constant(), exprtk::symbol_table< T >::create_variable(), exprtk::lexer::parser_helper::current_token(), exprtk::symbol_table< T >::e_immutable, exprtk::parser< T >::scope_element::e_literal, exprtk::parser< T >::e_st_function, exprtk::parser< T >::e_st_local_variable, exprtk::parser< T >::e_st_variable, exprtk::parser< T >::e_st_vector, exprtk::parser< T >::scope_element::e_string, exprtk::parser_error::e_symtab, exprtk::parser_error::e_syntax, exprtk::parser< T >::unknown_symbol_resolver::e_usr_constant_type, exprtk::parser< T >::unknown_symbol_resolver::e_usr_unknown_type, exprtk::parser< T >::unknown_symbol_resolver::e_usr_variable_type, exprtk::parser< T >::unknown_symbol_resolver::e_usrmode_default, exprtk::parser< T >::unknown_symbol_resolver::e_usrmode_extended, exprtk::parser< T >::scope_element::e_variable, exprtk::parser< T >::scope_element::e_vector, exprtk::parser< T >::scope_element_manager::empty(), exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::parser< T >::settings_store::function_enabled(), exprtk::parser< T >::scope_element_manager::get_active_element(), exprtk::parser< T >::symtab_store::get_function(), exprtk::parser< T >::symtab_store::get_generic_function(), exprtk::parser< T >::symtab_store::get_overload_function(), exprtk::parser< T >::symtab_store::get_string_function(), exprtk::parser< T >::symtab_store::get_symbol_table(), exprtk::parser< T >::symtab_store::get_vararg_function(), exprtk::parser< T >::symtab_store::get_variable(), exprtk::parser< T >::symtab_store::get_variable_context(), exprtk::details::imatch(), exprtk::details::is_base_function(), exprtk::parser< T >::symtab_store::is_constant_node(), exprtk::details::is_reserved_symbol(), exprtk::parser< T >::symtab_store::is_stringvar(), exprtk::parser< T >::symtab_store::is_vector(), exprtk::parser< T >::lodge_immutable_symbol(), exprtk::parser< T >::lodge_symbol(), exprtk::parser< T >::make_memory_range(), exprtk::parser< T >::unknown_symbol_resolver::mode, exprtk::parser< T >::scope_element::name, exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::parse_function_invocation(), exprtk::parser< T >::parse_generic_function_call(), exprtk::parser< T >::parse_overload_function_call(), exprtk::parser< T >::parse_string(), exprtk::parser< T >::parse_string_function_call(), exprtk::parser< T >::parse_symtab_symbol(), exprtk::parser< T >::parse_vararg_function_call(), exprtk::parser< T >::parse_vector(), exprtk::parser< T >::post_variable_process(), exprtk::parser< T >::unknown_symbol_resolver::process(), exprtk::parser< T >::resolve_unknown_symbol_, exprtk::parser< T >::settings_store::rsrvd_sym_usr_disabled(), exprtk::parser< T >::sem_, exprtk::parser< T >::set_error(), exprtk::parser< T >::settings_, exprtk::parser< T >::symtab_store_, exprtk::parser< T >::scope_element::type, exprtk::parser< T >::unknown_symbol_resolver_, exprtk::lexer::token::value, exprtk::details::expression_node< T >::value(), and exprtk::parser< T >::scope_element::var_node.

Referenced by exprtk::parser< T >::parse_symbol(), and exprtk::parser< T >::parse_symtab_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_ternary_conditional_statement()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_ternary_conditional_statement ( expression_node_ptr  condition)
inlineprivate

Definition at line 26295 of file exprtk.hpp.

26296 {
26297 // Parse: [condition][?][consequent][:][alternative]
26298 expression_node_ptr consequent = error_node();
26299 expression_node_ptr alternative = error_node();
26300
26301 bool result = true;
26302
26303 if (0 == condition)
26304 {
26307 current_token(),
26308 "ERR054 - Encountered invalid condition branch for ternary if-statement",
26310
26311 return error_node();
26312 }
26313 else if (!token_is(token_t::e_ternary))
26314 {
26317 current_token(),
26318 "ERR055 - Expected '?' after condition of ternary if-statement",
26320
26321 result = false;
26322 }
26323 else if (0 == (consequent = parse_expression()))
26324 {
26327 current_token(),
26328 "ERR056 - Failed to parse consequent for ternary if-statement",
26330
26331 result = false;
26332 }
26333 else if (!token_is(token_t::e_colon))
26334 {
26337 current_token(),
26338 "ERR057 - Expected ':' between ternary if-statement consequent and alternative",
26340
26341 result = false;
26342 }
26343 else if (0 == (alternative = parse_expression()))
26344 {
26347 current_token(),
26348 "ERR058 - Failed to parse alternative for ternary if-statement",
26350
26351 result = false;
26352 }
26353
26354 #ifndef exprtk_disable_string_capabilities
26355 if (result)
26356 {
26357 const bool consq_is_str = is_generally_string_node(consequent );
26358 const bool alter_is_str = is_generally_string_node(alternative);
26359
26360 if (consq_is_str || alter_is_str)
26361 {
26362 if (consq_is_str && alter_is_str)
26363 {
26365 .conditional_string(condition, consequent, alternative);
26366 }
26367
26370 current_token(),
26371 "ERR059 - Return types of ternary differ: string/non-string",
26373
26374 result = false;
26375 }
26376 }
26377 #endif
26378
26379 if (result)
26380 {
26381 const bool consq_is_vec = is_ivector_node(consequent );
26382 const bool alter_is_vec = is_ivector_node(alternative);
26383
26384 if (consq_is_vec || alter_is_vec)
26385 {
26386 if (consq_is_vec && alter_is_vec)
26387 {
26389 .conditional_vector(condition, consequent, alternative);
26390 }
26391
26394 current_token(),
26395 "ERR060 - Return types of ternary differ: vector/non-vector",
26397
26398 result = false;
26399 }
26400 }
26401
26402 if (!result)
26403 {
26404 free_node(node_allocator_, condition );
26405 free_node(node_allocator_, consequent );
26406 free_node(node_allocator_, alternative);
26407
26408 return error_node();
26409 }
26410 else
26412 .conditional(condition, consequent, alternative);
26413 }

References exprtk::parser< T >::expression_generator< Type >::conditional(), exprtk::parser< T >::expression_generator< Type >::conditional_string(), exprtk::parser< T >::expression_generator< Type >::conditional_vector(), exprtk::lexer::parser_helper::current_token(), exprtk::lexer::token::e_colon, exprtk::parser_error::e_syntax, exprtk::lexer::token::e_ternary, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_expression(), exprtk::parser< T >::set_error(), and exprtk::lexer::parser_helper::token_is().

Referenced by exprtk::parser< T >::parse_branch(), and exprtk::parser< T >::parse_expression().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_uninitialised_var_statement()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_uninitialised_var_statement ( const std::string &  var_name)
inlineprivate

Definition at line 29909 of file exprtk.hpp.

29910 {
29911 if (
29914 )
29915 {
29918 current_token(),
29919 "ERR194 - Expected a '{}' for uninitialised var definition",
29921
29922 return error_node();
29923 }
29924 else if (!token_is(token_t::e_eof,prsrhlpr_t::e_hold))
29925 {
29928 current_token(),
29929 "ERR195 - Expected ';' after uninitialised variable definition",
29931
29932 return error_node();
29933 }
29934
29935 expression_node_ptr var_node = reinterpret_cast<expression_node_ptr>(0);
29936
29937 scope_element& se = sem_.get_element(var_name);
29938
29939 if (se.name == var_name)
29940 {
29941 if (se.active)
29942 {
29945 current_token(),
29946 "ERR196 - Illegal redefinition of local variable: '" + var_name + "'",
29948
29949 return error_node();
29950 }
29951 else if (scope_element::e_variable == se.type)
29952 {
29953 var_node = se.var_node;
29954 se.active = true;
29955 se.ref_count++;
29956 }
29957 }
29958
29959 if (0 == var_node)
29960 {
29961 scope_element nse;
29962 nse.name = var_name;
29963 nse.active = true;
29964 nse.ref_count = 1;
29965 nse.type = scope_element::e_variable;
29966 nse.depth = state_.scope_depth;
29967 nse.ip_index = sem_.next_ip_index();
29968 nse.data = new T(T(0));
29969 nse.var_node = node_allocator_.allocate<variable_node_t>(*reinterpret_cast<T*>(nse.data));
29970
29971 if (!sem_.add_element(nse))
29972 {
29975 current_token(),
29976 "ERR197 - Failed to add new local variable '" + var_name + "' to SEM",
29978
29979 sem_.free_element(nse);
29980
29981 return error_node();
29982 }
29983
29984 exprtk_debug(("parse_uninitialised_var_statement() - INFO - Added new local variable: %s\n",
29985 nse.name.c_str()));
29986 }
29987
29989
29990 state_.activate_side_effect("parse_uninitialised_var_statement()");
29991
29992 return expression_generator_(T(0));
29993 }

References exprtk::parser< T >::parser_state::activate_side_effect(), exprtk::parser< T >::scope_element::active, exprtk::parser< T >::scope_element_manager::add_element(), exprtk::details::node_allocator::allocate(), exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scope_element::data, exprtk::parser< T >::scope_element::depth, exprtk::lexer::token::e_eof, exprtk::lexer::token::e_lcrlbracket, exprtk::lexer::token::e_rcrlbracket, exprtk::parser< T >::e_st_local_variable, exprtk::parser_error::e_syntax, exprtk::parser< T >::scope_element::e_variable, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_debug, exprtk_error_location, exprtk::parser< T >::scope_element_manager::free_element(), exprtk::parser< T >::scope_element_manager::get_element(), exprtk::parser< T >::scope_element::ip_index, exprtk::parser< T >::lodge_symbol(), exprtk::parser< T >::scope_element::name, exprtk::parser< T >::scope_element_manager::next_ip_index(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::scope_element::ref_count, exprtk::parser< T >::parser_state::scope_depth, exprtk::parser< T >::sem_, exprtk::parser< T >::set_error(), exprtk::parser< T >::state_, exprtk::lexer::parser_helper::token_is(), exprtk::parser< T >::scope_element::type, and exprtk::parser< T >::scope_element::var_node.

Referenced by exprtk::parser< T >::parse_define_var_statement().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_vararg_function()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_vararg_function ( )
inlineprivate

Definition at line 27222 of file exprtk.hpp.

27223 {
27224 std::vector<expression_node_ptr> arg_list;
27225
27227 const std::string symbol = current_token().value;
27228
27229 if (details::imatch(symbol,"~"))
27230 {
27231 next_token();
27232 return parse_multi_sequence();
27233 }
27234 else if (details::imatch(symbol,"[*]"))
27235 {
27237 }
27238 else if (details::imatch(symbol, "avg" )) opt_type = details::e_avg ;
27239 else if (details::imatch(symbol, "mand")) opt_type = details::e_mand;
27240 else if (details::imatch(symbol, "max" )) opt_type = details::e_max ;
27241 else if (details::imatch(symbol, "min" )) opt_type = details::e_min ;
27242 else if (details::imatch(symbol, "mor" )) opt_type = details::e_mor ;
27243 else if (details::imatch(symbol, "mul" )) opt_type = details::e_prod;
27244 else if (details::imatch(symbol, "sum" )) opt_type = details::e_sum ;
27245 else
27246 {
27249 current_token(),
27250 "ERR102 - Unsupported built-in vararg function: " + symbol,
27252
27253 return error_node();
27254 }
27255
27256 scoped_vec_delete<expression_node_t> sdd((*this),arg_list);
27257
27258 lodge_symbol(symbol, e_st_function);
27259
27260 next_token();
27261
27263 {
27266 current_token(),
27267 "ERR103 - Expected '(' for call to vararg function: " + symbol,
27269
27270 return error_node();
27271 }
27272
27274 {
27277 current_token(),
27278 "ERR104 - vararg function: " + symbol +
27279 " requires at least one input parameter",
27281
27282 return error_node();
27283 }
27284
27285 for ( ; ; )
27286 {
27288
27289 if (0 == arg)
27290 return error_node();
27291 else
27292 arg_list.push_back(arg);
27293
27295 break;
27296 else if (!token_is(token_t::e_comma))
27297 {
27300 current_token(),
27301 "ERR105 - Expected ',' for call to vararg function: " + symbol,
27303
27304 return error_node();
27305 }
27306 }
27307
27308 const expression_node_ptr result = expression_generator_.vararg_function(opt_type,arg_list);
27309
27310 sdd.delete_ptr = (0 == result);
27311 return result;
27312 }
expression_node_ptr vararg_function(const details::operator_type &operation, Sequence< expression_node_ptr, Allocator > &arg_list)
Definition exprtk.hpp:33303
expression_node_ptr parse_multi_switch_statement()
Definition exprtk.hpp:27106

References exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scoped_vec_delete< Type >::delete_ptr, exprtk::details::e_avg, exprtk::lexer::token::e_comma, exprtk::details::e_default, exprtk::lexer::token::e_lbracket, exprtk::details::e_mand, exprtk::details::e_max, exprtk::details::e_min, exprtk::details::e_mor, exprtk::details::e_prod, exprtk::lexer::token::e_rbracket, exprtk::parser< T >::e_st_function, exprtk::details::e_sum, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::details::imatch(), exprtk::parser< T >::lodge_symbol(), exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parse_multi_sequence(), exprtk::parser< T >::parse_multi_switch_statement(), exprtk::parser< T >::set_error(), exprtk::lexer::parser_helper::token_is(), exprtk::lexer::token::value, and exprtk::parser< T >::expression_generator< Type >::vararg_function().

Referenced by exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_vararg_function_call()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_vararg_function_call ( ivararg_function< T > *  vararg_function,
const std::string &  vararg_function_name 
)
inlineprivate

Definition at line 28122 of file exprtk.hpp.

28123 {
28124 std::vector<expression_node_ptr> arg_list;
28125
28127
28128 scoped_vec_delete<expression_node_t> sdd((*this),arg_list);
28129
28130 next_token();
28131
28133 {
28135 {
28136 if (!vararg_function->allow_zero_parameters())
28137 {
28140 current_token(),
28141 "ERR125 - Zero parameter call to vararg function: "
28142 + vararg_function_name + " not allowed",
28144
28145 return error_node();
28146 }
28147 }
28148 else
28149 {
28150 for ( ; ; )
28151 {
28153
28154 if (0 == arg)
28155 return error_node();
28156 else
28157 arg_list.push_back(arg);
28158
28160 break;
28161 else if (!token_is(token_t::e_comma))
28162 {
28165 current_token(),
28166 "ERR126 - Expected ',' for call to vararg function: "
28167 + vararg_function_name,
28169
28170 return error_node();
28171 }
28172 }
28173 }
28174 }
28175 else if (!vararg_function->allow_zero_parameters())
28176 {
28179 current_token(),
28180 "ERR127 - Zero parameter call to vararg function: "
28181 + vararg_function_name + " not allowed",
28183
28184 return error_node();
28185 }
28186
28187 if (arg_list.size() < vararg_function->min_num_args())
28188 {
28191 current_token(),
28192 "ERR128 - Invalid number of parameters to call to vararg function: "
28193 + vararg_function_name + ", require at least "
28194 + details::to_str(static_cast<int>(vararg_function->min_num_args())) + " parameters",
28196
28197 return error_node();
28198 }
28199 else if (arg_list.size() > vararg_function->max_num_args())
28200 {
28203 current_token(),
28204 "ERR129 - Invalid number of parameters to call to vararg function: "
28205 + vararg_function_name + ", require no more than "
28206 + details::to_str(static_cast<int>(vararg_function->max_num_args())) + " parameters",
28208
28209 return error_node();
28210 }
28211
28212 result = expression_generator_.vararg_function_call(vararg_function,arg_list);
28213
28214 sdd.delete_ptr = (0 == result);
28215
28216 return result;
28217 }
expression_node_ptr vararg_function_call(ivararg_function_t *vaf, std::vector< expression_node_ptr > &arg_list)
Definition exprtk.hpp:33440

References exprtk::function_traits::allow_zero_parameters(), exprtk::lexer::parser_helper::current_token(), exprtk::parser< T >::scoped_vec_delete< Type >::delete_ptr, exprtk::lexer::token::e_comma, exprtk::lexer::token::e_lbracket, exprtk::lexer::token::e_rbracket, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::function_traits::max_num_args(), exprtk::function_traits::min_num_args(), exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::set_error(), exprtk::details::to_str(), exprtk::lexer::parser_helper::token_is(), and exprtk::parser< T >::expression_generator< Type >::vararg_function_call().

Referenced by exprtk::parser< T >::parse_symtab_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_vector()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_vector ( )
inlineprivate

Definition at line 28020 of file exprtk.hpp.

28021 {
28022 const std::string vector_name = current_token().value;
28023
28025
28026 const scope_element& se = sem_.get_active_element(vector_name);
28027
28028 if (
28029 !details::imatch(se.name, vector_name) ||
28030 (se.depth > state_.scope_depth) ||
28031 (scope_element::e_vector != se.type)
28032 )
28033 {
28034 typedef typename symtab_store::vector_context vec_ctxt_t;
28035 vec_ctxt_t vec_ctx = symtab_store_.get_vector_context(vector_name);
28036
28037 if (0 == vec_ctx.vector_holder)
28038 {
28041 current_token(),
28042 "ERR123 - Symbol '" + vector_name + " not a vector",
28044
28045 return error_node();
28046 }
28047
28048 assert(0 != vec_ctx.vector_holder);
28049 assert(0 != vec_ctx.symbol_table );
28050
28051 vec = vec_ctx.vector_holder;
28052
28053 if (symbol_table_t::e_immutable == vec_ctx.symbol_table->mutability())
28054 {
28056 current_token(),
28057 make_memory_range(vec->data(), vec->size()));
28058 }
28059 }
28060 else
28061 {
28062 vec = se.vec_node;
28063 }
28064
28065 assert(0 != vec);
28066
28067 next_token();
28068
28070 {
28072 }
28074 {
28075 return (vec->rebaseable()) ?
28077 expression_generator_(T(vec->size()));
28078 }
28079
28080 expression_node_ptr index_expr = parse_vector_index(vector_name);
28081
28082 if (index_expr)
28083 {
28085
28086 return synthesize_vector_element(vector_name, vec, vec_node, index_expr);
28087 }
28088
28089 return error_node();
28090 }
details::vector_size_node< T > vector_size_node_t
Definition exprtk.hpp:22227
vector_holder_t * vector_holder_ptr
Definition exprtk.hpp:22258
vector_context get_vector_context(const std::string &vector_name) const
Definition exprtk.hpp:23128

References exprtk::details::node_allocator::allocate(), exprtk::lexer::parser_helper::current_token(), exprtk::details::vector_holder< Type >::data(), exprtk::parser< T >::scope_element::depth, exprtk::symbol_table< T >::e_immutable, exprtk::lexer::token::e_lsqrbracket, exprtk::lexer::token::e_rsqrbracket, exprtk::parser_error::e_syntax, exprtk::parser< T >::scope_element::e_vector, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::parser< T >::scope_element_manager::get_active_element(), exprtk::parser< T >::symtab_store::get_vector_context(), exprtk::details::imatch(), exprtk::parser< T >::lodge_immutable_symbol(), exprtk::parser< T >::make_memory_range(), exprtk::parser< T >::scope_element::name, exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_vector_index(), exprtk::details::vector_holder< Type >::rebaseable(), exprtk::parser< T >::parser_state::scope_depth, exprtk::parser< T >::sem_, exprtk::parser< T >::set_error(), exprtk::details::vector_holder< Type >::size(), exprtk::parser< T >::state_, exprtk::parser< T >::symtab_store_, exprtk::parser< T >::synthesize_vector_element(), exprtk::lexer::parser_helper::token_is(), exprtk::parser< T >::scope_element::type, exprtk::lexer::token::value, exprtk::parser< T >::scope_element::vec_node, and exprtk::details::vector_holder< Type >::vector_holder().

Referenced by exprtk::parser< T >::parse_swap_statement(), and exprtk::parser< T >::parse_symtab_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_vector_index()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_vector_index ( const std::string &  vector_name = "")
inlineprivate

Definition at line 27990 of file exprtk.hpp.

27991 {
27992 expression_node_ptr index_expr = error_node();
27993
27994 if (0 == (index_expr = parse_expression()))
27995 {
27998 current_token(),
27999 "ERR121 - Failed to parse index for vector: '" + vector_name + "'",
28001
28002 return error_node();
28003 }
28005 {
28008 current_token(),
28009 "ERR122 - Expected ']' for index of vector: '" + vector_name + "'",
28011
28012 free_node(node_allocator_, index_expr);
28013
28014 return error_node();
28015 }
28016
28017 return index_expr;
28018 }

References exprtk::lexer::parser_helper::current_token(), exprtk::lexer::token::e_rsqrbracket, exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk_error_location, exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_expression(), exprtk::parser< T >::set_error(), and exprtk::lexer::parser_helper::token_is().

Referenced by exprtk::parser< T >::parse_pending_vector_index_operator(), and exprtk::parser< T >::parse_vector().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_while_loop()

template<typename T >
expression_node_ptr exprtk::parser< T >::parse_while_loop ( )
inlineprivate

Definition at line 26437 of file exprtk.hpp.

26438 {
26439 // Parse: [while][(][test expr][)][{][expression][}]
26440 expression_node_ptr condition = error_node();
26442 expression_node_ptr result_node = error_node();
26443
26444 bool result = true;
26445
26446 next_token();
26447
26449 {
26452 current_token(),
26453 "ERR062 - Expected '(' at start of while-loop condition statement",
26455
26456 return error_node();
26457 }
26458 else if (0 == (condition = parse_expression()))
26459 {
26462 current_token(),
26463 "ERR063 - Failed to parse condition for while-loop",
26465
26466 return error_node();
26467 }
26468 else if (!token_is(token_t::e_rbracket))
26469 {
26472 current_token(),
26473 "ERR064 - Expected ')' at end of while-loop condition statement",
26475
26476 result = false;
26477 }
26478
26479 brkcnt_list_.push_front(false);
26480
26481 if (result)
26482 {
26483 scoped_inc_dec sid(state_.parsing_loop_stmt_count);
26484
26485 if (0 == (branch = parse_multi_sequence("while-loop", true)))
26486 {
26489 current_token(),
26490 "ERR065 - Failed to parse body of while-loop"));
26491 result = false;
26492 }
26493 else if (0 == (result_node = expression_generator_.while_loop(condition,
26494 branch,
26495 brkcnt_list_.front())))
26496 {
26499 current_token(),
26500 "ERR066 - Failed to synthesize while-loop",
26502
26503 result = false;
26504 }
26505 }
26506
26508
26509 if (!result)
26510 {
26511 free_node(node_allocator_, branch );
26512 free_node(node_allocator_, condition );
26513 free_node(node_allocator_, result_node);
26514
26515 return error_node();
26516 }
26517
26518 if (result_node && result_node->valid())
26519 {
26520 return result_node;
26521 }
26522
26525 current_token(),
26526 "ERR067 - Failed to synthesize 'valid' while-loop",
26528
26529 free_node(node_allocator_, result_node);
26530
26531 return error_node();
26532 }
expression_node_ptr while_loop(expression_node_ptr &condition, expression_node_ptr &branch, const bool break_continue_present=false) const
Definition exprtk.hpp:32444

References exprtk::parser< T >::brkcnt_list_, exprtk::lexer::parser_helper::current_token(), exprtk::lexer::token::e_lbracket, exprtk::lexer::token::e_rbracket, exprtk::parser_error::e_syntax, exprtk::parser_error::e_synthesis, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::parser< T >::handle_brkcnt_scope_exit(), exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parse_multi_sequence(), exprtk::parser< T >::parser_state::parsing_loop_stmt_count, exprtk::parser< T >::set_error(), exprtk::parser< T >::state_, exprtk::lexer::parser_helper::token_is(), exprtk::details::expression_node< T >::valid(), and exprtk::parser< T >::expression_generator< Type >::while_loop().

Referenced by exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ pop_current_state()

template<typename T >
void exprtk::parser< T >::pop_current_state ( )
inlineprivate

Definition at line 25029 of file exprtk.hpp.

25030 {
25031 if (!current_state_stack_.empty())
25032 {
25033 current_state_stack_.pop_back();
25034 }
25035 }

References exprtk::parser< T >::current_state_stack_.

Referenced by exprtk::parser< T >::parse_expression().

Here is the caller graph for this function:

◆ post_bracket_process()

template<typename T >
bool exprtk::parser< T >::post_bracket_process ( const typename token_t::token_type token,
expression_node_ptr branch 
)
inlineprivate

Definition at line 30563 of file exprtk.hpp.

30564 {
30565 bool implied_mul = false;
30566
30568 return true;
30569
30570 const lexer::parser_helper::token_advance_mode hold = prsrhlpr_t::e_hold;
30571
30572 switch (token)
30573 {
30574 case token_t::e_lcrlbracket : implied_mul = token_is(token_t::e_lbracket , hold) ||
30577 break;
30578
30579 case token_t::e_lbracket : implied_mul = token_is(token_t::e_lbracket , hold) ||
30582 break;
30583
30584 case token_t::e_lsqrbracket : implied_mul = token_is(token_t::e_lbracket , hold) ||
30587 break;
30588
30589 default : return true;
30590 }
30591
30592 if (implied_mul)
30593 {
30595 {
30598 current_token(),
30599 "ERR223 - Invalid sequence of brackets",
30601
30602 return false;
30603 }
30604 else if (token_t::e_eof != current_token().type)
30605 {
30608 next_token();
30609 }
30610 }
30611
30612 return true;
30613 }
void insert_front(token_t::token_type tk_type)
Definition exprtk.hpp:2521

References exprtk::parser< T >::settings_store::commutative_check_enabled(), exprtk::lexer::parser_helper::current_token(), exprtk::lexer::token::e_eof, exprtk::lexer::token::e_lbracket, exprtk::lexer::token::e_lcrlbracket, exprtk::lexer::token::e_lsqrbracket, exprtk::lexer::token::e_mul, exprtk::parser_error::e_syntax, exprtk_error_location, exprtk::lexer::generator::insert_front(), exprtk::details::is_generally_string_node(), exprtk::lexer::parser_helper::lexer(), exprtk::lexer::parser_helper::next_token(), exprtk::parser< T >::set_error(), exprtk::parser< T >::settings_, and exprtk::lexer::parser_helper::token_is().

Referenced by exprtk::parser< T >::parse_branch().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ post_variable_process()

template<typename T >
bool exprtk::parser< T >::post_variable_process ( const std::string &  symbol)
inlineprivate

Definition at line 30538 of file exprtk.hpp.

30539 {
30540 if (
30544 )
30545 {
30547 {
30550 current_token(),
30551 "ERR222 - Invalid sequence of variable '" + symbol + "' and bracket",
30553
30554 return false;
30555 }
30556
30558 }
30559
30560 return true;
30561 }

References exprtk::parser< T >::settings_store::commutative_check_enabled(), exprtk::lexer::parser_helper::current_token(), exprtk::lexer::token::e_lbracket, exprtk::lexer::token::e_lcrlbracket, exprtk::lexer::token::e_lsqrbracket, exprtk::lexer::token::e_mul, exprtk::parser_error::e_syntax, exprtk_error_location, exprtk::lexer::generator::insert_front(), exprtk::lexer::parser_helper::lexer(), exprtk::lexer::parser_helper::peek_token_is(), exprtk::parser< T >::set_error(), and exprtk::parser< T >::settings_.

Referenced by exprtk::parser< T >::parse_symtab_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ process_lexer_errors()

template<typename T >
void exprtk::parser< T >::process_lexer_errors ( )
inline

Definition at line 24563 of file exprtk.hpp.

24564 {
24565 for (std::size_t i = 0; i < lexer().size(); ++i)
24566 {
24567 if (lexer()[i].is_error())
24568 {
24569 std::string diagnostic = "ERR004 - ";
24570
24571 switch (lexer()[i].type)
24572 {
24573 case lexer::token::e_error : diagnostic += "General token error";
24574 break;
24575
24576 case lexer::token::e_err_symbol : diagnostic += "Symbol error";
24577 break;
24578
24579 case lexer::token::e_err_number : diagnostic += "Invalid numeric token";
24580 break;
24581
24582 case lexer::token::e_err_string : diagnostic += "Invalid string token";
24583 break;
24584
24585 case lexer::token::e_err_sfunc : diagnostic += "Invalid special function token";
24586 break;
24587
24588 default : diagnostic += "Unknown compiler error";
24589 }
24590
24593 lexer()[i],
24594 diagnostic + ": " + lexer()[i].value,
24596 }
24597 }
24598 }
std::size_t size() const
Definition exprtk.hpp:2455

References exprtk::lexer::token::e_err_number, exprtk::lexer::token::e_err_sfunc, exprtk::lexer::token::e_err_string, exprtk::lexer::token::e_err_symbol, exprtk::lexer::token::e_error, exprtk::parser_error::e_lexer, exprtk_error_location, exprtk::lexer::parser_helper::lexer(), exprtk::parser< T >::set_error(), and exprtk::lexer::generator::size().

Referenced by exprtk::parser< T >::compile().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ push_current_state()

template<typename T >
void exprtk::parser< T >::push_current_state ( const state_t  current_state)
inlineprivate

Definition at line 25024 of file exprtk.hpp.

25025 {
25027 }

References exprtk::parser< T >::current_state(), and exprtk::parser< T >::current_state_stack_.

Referenced by exprtk::parser< T >::parse_expression().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ register_assert_check()

template<typename T >
void exprtk::parser< T >::register_assert_check ( assert_check assrt_chck)
inline

Definition at line 24798 of file exprtk.hpp.

24799 {
24800 assert_check_ = &assrt_chck;
24801 }

References exprtk::parser< T >::assert_check_.

◆ register_compilation_timeout_check()

template<typename T >
void exprtk::parser< T >::register_compilation_timeout_check ( compilation_check compchk)
inline

Definition at line 24793 of file exprtk.hpp.

24794 {
24795 compilation_check_ptr_ = &compchk;
24796 }

References exprtk::parser< T >::compilation_check_ptr_.

Referenced by exprtk::function_compositor< T >::register_compilation_timeout_check().

Here is the caller graph for this function:

◆ register_local_vars()

template<typename T >
void exprtk::parser< T >::register_local_vars ( expression< T > &  e)
inlineprivate

Definition at line 41351 of file exprtk.hpp.

41352 {
41353 for (std::size_t i = 0; i < sem_.size(); ++i)
41354 {
41355 scope_element& se = sem_.get_element(i);
41356
41357 exprtk_debug(("register_local_vars() - se[%s]\n", se.name.c_str()));
41358
41359 if (
41360 (scope_element::e_variable == se.type) ||
41361 (scope_element::e_literal == se.type) ||
41362 (scope_element::e_vecelem == se.type)
41363 )
41364 {
41365 if (se.var_node)
41366 {
41367 e.register_local_var(se.var_node);
41368 }
41369
41370 if (se.data)
41371 {
41372 e.register_local_data(se.data, 1, 0);
41373 }
41374 }
41375 else if (scope_element::e_vector == se.type)
41376 {
41377 if (se.vec_node)
41378 {
41379 e.register_local_var(se.vec_node);
41380 }
41381
41382 if (se.data)
41383 {
41384 e.register_local_data(se.data, se.size, 1);
41385 }
41386 }
41387 #ifndef exprtk_disable_string_capabilities
41388 else if (scope_element::e_string == se.type)
41389 {
41390 if (se.str_node)
41391 {
41392 e.register_local_var(se.str_node);
41393 }
41394
41395 if (se.data)
41396 {
41397 e.register_local_data(se.data, se.size, 2);
41398 }
41399 }
41400 #endif
41401
41402 se.var_node = 0;
41403 se.vec_node = 0;
41404 #ifndef exprtk_disable_string_capabilities
41405 se.str_node = 0;
41406 #endif
41407 se.data = 0;
41408 se.ref_count = 0;
41409 se.active = false;
41410 }
41411 }

References exprtk::parser< T >::scope_element::active, exprtk::parser< T >::scope_element::data, exprtk::parser< T >::scope_element::e_literal, exprtk::parser< T >::scope_element::e_string, exprtk::parser< T >::scope_element::e_variable, exprtk::parser< T >::scope_element::e_vecelem, exprtk::parser< T >::scope_element::e_vector, exprtk_debug, exprtk::parser< T >::scope_element_manager::get_element(), exprtk::parser< T >::scope_element::name, exprtk::parser< T >::scope_element::ref_count, exprtk::parser< T >::sem_, exprtk::parser< T >::scope_element::size, exprtk::parser< T >::scope_element_manager::size(), exprtk::parser< T >::scope_element::str_node, exprtk::parser< T >::scope_element::type, exprtk::parser< T >::scope_element::var_node, and exprtk::parser< T >::scope_element::vec_node.

Referenced by exprtk::parser< T >::compile().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ register_loop_runtime_check()

template<typename T >
void exprtk::parser< T >::register_loop_runtime_check ( loop_runtime_check lrtchk)
inline

Definition at line 24783 of file exprtk.hpp.

24784 {
24785 loop_runtime_check_ = &lrtchk;
24786 }

References exprtk::parser< T >::loop_runtime_check_.

Referenced by exprtk::function_compositor< T >::register_loop_runtime_check().

Here is the caller graph for this function:

◆ register_return_results()

template<typename T >
void exprtk::parser< T >::register_return_results ( expression< T > &  e)
inlineprivate

Definition at line 41413 of file exprtk.hpp.

41414 {
41415 e.register_return_results(results_context_);
41416 results_context_ = 0;
41417 }

References exprtk::parser< T >::results_context_.

Referenced by exprtk::parser< T >::compile().

Here is the caller graph for this function:

◆ register_vector_access_runtime_check()

template<typename T >
void exprtk::parser< T >::register_vector_access_runtime_check ( vector_access_runtime_check vartchk)
inline

Definition at line 24788 of file exprtk.hpp.

24789 {
24791 }

References exprtk::parser< T >::vector_access_runtime_check_.

Referenced by exprtk::function_compositor< T >::register_vector_access_runtime_check().

Here is the caller graph for this function:

◆ remove_last_error()

template<typename T >
void exprtk::parser< T >::remove_last_error ( )
inlineprivate

Definition at line 41335 of file exprtk.hpp.

41336 {
41337 if (!error_list_.empty())
41338 {
41339 error_list_.pop_back();
41340 }
41341 }

References exprtk::parser< T >::error_list_.

◆ remove_replace_symbol()

template<typename T >
bool exprtk::parser< T >::remove_replace_symbol ( const std::string &  symbol)
inline

Definition at line 24752 of file exprtk.hpp.

24753 {
24755 return false;
24756 else if (details::is_reserved_word(symbol))
24757 return false;
24758 else
24759 return symbol_replacer_.remove(symbol);
24760 }
bool remove(const std::string &target_symbol)
Definition exprtk.hpp:3872
bool is_reserved_word(const std::string &symbol)
Definition exprtk.hpp:516

References exprtk::details::is_reserved_word(), exprtk::lexer::helper::symbol_replacer::remove(), exprtk::parser< T >::settings_store::replacer_enabled(), exprtk::parser< T >::settings_, and exprtk::parser< T >::symbol_replacer_.

Here is the call graph for this function:

◆ replace_symbol()

template<typename T >
bool exprtk::parser< T >::replace_symbol ( const std::string &  old_symbol,
const std::string &  new_symbol 
)
inline

Definition at line 24742 of file exprtk.hpp.

24743 {
24745 return false;
24746 else if (details::is_reserved_word(old_symbol))
24747 return false;
24748 else
24749 return symbol_replacer_.add_replace(old_symbol,new_symbol,lexer::token::e_symbol);
24750 }

References exprtk::lexer::helper::symbol_replacer::add_replace(), exprtk::lexer::token::e_symbol, exprtk::details::is_reserved_word(), exprtk::parser< T >::settings_store::replacer_enabled(), exprtk::parser< T >::settings_, and exprtk::parser< T >::symbol_replacer_.

Here is the call graph for this function:

◆ results_ctx()

template<typename T >
results_context_t & exprtk::parser< T >::results_ctx ( )
inlineprivate

Definition at line 41586 of file exprtk.hpp.

41587 {
41588 if (0 == results_context_)
41589 {
41591 }
41592
41593 return (*results_context_);
41594 }
results_context< T > results_context_t
Definition exprtk.hpp:22302

References exprtk::parser< T >::results_context_.

Referenced by exprtk::parser< T >::expression_generator< Type >::return_call().

Here is the caller graph for this function:

◆ return_cleanup()

template<typename T >
void exprtk::parser< T >::return_cleanup ( )
inlineprivate

Definition at line 41596 of file exprtk.hpp.

41597 {
41598 #ifndef exprtk_disable_return_statement
41599 if (results_context_)
41600 {
41601 delete results_context_;
41602 results_context_ = 0;
41603 }
41604
41606 #endif
41607 }

References exprtk::parser< T >::results_context_, exprtk::parser< T >::parser_state::return_stmt_present, and exprtk::parser< T >::state_.

Referenced by exprtk::parser< T >::compile().

Here is the caller graph for this function:

◆ run_assemblies()

template<typename T >
bool exprtk::parser< T >::run_assemblies ( )
inline

Definition at line 24600 of file exprtk.hpp.

24601 {
24603 {
24605 }
24606
24608 {
24610 }
24611
24613 {
24615 }
24616
24617 if (
24621 )
24622 {
24624 {
24626 {
24627 lexer::helper::bracket_checker* bracket_checker_ptr = 0;
24628 lexer::helper::numeric_checker<T>* numeric_checker_ptr = 0;
24629 lexer::helper::sequence_validator* sequence_validator_ptr = 0;
24630 lexer::helper::sequence_validator_3tokens* sequence_validator3_ptr = 0;
24631
24632 if (0 != (bracket_checker_ptr = dynamic_cast<lexer::helper::bracket_checker*>(helper_assembly_.error_token_scanner)))
24633 {
24636 bracket_checker_ptr->error_token(),
24637 "ERR005 - Mismatched brackets: '" + bracket_checker_ptr->error_token().value + "'",
24639 }
24640 else if (0 != (numeric_checker_ptr = dynamic_cast<lexer::helper::numeric_checker<T>*>(helper_assembly_.error_token_scanner)))
24641 {
24642 for (std::size_t i = 0; i < numeric_checker_ptr->error_count(); ++i)
24643 {
24644 lexer::token error_token = lexer()[numeric_checker_ptr->error_index(i)];
24645
24648 error_token,
24649 "ERR006 - Invalid numeric token: '" + error_token.value + "'",
24651 }
24652
24653 if (numeric_checker_ptr->error_count())
24654 {
24655 numeric_checker_ptr->clear_errors();
24656 }
24657 }
24658 else if (0 != (sequence_validator_ptr = dynamic_cast<lexer::helper::sequence_validator*>(helper_assembly_.error_token_scanner)))
24659 {
24660 for (std::size_t i = 0; i < sequence_validator_ptr->error_count(); ++i)
24661 {
24662 std::pair<lexer::token,lexer::token> error_token = sequence_validator_ptr->error(i);
24663
24666 error_token.first,
24667 "ERR007 - Invalid token sequence: '" +
24668 error_token.first.value + "' and '" +
24669 error_token.second.value + "'",
24671 }
24672
24673 if (sequence_validator_ptr->error_count())
24674 {
24675 sequence_validator_ptr->clear_errors();
24676 }
24677 }
24678 else if (0 != (sequence_validator3_ptr = dynamic_cast<lexer::helper::sequence_validator_3tokens*>(helper_assembly_.error_token_scanner)))
24679 {
24680 for (std::size_t i = 0; i < sequence_validator3_ptr->error_count(); ++i)
24681 {
24682 std::pair<lexer::token,lexer::token> error_token = sequence_validator3_ptr->error(i);
24683
24686 error_token.first,
24687 "ERR008 - Invalid token sequence: '" +
24688 error_token.first.value + "' and '" +
24689 error_token.second.value + "'",
24691 }
24692
24693 if (sequence_validator3_ptr->error_count())
24694 {
24695 sequence_validator3_ptr->clear_errors();
24696 }
24697 }
24698 }
24699
24700 return false;
24701 }
24702 }
24703
24704 return true;
24705 }
bool run_inserters(lexer::generator &g)
Definition exprtk.hpp:4290
bool run_joiners(lexer::generator &g)
Definition exprtk.hpp:4268
bool run_scanners(lexer::generator &g)
Definition exprtk.hpp:4312
lexer::token_scanner * error_token_scanner
Definition exprtk.hpp:4339
bool run_modifiers(lexer::generator &g)
Definition exprtk.hpp:4246

References exprtk::parser< T >::settings_store::bracket_check_enabled(), exprtk::lexer::helper::numeric_checker< T >::clear_errors(), exprtk::lexer::helper::sequence_validator::clear_errors(), exprtk::lexer::helper::sequence_validator_3tokens::clear_errors(), exprtk::parser< T >::settings_store::commutative_check_enabled(), exprtk::parser_error::e_token, exprtk::lexer::helper::sequence_validator::error(), exprtk::lexer::helper::sequence_validator_3tokens::error(), exprtk::lexer::helper::numeric_checker< T >::error_count(), exprtk::lexer::helper::sequence_validator::error_count(), exprtk::lexer::helper::sequence_validator_3tokens::error_count(), exprtk::lexer::helper::numeric_checker< T >::error_index(), exprtk::lexer::helper::bracket_checker::error_token(), exprtk::lexer::helper::helper_assembly::error_token_scanner, exprtk_error_location, exprtk::parser< T >::helper_assembly_, exprtk::parser< T >::settings_store::joiner_enabled(), exprtk::lexer::parser_helper::lexer(), exprtk::parser< T >::settings_store::numeric_check_enabled(), exprtk::parser< T >::settings_store::replacer_enabled(), exprtk::lexer::helper::helper_assembly::run_inserters(), exprtk::lexer::helper::helper_assembly::run_joiners(), exprtk::lexer::helper::helper_assembly::run_modifiers(), exprtk::lexer::helper::helper_assembly::run_scanners(), exprtk::parser< T >::settings_store::sequence_check_enabled(), exprtk::parser< T >::set_error(), exprtk::parser< T >::settings_, and exprtk::lexer::token::value.

Referenced by exprtk::parser< T >::compile().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_error()

template<typename T >
void exprtk::parser< T >::set_error ( const parser_error::type error_type)
inlineprivate

Definition at line 41330 of file exprtk.hpp.

41331 {
41332 error_list_.push_back(error_type);
41333 }

References exprtk::parser< T >::error_list_.

Referenced by exprtk::parser< T >::expression_generator< Type >::assign_immutable_symbol(), exprtk::parser< T >::compile(), exprtk::parser< T >::expression_generator< Type >::conditional(), exprtk::parser< T >::expression_generator< Type >::conditional_string(), exprtk::parser< T >::expression_generator< Type >::conditional_vector(), exprtk::parser< T >::expression_generator< Type >::for_loop(), exprtk::parser< T >::expression_generator< Type >::function(), exprtk::parser< T >::expression_generator< Type >::generic_function_call(), exprtk::parser< T >::halt_compilation_check(), exprtk::parser< T >::expression_generator< Type >::operator()(), exprtk::parser< T >::expression_generator< Type >::operator()(), exprtk::parser< T >::parse_assert_statement(), exprtk::parser< T >::parse_base_function_call(), exprtk::parser< T >::parse_base_operation(), exprtk::parser< T >::parse_branch(), exprtk::parser< T >::parse_break_statement(), exprtk::parser< T >::parse_conditional_statement(), exprtk::parser< T >::parse_conditional_statement_01(), exprtk::parser< T >::parse_conditional_statement_02(), exprtk::parser< T >::parse_const_string(), exprtk::parser< T >::parse_continue_statement(), exprtk::parser< T >::parse_corpus(), exprtk::parser< T >::parse_define_constvar_statement(), exprtk::parser< T >::parse_define_string_statement(), exprtk::parser< T >::parse_define_var_statement(), exprtk::parser< T >::parse_define_vector_statement(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parse_for_loop(), exprtk::parser< T >::parse_function_call(), exprtk::parser< T >::parse_function_call_0(), exprtk::parser< T >::parse_function_invocation(), exprtk::parser< T >::type_checker::parse_function_prototypes(), exprtk::parser< T >::parse_generic_function_call(), exprtk::parser< T >::parse_igeneric_function_params(), exprtk::parser< T >::parse_multi_sequence(), exprtk::parser< T >::parse_multi_switch_statement(), exprtk::parser< T >::parse_not_statement(), exprtk::parser< T >::parse_overload_function_call(), exprtk::parser< T >::parse_range(), exprtk::parser< T >::parse_repeat_until_loop(), exprtk::parser< T >::parse_return_statement(), exprtk::parser< T >::parse_special_function(), exprtk::parser< T >::parse_string(), exprtk::parser< T >::parse_string_function_call(), exprtk::parser< T >::parse_string_range_statement(), exprtk::parser< T >::parse_swap_statement(), exprtk::parser< T >::parse_switch_statement(), exprtk::parser< T >::parse_symbol(), exprtk::parser< T >::parse_symtab_symbol(), exprtk::parser< T >::parse_ternary_conditional_statement(), exprtk::parser< T >::parse_uninitialised_var_statement(), exprtk::parser< T >::parse_vararg_function(), exprtk::parser< T >::parse_vararg_function_call(), exprtk::parser< T >::parse_vector(), exprtk::parser< T >::parse_vector_index(), exprtk::parser< T >::parse_while_loop(), exprtk::parser< T >::post_bracket_process(), exprtk::parser< T >::post_variable_process(), exprtk::parser< T >::parse_special_function_impl< Type, NumberOfParameters >::process(), exprtk::parser< T >::process_lexer_errors(), exprtk::parser< T >::expression_generator< Type >::return_call(), exprtk::parser< T >::run_assemblies(), exprtk::parser< T >::simplify_unary_negation_branch(), exprtk::parser< T >::stack_limit_handler::stack_limit_handler(), exprtk::parser< T >::expression_generator< Type >::string_function_call(), exprtk::parser< T >::expression_generator< Type >::synthesize_assignment_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_assignment_operation_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_swap_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_vecarithmetic_operation_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_veceqineqlogic_operation_expression(), exprtk::parser< T >::synthesize_vector_element(), exprtk::parser< T >::expression_generator< Type >::vararg_function(), exprtk::parser< T >::expression_generator< Type >::vararg_function_call(), exprtk::parser< T >::expression_generator< Type >::vector_element(), exprtk::parser< T >::type_checker::verify(), and exprtk::parser< T >::expression_generator< Type >::while_loop().

Here is the caller graph for this function:

◆ set_synthesis_error()

template<typename T >
void exprtk::parser< T >::set_synthesis_error ( const std::string &  synthesis_error_message)
inlineprivate

◆ settings()

template<typename T >
settings_store & exprtk::parser< T >::settings ( )
inline

◆ simplify()

template<typename T >
template<typename Allocator1 , typename Allocator2 , template< typename, typename > class Sequence>
expression_node_ptr exprtk::parser< T >::simplify ( Sequence< expression_node_ptr, Allocator1 > &  expression_list,
Sequence< bool, Allocator2 > &  side_effect_list,
const bool  specialise_on_final_type = false 
)
inlineprivate

Definition at line 27459 of file exprtk.hpp.

27462 {
27463 if (expression_list.empty())
27464 return error_node();
27465 else if (1 == expression_list.size())
27466 return expression_list[0];
27467
27468 Sequence<expression_node_ptr,Allocator1> tmp_expression_list;
27469
27470 bool return_node_present = false;
27471
27472 for (std::size_t i = 0; i < (expression_list.size() - 1); ++i)
27473 {
27475 continue;
27476 else if (
27477 is_return_node (expression_list[i]) ||
27480 )
27481 {
27482 tmp_expression_list.push_back(expression_list[i]);
27483
27484 // Remove all subexpressions after first short-circuit
27485 // node has been encountered.
27486
27487 for (std::size_t j = i + 1; j < expression_list.size(); ++j)
27488 {
27490 }
27491
27492 return_node_present = true;
27493
27494 break;
27495 }
27496 else if (
27498 is_null_node (expression_list[i]) ||
27499 !side_effect_list[i]
27500 )
27501 {
27503 continue;
27504 }
27505 else
27506 tmp_expression_list.push_back(expression_list[i]);
27507 }
27508
27509 if (!return_node_present)
27510 {
27511 tmp_expression_list.push_back(expression_list.back());
27512 }
27513
27514 expression_list.swap(tmp_expression_list);
27515
27516 if (tmp_expression_list.size() > expression_list.size())
27517 {
27518 exprtk_debug(("simplify() - Reduced subexpressions from %d to %d\n",
27519 static_cast<int>(tmp_expression_list.size()),
27520 static_cast<int>(expression_list .size())));
27521 }
27522
27523 if (
27524 return_node_present ||
27525 side_effect_list.back() ||
27526 (expression_list.size() > 1)
27527 )
27528 state_.activate_side_effect("simplify()");
27529
27530 if (1 == expression_list.size())
27531 return expression_list[0];
27532 else if (specialise_on_final_type && is_generally_string_node(expression_list.back()))
27534 else
27536 }
static const std::string expression_list[]
bool is_variable_node(const expression_node< T > *node)
Definition exprtk.hpp:5679
bool is_continue_node(const expression_node< T > *node)
Definition exprtk.hpp:5803
bool is_break_node(const expression_node< T > *node)
Definition exprtk.hpp:5797

References exprtk::parser< T >::parser_state::activate_side_effect(), exprtk::details::e_multi, exprtk::details::e_smulti, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, expression_list, exprtk_debug, exprtk::parser< T >::node_allocator_, exprtk::parser< T >::state_, and exprtk::parser< T >::expression_generator< Type >::vararg_function().

Referenced by exprtk::parser< T >::parse_corpus(), exprtk::parser< T >::parse_multi_sequence(), and exprtk::parser< T >::parse_repeat_until_loop().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ simplify_unary_negation_branch()

template<typename T >
bool exprtk::parser< T >::simplify_unary_negation_branch ( expression_node_ptr node)
inlineprivate

Definition at line 25350 of file exprtk.hpp.

25351 {
25352 {
25354 ubn_t* n = dynamic_cast<ubn_t*>(node);
25355
25356 if (n)
25357 {
25358 expression_node_ptr un_r = n->branch(0);
25359 n->release();
25361 node = un_r;
25362
25363 return true;
25364 }
25365 }
25366
25367 {
25369
25370 uvn_t* n = dynamic_cast<uvn_t*>(node);
25371
25372 if (n)
25373 {
25374 const T& v = n->v();
25375 expression_node_ptr return_node = error_node();
25376
25377 if (
25378 (0 != (return_node = symtab_store_.get_variable(v))) ||
25379 (0 != (return_node = sem_ .get_variable(v)))
25380 )
25381 {
25383 node = return_node;
25384
25385 return true;
25386 }
25387 else
25388 {
25391 current_token(),
25392 "ERR018 - Failed to find variable node in symbol table",
25394
25396
25397 return false;
25398 }
25399 }
25400 }
25401
25402 return false;
25403 }
virtual expression_node< T > * branch(const std::size_t &index=0) const
Definition exprtk.hpp:5596
expression_node_ptr get_variable(const T &v)
Definition exprtk.hpp:22563

References exprtk::details::expression_node< T >::branch(), exprtk::lexer::parser_helper::current_token(), exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk_error_location, exprtk::parser< T >::symtab_store::get_variable(), exprtk::parser< T >::scope_element_manager::get_variable(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::sem_, exprtk::parser< T >::set_error(), exprtk::parser< T >::symtab_store_, and exprtk::details::unary_variable_node< T, Operation >::v().

Referenced by exprtk::parser< T >::parse_branch(), and exprtk::parser< T >::expression_generator< Type >::synthesize_binary_ext_expression::process().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ synthesize_vector_element()

template<typename T >
expression_node_ptr exprtk::parser< T >::synthesize_vector_element ( const std::string &  vector_name,
vector_holder_ptr  vec,
expression_node_ptr  vec_node,
expression_node_ptr  index_expr 
)
inlineprivate

Definition at line 28092 of file exprtk.hpp.

28096 {
28097 // Perform compile-time range check
28098 if (details::is_constant_node(index_expr))
28099 {
28100 const std::size_t index = static_cast<std::size_t>(details::numeric::to_int32(index_expr->value()));
28101 const std::size_t vec_size = vec->size();
28102
28103 if (index >= vec_size)
28104 {
28107 current_token(),
28108 "ERR124 - Index of " + details::to_str(index) + " out of range for "
28109 "vector '" + vector_name + "' of size " + details::to_str(vec_size),
28111
28112 free_node(node_allocator_, vec_node );
28113 free_node(node_allocator_, index_expr);
28114
28115 return error_node();
28116 }
28117 }
28118
28119 return expression_generator_.vector_element(vector_name, vec, vec_node, index_expr);
28120 }
expression_node_ptr vector_element(const std::string &symbol, vector_holder_ptr vector_base, expression_node_ptr vec_node, expression_node_ptr index)
Definition exprtk.hpp:33702

References exprtk::lexer::parser_helper::current_token(), exprtk::parser_error::e_syntax, exprtk::parser< T >::error_node(), exprtk::parser< T >::expression_generator_, exprtk_error_location, exprtk::details::is_constant_node(), exprtk::parser< T >::node_allocator_, exprtk::parser< T >::set_error(), exprtk::details::vector_holder< Type >::size(), exprtk::details::numeric::to_int32(), exprtk::details::to_str(), exprtk::details::expression_node< T >::value(), and exprtk::parser< T >::expression_generator< Type >::vector_element().

Referenced by exprtk::parser< T >::parse_pending_vector_index_operator(), and exprtk::parser< T >::parse_vector().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ valid_base_operation()

template<typename T >
bool exprtk::parser< T >::valid_base_operation ( const std::string &  symbol) const
inlineprivate

Definition at line 24825 of file exprtk.hpp.

24826 {
24827 const std::size_t length = symbol.size();
24828
24829 if (
24830 (length < 3) || // Shortest base op symbol length
24831 (length > 9) // Longest base op symbol length
24832 )
24833 return false;
24834 else
24835 return settings_.function_enabled(symbol) &&
24836 (base_ops_map_.end() != base_ops_map_.find(symbol));
24837 }

References exprtk::parser< T >::base_ops_map_, exprtk::parser< T >::settings_store::function_enabled(), and exprtk::parser< T >::settings_.

Referenced by exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ valid_vararg_operation()

template<typename T >
bool exprtk::parser< T >::valid_vararg_operation ( const std::string &  symbol) const
inlineprivate

Definition at line 24839 of file exprtk.hpp.

24840 {
24841 static const std::string s_sum = "sum" ;
24842 static const std::string s_mul = "mul" ;
24843 static const std::string s_avg = "avg" ;
24844 static const std::string s_min = "min" ;
24845 static const std::string s_max = "max" ;
24846 static const std::string s_mand = "mand";
24847 static const std::string s_mor = "mor" ;
24848 static const std::string s_multi = "~" ;
24849 static const std::string s_mswitch = "[*]" ;
24850
24851 return
24852 (
24853 details::imatch(symbol,s_sum ) ||
24854 details::imatch(symbol,s_mul ) ||
24855 details::imatch(symbol,s_avg ) ||
24856 details::imatch(symbol,s_min ) ||
24857 details::imatch(symbol,s_max ) ||
24858 details::imatch(symbol,s_mand ) ||
24859 details::imatch(symbol,s_mor ) ||
24860 details::imatch(symbol,s_multi ) ||
24861 details::imatch(symbol,s_mswitch)
24862 ) &&
24864 }

References exprtk::parser< T >::settings_store::function_enabled(), exprtk::details::imatch(), and exprtk::parser< T >::settings_.

Referenced by exprtk::parser< T >::parse_symbol().

Here is the call graph for this function:
Here is the caller graph for this function:

Friends And Related Symbol Documentation

◆ details::disable_type_checking

template<typename T >
template<typename ParserType >
void details::disable_type_checking ( ParserType &  p)
friend

Member Data Documentation

◆ assert_check_

template<typename T >
assert_check_ptr exprtk::parser< T >::assert_check_
private

◆ assert_ids_

template<typename T >
std::set<std::string> exprtk::parser< T >::assert_ids_
private

◆ base_ops_map_

template<typename T >
base_ops_map_t exprtk::parser< T >::base_ops_map_
private

◆ binary_op_map_

template<typename T >
binary_op_map_t exprtk::parser< T >::binary_op_map_
private

Definition at line 41628 of file exprtk.hpp.

Referenced by exprtk::parser< T >::parser().

◆ bracket_checker_

template<typename T >
lexer::helper::bracket_checker exprtk::parser< T >::bracket_checker_
private

Definition at line 41645 of file exprtk.hpp.

Referenced by exprtk::parser< T >::init_precompilation().

◆ brkcnt_list_

template<typename T >
std::deque<bool> exprtk::parser< T >::brkcnt_list_
private

◆ commutative_inserter_

template<typename T >
lexer::helper::commutative_inserter exprtk::parser< T >::commutative_inserter_
private

Definition at line 41641 of file exprtk.hpp.

Referenced by exprtk::parser< T >::init_precompilation().

◆ compilation_check_ptr_

template<typename T >
compilation_check_ptr exprtk::parser< T >::compilation_check_ptr_
private

◆ current_state_stack_

template<typename T >
std::vector<state_t> exprtk::parser< T >::current_state_stack_
private

◆ dec_

template<typename T >
dependent_entity_collector exprtk::parser< T >::dec_
private

◆ default_precedence

template<typename T >
const precedence_level exprtk::parser< T >::default_precedence = e_level00
staticprivate

Definition at line 24996 of file exprtk.hpp.

◆ default_usr_

template<typename T >
unknown_symbol_resolver exprtk::parser< T >::default_usr_
private

◆ error_list_

template<typename T >
std::deque<parser_error::type> exprtk::parser< T >::error_list_
private

◆ expression_generator_

template<typename T >
expression_generator<T> exprtk::parser< T >::expression_generator_
private

Definition at line 41615 of file exprtk.hpp.

Referenced by exprtk::parser< T >::compile(), exprtk::parser< T >::parse_assert_statement(), exprtk::parser< T >::parse_branch(), exprtk::parser< T >::parse_conditional_statement_01(), exprtk::parser< T >::parse_conditional_statement_02(), exprtk::parser< T >::parse_const_string(), exprtk::parser< T >::parse_define_constvar_statement(), exprtk::parser< T >::parse_define_string_statement(), exprtk::parser< T >::parse_define_var_statement(), exprtk::parser< T >::parse_define_vector_statement(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parse_for_loop(), exprtk::parser< T >::parse_function_call(), exprtk::parser< T >::parse_function_call_0(), exprtk::parser< T >::parse_generic_function_call(), exprtk::parser< T >::parse_multi_switch_statement(), exprtk::parser< T >::parse_overload_function_call(), exprtk::parser< T >::parse_repeat_until_loop(), exprtk::parser< T >::parse_return_statement(), exprtk::parser< T >::parse_string(), exprtk::parser< T >::parse_string_function_call(), exprtk::parser< T >::parse_string_range_statement(), exprtk::parser< T >::parse_switch_statement(), exprtk::parser< T >::parse_symtab_symbol(), exprtk::parser< T >::parse_ternary_conditional_statement(), exprtk::parser< T >::parse_uninitialised_var_statement(), exprtk::parser< T >::parse_vararg_function(), exprtk::parser< T >::parse_vararg_function_call(), exprtk::parser< T >::parse_vector(), exprtk::parser< T >::parse_while_loop(), exprtk::parser< T >::parser(), exprtk::parser< T >::parse_special_function_impl< Type, NumberOfParameters >::process(), exprtk::parser< T >::simplify(), and exprtk::parser< T >::synthesize_vector_element().

◆ helper_assembly_

template<typename T >
lexer::helper::helper_assembly exprtk::parser< T >::helper_assembly_
private

◆ immutable_memory_map_

template<typename T >
immutable_memory_map_t exprtk::parser< T >::immutable_memory_map_
private

◆ immutable_symtok_map_

template<typename T >
immutable_symtok_map_t exprtk::parser< T >::immutable_symtok_map_
private

◆ inv_binary_op_map_

template<typename T >
inv_binary_op_map_t exprtk::parser< T >::inv_binary_op_map_
private

Definition at line 41629 of file exprtk.hpp.

Referenced by exprtk::parser< T >::parser().

◆ loop_runtime_check_

template<typename T >
loop_runtime_check_ptr exprtk::parser< T >::loop_runtime_check_
private

◆ node_allocator_

template<typename T >
details::node_allocator exprtk::parser< T >::node_allocator_
private

Definition at line 41616 of file exprtk.hpp.

Referenced by exprtk::parser< T >::compile(), exprtk::parser< T >::parse_assert_statement(), exprtk::parser< T >::parse_base_operation(), exprtk::parser< T >::parse_branch(), exprtk::parser< T >::parse_break_statement(), exprtk::parser< T >::parse_conditional_statement(), exprtk::parser< T >::parse_conditional_statement_01(), exprtk::parser< T >::parse_conditional_statement_02(), exprtk::parser< T >::parse_const_string(), exprtk::parser< T >::parse_continue_statement(), exprtk::parser< T >::parse_define_constvar_statement(), exprtk::parser< T >::parse_define_string_statement(), exprtk::parser< T >::parse_define_var_statement(), exprtk::parser< T >::parse_define_vector_statement(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parse_for_loop(), exprtk::parser< T >::parse_function_call_0(), exprtk::parser< T >::parse_multi_sequence(), exprtk::parser< T >::parse_multi_switch_statement(), exprtk::parser< T >::parse_null_statement(), exprtk::parser< T >::parse_pending_vector_index_operator(), exprtk::parser< T >::parse_range(), exprtk::parser< T >::parse_repeat_until_loop(), exprtk::parser< T >::parse_string(), exprtk::parser< T >::parse_string_range_statement(), exprtk::parser< T >::parse_swap_statement(), exprtk::parser< T >::parse_switch_statement(), exprtk::parser< T >::parse_ternary_conditional_statement(), exprtk::parser< T >::parse_uninitialised_var_statement(), exprtk::parser< T >::parse_vector(), exprtk::parser< T >::parse_vector_index(), exprtk::parser< T >::parse_while_loop(), exprtk::parser< T >::simplify(), exprtk::parser< T >::simplify_unary_negation_branch(), and exprtk::parser< T >::synthesize_vector_element().

◆ numeric_checker_

template<typename T >
lexer::helper::numeric_checker<T> exprtk::parser< T >::numeric_checker_
private

Definition at line 41646 of file exprtk.hpp.

Referenced by exprtk::parser< T >::init_precompilation().

◆ operator_joiner_2_

template<typename T >
lexer::helper::operator_joiner exprtk::parser< T >::operator_joiner_2_
private

Definition at line 41642 of file exprtk.hpp.

Referenced by exprtk::parser< T >::init_precompilation().

◆ operator_joiner_3_

template<typename T >
lexer::helper::operator_joiner exprtk::parser< T >::operator_joiner_3_
private

Definition at line 41643 of file exprtk.hpp.

Referenced by exprtk::parser< T >::init_precompilation().

◆ resolve_unknown_symbol_

template<typename T >
bool exprtk::parser< T >::resolve_unknown_symbol_
private

◆ results_context_

template<typename T >
results_context_t* exprtk::parser< T >::results_context_
private

◆ sem_

template<typename T >
scope_element_manager exprtk::parser< T >::sem_
private

◆ sequence_validator_

template<typename T >
lexer::helper::sequence_validator exprtk::parser< T >::sequence_validator_
private

Definition at line 41647 of file exprtk.hpp.

Referenced by exprtk::parser< T >::init_precompilation().

◆ sequence_validator_3tkns_

template<typename T >
lexer::helper::sequence_validator_3tokens exprtk::parser< T >::sequence_validator_3tkns_
private

Definition at line 41648 of file exprtk.hpp.

Referenced by exprtk::parser< T >::init_precompilation().

◆ settings_

template<typename T >
settings_store exprtk::parser< T >::settings_
private

Definition at line 41614 of file exprtk.hpp.

Referenced by exprtk::parser< T >::init_precompilation(), exprtk::parser< T >::expression_generator< Type >::is_assignment_operation(), exprtk::parser< T >::is_invalid_arithmetic_operation(), exprtk::parser< T >::is_invalid_assignment_operation(), exprtk::parser< T >::is_invalid_inequality_operation(), exprtk::parser< T >::is_invalid_logic_operation(), exprtk::parser< T >::parse_conditional_statement_02(), exprtk::parser< T >::parse_define_constvar_statement(), exprtk::parser< T >::parse_define_var_statement(), exprtk::parser< T >::parse_define_vector_statement(), exprtk::parser< T >::parse_expression(), exprtk::parser< T >::parse_not_statement(), exprtk::parser< T >::parse_pending_vector_index_operator(), exprtk::parser< T >::parse_return_statement(), exprtk::parser< T >::parse_symbol(), exprtk::parser< T >::parse_symtab_symbol(), exprtk::parser< T >::parser(), exprtk::parser< T >::post_bracket_process(), exprtk::parser< T >::post_variable_process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovoc_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covoc_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_cocov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococ_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovocov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covocov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococov_expression0::process(), exprtk::parser< T >::remove_replace_symbol(), exprtk::parser< T >::replace_symbol(), exprtk::parser< T >::run_assemblies(), exprtk::parser< T >::settings(), exprtk::parser< T >::stack_limit_handler::stack_limit_handler(), exprtk::parser< T >::valid_base_operation(), and exprtk::parser< T >::valid_vararg_operation().

◆ sf3_map_

template<typename T >
sf3_map_t exprtk::parser< T >::sf3_map_
private

Definition at line 41630 of file exprtk.hpp.

Referenced by exprtk::parser< T >::parser().

◆ sf4_map_

template<typename T >
sf4_map_t exprtk::parser< T >::sf4_map_
private

Definition at line 41631 of file exprtk.hpp.

Referenced by exprtk::parser< T >::parser().

◆ state_

template<typename T >
parser_state exprtk::parser< T >::state_
private

Definition at line 41621 of file exprtk.hpp.

Referenced by exprtk::parser< T >::expression_generator< Type >::assert_call(), exprtk::parser< T >::compile(), exprtk::parser< T >::scope_element_manager::deactivate(), exprtk::parser< T >::expression_generator< Type >::for_loop(), exprtk::parser< T >::expression_generator< Type >::generic_function_call(), exprtk::parser< T >::scope_element_manager::get_active_element(), exprtk::parser< T >::scope_element_manager::get_element(), exprtk::parser< T >::expression_generator< Type >::lodge_assignment(), exprtk::parser< T >::parse_assert_statement(), exprtk::parser< T >::parse_break_statement(), exprtk::parser< T >::parse_continue_statement(), exprtk::parser< T >::parse_corpus(), exprtk::parser< T >::parse_define_constvar_statement(), exprtk::parser< T >::parse_define_string_statement(), exprtk::parser< T >::parse_define_var_statement(), exprtk::parser< T >::parse_define_vector_statement(), exprtk::parser< T >::parse_for_loop(), exprtk::parser< T >::parse_function_call_0(), exprtk::parser< T >::parse_generic_function_call(), exprtk::parser< T >::parse_multi_sequence(), exprtk::parser< T >::parse_repeat_until_loop(), exprtk::parser< T >::parse_return_statement(), exprtk::parser< T >::parse_swap_statement(), exprtk::parser< T >::parse_uninitialised_var_statement(), exprtk::parser< T >::parse_vector(), exprtk::parser< T >::parse_while_loop(), exprtk::parser< T >::expression_generator< Type >::return_call(), exprtk::parser< T >::return_cleanup(), exprtk::parser< T >::scope_handler::scope_handler(), exprtk::parser< T >::simplify(), exprtk::parser< T >::stack_limit_handler::stack_limit_handler(), exprtk::parser< T >::expression_generator< Type >::string_function_call(), exprtk::parser< T >::expression_generator< Type >::synthesize_expression(), exprtk::parser< T >::expression_generator< Type >::synthesize_swap_expression(), exprtk::parser< T >::expression_generator< Type >::vararg_function_call(), exprtk::parser< T >::expression_generator< Type >::vector_element(), exprtk::parser< T >::expression_generator< Type >::while_loop(), exprtk::parser< T >::scope_handler::~scope_handler(), and exprtk::parser< T >::stack_limit_handler::~stack_limit_handler().

◆ symbol_replacer_

template<typename T >
lexer::helper::symbol_replacer exprtk::parser< T >::symbol_replacer_
private

◆ symtab_store_

template<typename T >
symtab_store exprtk::parser< T >::symtab_store_
private

◆ synthesis_error_

template<typename T >
std::string exprtk::parser< T >::synthesis_error_
private

◆ unary_op_map_

template<typename T >
unary_op_map_t exprtk::parser< T >::unary_op_map_
private

Definition at line 41627 of file exprtk.hpp.

Referenced by exprtk::parser< T >::parser().

◆ unknown_symbol_resolver_

template<typename T >
unknown_symbol_resolver* exprtk::parser< T >::unknown_symbol_resolver_
private

◆ vector_access_runtime_check_

template<typename T >
vector_access_runtime_check_ptr exprtk::parser< T >::vector_access_runtime_check_
private

The documentation for this class was generated from the following file: