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 ()
 
std::size_t total_local_symbol_size_bytes () const
 
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_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 check_block_statement_closure (expression_node_ptr expression)
 
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 ()
 
bool valid_settings ()
 
 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 22440 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 22506 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 22511 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 22509 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 22510 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 22501 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 22502 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 22507 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 22508 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 22512 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 22513 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 22541 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 22528 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 22462 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 22534 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 22553 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 22465 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 22503 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 22514 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 22466 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 22504 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 22498 of file exprtk.hpp.

◆ const_t

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

Definition at line 22452 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 22545 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 22552 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 22562 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 22551 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 22564 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 22560 of file exprtk.hpp.

◆ cref_t

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

Definition at line 22451 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 22542 of file exprtk.hpp.

◆ expression_node_ptr

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

Definition at line 22518 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 22459 of file exprtk.hpp.

◆ expression_t

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

Definition at line 22519 of file exprtk.hpp.

◆ F

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

Definition at line 22453 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 22476 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 22479 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 22469 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 22472 of file exprtk.hpp.

◆ functor_t

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

Definition at line 22525 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 22499 of file exprtk.hpp.

◆ GF

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

Definition at line 22455 of file exprtk.hpp.

◆ ifunction_t

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

Definition at line 22456 of file exprtk.hpp.

◆ igeneric_function_t

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

Definition at line 22458 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 31062 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 31063 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 31061 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 22540 of file exprtk.hpp.

◆ ivararg_function_t

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

Definition at line 22457 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 22460 of file exprtk.hpp.

◆ operator_t

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

Definition at line 22531 of file exprtk.hpp.

◆ prsrhlpr_t

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

Definition at line 22569 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 22526 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 22464 of file exprtk.hpp.

◆ range_t

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

Definition at line 22493 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 22488 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 22490 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 22487 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 22489 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 22475 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 22478 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 22468 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 22471 of file exprtk.hpp.

◆ results_context_t

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

Definition at line 22567 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 22515 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 22516 of file exprtk.hpp.

◆ settings_t

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

Definition at line 24634 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 22537 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 22538 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 22500 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 22496 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 22497 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 22495 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 22481 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 22521 of file exprtk.hpp.

◆ symbol_table_t

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

Definition at line 22520 of file exprtk.hpp.

◆ token_t

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

Definition at line 22517 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 22527 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 22463 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 22535 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 22529 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 22461 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 22533 of file exprtk.hpp.

◆ VAF

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

Definition at line 22454 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 22482 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 22484 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 22486 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 22483 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 22485 of file exprtk.hpp.

◆ vector_holder_ptr

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

Definition at line 22523 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 22522 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 22491 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 22492 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 22546 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 22554 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 22565 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 22550 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 22563 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 22559 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 22544 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 22549 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 22558 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 22548 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 22557 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 22556 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 22474 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 22477 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 22467 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 22470 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 23761 of file exprtk.hpp.

23762 {
23763 e_ct_none = 0,
23764 e_ct_variables = 1,
23765 e_ct_functions = 2,
23767 };

◆ 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 22444 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 23769 of file exprtk.hpp.

23770 {
23771 e_st_unknown = 0,
23772 e_st_variable = 1,
23773 e_st_vector = 2,
23774 e_st_vecelem = 3,
23775 e_st_string = 4,
23776 e_st_function = 5,
23780 };

Constructor & Destructor Documentation

◆ parser() [1/2]

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

Definition at line 24636 of file exprtk.hpp.

24639 , results_context_(0)
24640 , unknown_symbol_resolver_(reinterpret_cast<unknown_symbol_resolver*>(0))
24641 #ifdef _MSC_VER
24642 #pragma warning(push)
24643 #pragma warning (disable:4355)
24644 #endif
24645 , sem_(*this)
24646 #ifdef _MSC_VER
24647 #pragma warning(pop)
24648 #endif
24654 , assert_check_(0)
24655 {
24657
24664
24673 }
void set_ibom(inv_binary_op_map_t &inv_binary_op_map)
Definition exprtk.hpp:31872
void set_bom(binary_op_map_t &binary_op_map)
Definition exprtk.hpp:31867
void set_uom(unary_op_map_t &unary_op_map)
Definition exprtk.hpp:31862
void set_strength_reduction_state(const bool enabled)
Definition exprtk.hpp:31892
void set_sf3m(sf3_map_t &sf3_map)
Definition exprtk.hpp:31877
void set_sf4m(sf4_map_t &sf4_map)
Definition exprtk.hpp:31882
bool strength_reduction_enabled() const
Definition exprtk.hpp:24182
sf4_map_t sf4_map_
Definition exprtk.hpp:42124
settings_store settings_
Definition exprtk.hpp:42107
void init_precompilation()
Definition exprtk.hpp:24678
binary_op_map_t binary_op_map_
Definition exprtk.hpp:42121
void load_unary_operations_map(unary_op_map_t &m)
Definition exprtk.hpp:41894
inv_binary_op_map_t inv_binary_op_map_
Definition exprtk.hpp:42122
void load_sf3_map(sf3_map_t &sf3_map)
Definition exprtk.hpp:41997
loop_runtime_check_ptr loop_runtime_check_
Definition exprtk.hpp:42143
lexer::helper::operator_joiner operator_joiner_3_
Definition exprtk.hpp:42136
unknown_symbol_resolver * unknown_symbol_resolver_
Definition exprtk.hpp:42117
vector_access_runtime_check_ptr vector_access_runtime_check_
Definition exprtk.hpp:42144
lexer::helper::operator_joiner operator_joiner_2_
Definition exprtk.hpp:42135
results_context_t * results_context_
Definition exprtk.hpp:42116
compilation_check_ptr compilation_check_ptr_
Definition exprtk.hpp:42145
sf3_map_t sf3_map_
Definition exprtk.hpp:42123
expression_generator< T > expression_generator_
Definition exprtk.hpp:42108
assert_check_ptr assert_check_
Definition exprtk.hpp:42146
void load_inv_binary_operations_map(inv_binary_op_map_t &m)
Definition exprtk.hpp:41969
void load_binary_operations_map(binary_op_map_t &m)
Definition exprtk.hpp:41941
unary_op_map_t unary_op_map_
Definition exprtk.hpp:42120
scope_element_manager sem_
Definition exprtk.hpp:42126
base_ops_map_t base_ops_map_
Definition exprtk.hpp:42119
void load_sf4_map(sf4_map_t &sf4_map)
Definition exprtk.hpp:42021
settings_store & settings()
Definition exprtk.hpp:25014
bool resolve_unknown_symbol_
Definition exprtk.hpp:42115
void load_operations_map(std::multimap< std::string, details::base_operation_t, details::ilesscompare > &m)
Definition exprtk.hpp:19634

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 24675 of file exprtk.hpp.

24676 {}

◆ parser() [2/2]

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

Member Function Documentation

◆ check_block_statement_closure()

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

Definition at line 31419 of file exprtk.hpp.

31420 {
31421 if (
31422 expression &&
31423 (
31424 (current_token().type == token_t::e_symbol) ||
31426 )
31427 )
31428 {
31429 free_node(node_allocator_, expression);
31430
31433 current_token(),
31434 "ERR240 - Invalid syntax '" + current_token().value + "' possible missing operator or context",
31436
31437 return error_node();
31438 }
31439
31440 return expression;
31441 }
const token_t & current_token() const
Definition exprtk.hpp:4450
void set_error(const parser_error::type &error_type)
Definition exprtk.hpp:41805
details::node_allocator node_allocator_
Definition exprtk.hpp:42109
static expression_node_ptr error_node()
Definition exprtk.hpp:25761
#define exprtk_error_location
Definition exprtk.hpp:67
void free_node(NodeAllocator &, expression_node< T > *&node)
Definition exprtk.hpp:6152
type make_error(const error_mode mode, const std::string &diagnostic="", const std::string &src_location="")
Definition exprtk.hpp:22336

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

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

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

◆ clear_assert_check()

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

Definition at line 25130 of file exprtk.hpp.

25131 {
25133 }
assert_check * assert_check_ptr
Definition exprtk.hpp:2253

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 25125 of file exprtk.hpp.

25126 {
25128 }
compilation_check * compilation_check_ptr
Definition exprtk.hpp:2268

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 25115 of file exprtk.hpp.

25116 {
25118 }
loop_runtime_check * loop_runtime_check_ptr
Definition exprtk.hpp:2210

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 25120 of file exprtk.hpp.

25121 {
25123 }
vector_access_runtime_check * vector_access_runtime_check_ptr
Definition exprtk.hpp:2234

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 24742 of file exprtk.hpp.

24743 {
24744 state_ .reset();
24745 error_list_ .clear();
24746 brkcnt_list_ .clear();
24747 synthesis_error_ .clear();
24749 immutable_symtok_map_.clear();
24750 current_state_stack_ .clear();
24751 assert_ids_ .clear();
24752 sem_ .cleanup();
24753
24755
24756 if (!valid_settings())
24757 {
24758 return false;
24759 }
24760
24762
24763 if (expression_string.empty())
24764 {
24767 "ERR001 - Empty expression!",
24769
24770 return false;
24771 }
24772
24773 if (!init(expression_string))
24774 {
24776 return false;
24777 }
24778
24779 if (lexer().empty())
24780 {
24783 "ERR002 - Empty expression!",
24785
24786 return false;
24787 }
24788
24790 {
24791 exprtk_debug(("halt_compilation_check() - compile checkpoint 0\n"));
24792 sem_.cleanup();
24793 return false;
24794 }
24795
24796 if (!run_assemblies())
24797 {
24798 sem_.cleanup();
24799 return false;
24800 }
24801
24803 {
24804 exprtk_debug(("halt_compilation_check() - compile checkpoint 1\n"));
24805 sem_.cleanup();
24806 return false;
24807 }
24808
24809 symtab_store_.symtab_list_ = expr.get_symbol_table_list();
24810 dec_.clear();
24811
24812 lexer().begin();
24813
24814 next_token();
24815
24817
24818 if ((0 != e) && (token_t::e_eof == current_token().type))
24819 {
24820 bool* retinvk_ptr = 0;
24821
24823 {
24824 dec_.return_present_ = true;
24825
24827 .return_envelope(e, results_context_, retinvk_ptr);
24828 }
24829
24830 expr.set_expression(e);
24831 expr.set_retinvk(retinvk_ptr);
24832
24833 register_local_vars(expr);
24835
24836 return !(!expr);
24837 }
24838 else
24839 {
24840 if (error_list_.empty())
24841 {
24844 current_token(),
24845 "ERR003 - Invalid expression encountered",
24847 }
24848
24849 if ((0 != e) && branch_deletable(e))
24850 {
24851 destroy_node(e);
24852 }
24853
24854 dec_.clear ();
24855 sem_.cleanup ();
24857
24858 return false;
24859 }
24860 }
bool init(const std::string &str)
Definition exprtk.hpp:4409
void set_allocator(details::node_allocator &na)
Definition exprtk.hpp:31887
expression_node_ptr return_envelope(expression_node_ptr body, results_context_t *rc, bool *&return_invoked)
Definition exprtk.hpp:34148
std::set< std::string > assert_ids_
Definition exprtk.hpp:42147
expression_node_t * expression_node_ptr
Definition exprtk.hpp:22518
void return_cleanup()
Definition exprtk.hpp:42071
dependent_entity_collector dec_
Definition exprtk.hpp:42111
std::vector< state_t > current_state_stack_
Definition exprtk.hpp:42127
expression_node_ptr parse_corpus()
Definition exprtk.hpp:25216
std::deque< parser_error::type > error_list_
Definition exprtk.hpp:42112
void register_local_vars(expression< T > &e)
Definition exprtk.hpp:41826
void process_lexer_errors()
Definition exprtk.hpp:24870
immutable_symtok_map_t immutable_symtok_map_
Definition exprtk.hpp:42130
symtab_store symtab_store_
Definition exprtk.hpp:42110
bool run_assemblies()
Definition exprtk.hpp:24907
parser_state state_
Definition exprtk.hpp:42114
std::string synthesis_error_
Definition exprtk.hpp:42125
void register_return_results(expression< T > &e)
Definition exprtk.hpp:41888
std::deque< bool > brkcnt_list_
Definition exprtk.hpp:42113
immutable_memory_map_t immutable_memory_map_
Definition exprtk.hpp:42129
bool valid_settings()
Definition exprtk.hpp:42084
bool halt_compilation_check()
Definition exprtk.hpp:25374
#define exprtk_debug(params)
Definition exprtk.hpp:64
bool branch_deletable(const expression_node< T > *node)
Definition exprtk.hpp:5997
void destroy_node(expression_node< T > *&node)
Definition exprtk.hpp:6164
symbol_table_list_t symtab_list_
Definition exprtk.hpp:23109

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_, exprtk::parser< T >::synthesis_error_, and exprtk::parser< T >::valid_settings().

Referenced by black_scholes_merton_model(), 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 24862 of file exprtk.hpp.

24863 {
24864 expression_t expression;
24865 expression.register_symbol_table(symtab);
24866 compile(expression_string,expression);
24867 return expression;
24868 }
bool compile(const std::string &expression_string, expression< T > &expr)
Definition exprtk.hpp:24742
expression< T > expression_t
Definition exprtk.hpp:22519

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 25310 of file exprtk.hpp.

25313 {
25314 std::string result = lexer().substr(begin_token.position,end_token.position);
25315 if (cleanup_whitespace)
25316 {
25317 for (std::size_t i = 0; i < result.size(); ++i)
25318 {
25319 if (details::is_whitespace(result[i])) result[i] = ' ';
25320 }
25321 }
25322
25323 return result;
25324 }
std::string substr(const std::size_t &begin, const std::size_t &end) const
Definition exprtk.hpp:2589
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 25044 of file exprtk.hpp.

25045 {
25046 return dec_;
25047 }

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 25089 of file exprtk.hpp.

25090 {
25093 }
unknown_symbol_resolver default_usr_
Definition exprtk.hpp:42118

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 25084 of file exprtk.hpp.

25085 {
25087 }
void enable_unknown_symbol_resolver(unknown_symbol_resolver *usr=reinterpret_cast< unknown_symbol_resolver * >(0))
Definition exprtk.hpp:25074

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 25074 of file exprtk.hpp.

25075 {
25077
25078 if (usr)
25080 else
25082 }

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 25029 of file exprtk.hpp.

25030 {
25031 if (!error_list_.empty())
25032 {
25033 return error_list_[0].diagnostic;
25034 }
25035 else
25036 return std::string("No Error");
25037 }

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 25039 of file exprtk.hpp.

25040 {
25041 return error_list_.size();
25042 }

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 25761 of file exprtk.hpp.

25762 {
25763 return reinterpret_cast<expression_node_ptr>(0);
25764 }

Referenced by exprtk::parser< T >::expression_generator< Type >::assert_call(), exprtk::parser< T >::expression_generator< Type >::cardinal_pow_optimisation_impl(), exprtk::parser< T >::check_block_statement_closure(), 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 25019 of file exprtk.hpp.

25020 {
25021 if (index < error_list_.size())
25022 {
25023 return error_list_[index];
25024 }
25025
25026 throw std::invalid_argument("parser::get_error() - Invalid error index specified");
25027 }

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 25374 of file exprtk.hpp.

25375 {
25376 compilation_check::compilation_context context;
25377
25379 {
25380 const std::string error_message =
25381 !context.error_message.empty() ? " Details: " + context.error_message : "";
25382
25385 token_t(),
25386 "ERR011 - Internal compilation check failed." + error_message,
25388
25389 return true;
25390 }
25391
25392 return false;
25393 }
lexer::token token_t
Definition exprtk.hpp:22517
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 26796 of file exprtk.hpp.

26797 {
26798 assert(!brkcnt_list_.empty());
26799 brkcnt_list_.pop_front();
26800 }

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 24678 of file exprtk.hpp.

24679 {
24682
24685
24688
24690 {
24696 }
24697
24699 {
24700 for (std::size_t i = 0; i < details::reserved_words_size; ++i)
24701 {
24703 }
24704
24707 }
24708
24710 {
24714 }
24715
24716 if (
24720 )
24721 {
24723
24725 {
24727 }
24728
24730 {
24732 }
24733
24735 {
24738 }
24739 }
24740 }
void ignore_symbol(const std::string &symbol)
Definition exprtk.hpp:3543
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:3940
bool collect_functions_enabled() const
Definition exprtk.hpp:24184
bool collect_variables_enabled() const
Definition exprtk.hpp:24183
bool commutative_check_enabled() const
Definition exprtk.hpp:24177
bool collect_assignments_enabled() const
Definition exprtk.hpp:24185
lexer::helper::bracket_checker bracket_checker_
Definition exprtk.hpp:42138
lexer::helper::symbol_replacer symbol_replacer_
Definition exprtk.hpp:42137
lexer::helper::sequence_validator sequence_validator_
Definition exprtk.hpp:42140
lexer::helper::commutative_inserter commutative_inserter_
Definition exprtk.hpp:42134
lexer::helper::sequence_validator_3tokens sequence_validator_3tkns_
Definition exprtk.hpp:42141
lexer::helper::numeric_checker< T > numeric_checker_
Definition exprtk.hpp:42139
lexer::helper::helper_assembly helper_assembly_
Definition exprtk.hpp:42132
static const std::string reserved_words[]
Definition exprtk.hpp:440
static const std::size_t reserved_words_size
Definition exprtk.hpp:449
std::vector< lexer::token_inserter * > token_inserter_list
Definition exprtk.hpp:4393
bool register_inserter(lexer::token_inserter *inserter)
Definition exprtk.hpp:4288
std::vector< lexer::token_joiner * > token_joiner_list
Definition exprtk.hpp:4392
bool register_scanner(lexer::token_scanner *scanner)
Definition exprtk.hpp:4246
std::vector< lexer::token_modifier * > token_modifier_list
Definition exprtk.hpp:4391
bool register_joiner(lexer::token_joiner *joiner)
Definition exprtk.hpp:4274
bool register_modifier(lexer::token_modifier *modifier)
Definition exprtk.hpp:4260
std::vector< lexer::token_scanner * > token_scanner_list
Definition exprtk.hpp:4390

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 25183 of file exprtk.hpp.

25184 {
25185 return settings_.arithmetic_disabled(operation);
25186 }
bool arithmetic_disabled(const details::operator_type arithmetic_operation) const
Definition exprtk.hpp:24283

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 25188 of file exprtk.hpp.

25189 {
25190 return settings_.assignment_disabled(operation);
25191 }
bool assignment_disabled(const details::operator_type assignment_operation) const
Definition exprtk.hpp:24265

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 25193 of file exprtk.hpp.

25194 {
25195 return settings_.inequality_disabled(operation);
25196 }
bool inequality_disabled(const details::operator_type &inequality) const
Definition exprtk.hpp:24292

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 25178 of file exprtk.hpp.

25179 {
25180 return settings_.logic_disabled(operation);
25181 }
bool logic_disabled(const std::string &logic_operation) const
Definition exprtk.hpp:24257

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 41941 of file exprtk.hpp.

41942 {
41943 typedef typename binary_op_map_t::value_type value_type;
41944
41945 #define register_binary_op(Op, BinaryFunctor) \
41946 m.insert(value_type(Op,BinaryFunctor<T>::process)); \
41947
41948 register_binary_op(details::e_add , details::add_op )
41949 register_binary_op(details::e_sub , details::sub_op )
41950 register_binary_op(details::e_mul , details::mul_op )
41951 register_binary_op(details::e_div , details::div_op )
41952 register_binary_op(details::e_mod , details::mod_op )
41953 register_binary_op(details::e_pow , details::pow_op )
41954 register_binary_op(details::e_lt , details::lt_op )
41955 register_binary_op(details::e_lte , details::lte_op )
41956 register_binary_op(details::e_gt , details::gt_op )
41957 register_binary_op(details::e_gte , details::gte_op )
41958 register_binary_op(details::e_eq , details::eq_op )
41959 register_binary_op(details::e_ne , details::ne_op )
41960 register_binary_op(details::e_and , details::and_op )
41961 register_binary_op(details::e_nand , details::nand_op)
41962 register_binary_op(details::e_or , details::or_op )
41963 register_binary_op(details::e_nor , details::nor_op )
41964 register_binary_op(details::e_xor , details::xor_op )
41965 register_binary_op(details::e_xnor , details::xnor_op)
41966 #undef register_binary_op
41967 }
#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 41969 of file exprtk.hpp.

41970 {
41971 typedef typename inv_binary_op_map_t::value_type value_type;
41972
41973 #define register_binary_op(Op, BinaryFunctor) \
41974 m.insert(value_type(BinaryFunctor<T>::process,Op)); \
41975
41976 register_binary_op(details::e_add , details::add_op )
41977 register_binary_op(details::e_sub , details::sub_op )
41978 register_binary_op(details::e_mul , details::mul_op )
41979 register_binary_op(details::e_div , details::div_op )
41980 register_binary_op(details::e_mod , details::mod_op )
41981 register_binary_op(details::e_pow , details::pow_op )
41982 register_binary_op(details::e_lt , details::lt_op )
41983 register_binary_op(details::e_lte , details::lte_op )
41984 register_binary_op(details::e_gt , details::gt_op )
41985 register_binary_op(details::e_gte , details::gte_op )
41986 register_binary_op(details::e_eq , details::eq_op )
41987 register_binary_op(details::e_ne , details::ne_op )
41988 register_binary_op(details::e_and , details::and_op )
41989 register_binary_op(details::e_nand , details::nand_op)
41990 register_binary_op(details::e_or , details::or_op )
41991 register_binary_op(details::e_nor , details::nor_op )
41992 register_binary_op(details::e_xor , details::xor_op )
41993 register_binary_op(details::e_xnor , details::xnor_op)
41994 #undef register_binary_op
41995 }

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 41997 of file exprtk.hpp.

41998 {
41999 typedef std::pair<trinary_functor_t,details::operator_type> pair_t;
42000
42001 #define register_sf3(Op) \
42002 sf3_map[details::sf##Op##_op<T>::id()] = pair_t(details::sf##Op##_op<T>::process,details::e_sf##Op); \
42003
42012 #undef register_sf3
42013
42014 #define register_sf3_extid(Id, Op) \
42015 sf3_map[Id] = pair_t(details::sf##Op##_op<T>::process,details::e_sf##Op); \
42016
42017 register_sf3_extid("(t-t)-t",23) // (t-t)-t --> t-(t+t)
42018 #undef register_sf3_extid
42019 }
#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 42021 of file exprtk.hpp.

42022 {
42023 typedef std::pair<quaternary_functor_t,details::operator_type> pair_t;
42024
42025 #define register_sf4(Op) \
42026 sf4_map[details::sf##Op##_op<T>::id()] = pair_t(details::sf##Op##_op<T>::process,details::e_sf##Op); \
42027
42037 #undef register_sf4
42038
42039 #define register_sf4ext(Op) \
42040 sf4_map[details::sfext##Op##_op<T>::id()] = pair_t(details::sfext##Op##_op<T>::process,details::e_sf4ext##Op); \
42041
42058 #undef register_sf4ext
42059 }
#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 41894 of file exprtk.hpp.

41895 {
41896 #define register_unary_op(Op, UnaryFunctor) \
41897 m.insert(std::make_pair(Op,UnaryFunctor<T>::process)); \
41898
41899 register_unary_op(details::e_abs , details::abs_op )
41900 register_unary_op(details::e_acos , details::acos_op )
41901 register_unary_op(details::e_acosh , details::acosh_op)
41902 register_unary_op(details::e_asin , details::asin_op )
41903 register_unary_op(details::e_asinh , details::asinh_op)
41904 register_unary_op(details::e_atanh , details::atanh_op)
41905 register_unary_op(details::e_ceil , details::ceil_op )
41906 register_unary_op(details::e_cos , details::cos_op )
41907 register_unary_op(details::e_cosh , details::cosh_op )
41908 register_unary_op(details::e_exp , details::exp_op )
41909 register_unary_op(details::e_expm1 , details::expm1_op)
41910 register_unary_op(details::e_floor , details::floor_op)
41911 register_unary_op(details::e_log , details::log_op )
41912 register_unary_op(details::e_log10 , details::log10_op)
41913 register_unary_op(details::e_log2 , details::log2_op )
41914 register_unary_op(details::e_log1p , details::log1p_op)
41915 register_unary_op(details::e_neg , details::neg_op )
41916 register_unary_op(details::e_pos , details::pos_op )
41917 register_unary_op(details::e_round , details::round_op)
41918 register_unary_op(details::e_sin , details::sin_op )
41919 register_unary_op(details::e_sinc , details::sinc_op )
41920 register_unary_op(details::e_sinh , details::sinh_op )
41921 register_unary_op(details::e_sqrt , details::sqrt_op )
41922 register_unary_op(details::e_tan , details::tan_op )
41923 register_unary_op(details::e_tanh , details::tanh_op )
41924 register_unary_op(details::e_cot , details::cot_op )
41925 register_unary_op(details::e_sec , details::sec_op )
41926 register_unary_op(details::e_csc , details::csc_op )
41927 register_unary_op(details::e_r2d , details::r2d_op )
41928 register_unary_op(details::e_d2r , details::d2r_op )
41929 register_unary_op(details::e_d2g , details::d2g_op )
41930 register_unary_op(details::e_g2d , details::g2d_op )
41931 register_unary_op(details::e_notl , details::notl_op )
41932 register_unary_op(details::e_sgn , details::sgn_op )
41933 register_unary_op(details::e_erf , details::erf_op )
41934 register_unary_op(details::e_erfc , details::erfc_op )
41935 register_unary_op(details::e_ncdf , details::ncdf_op )
41936 register_unary_op(details::e_frac , details::frac_op )
41937 register_unary_op(details::e_trunc , details::trunc_op)
41938 #undef register_unary_op
41939 }
#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 29932 of file exprtk.hpp.

29933 {
29934 const scope_element& se = sem_.get_element(symbol);
29935 return (se.name == symbol) && se.active;
29936 }
scope_element & get_element(const std::size_t &index)
Definition exprtk.hpp:22685

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 31082 of file exprtk.hpp.

31083 {
31085 immutable_symtok_map_[interval] = token;
31086 }
bool add_interval(const interval_point_t begin, const interval_point_t end)
Definition exprtk.hpp:23044

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 28171 of file exprtk.hpp.

28173 {
28174 dec_.add_symbol(symbol,st);
28175 }
void add_symbol(const std::string &symbol, const symbol_type st)
Definition exprtk.hpp:23893

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 31065 of file exprtk.hpp.

31066 {
31067 const T* begin = reinterpret_cast<const T*>(&t);
31068 const T* end = begin + 1;
31069 return interval_t(begin, end);
31070 }
interval_container_t< constvoid * >::interval_t interval_t
Definition exprtk.hpp:31061

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 31072 of file exprtk.hpp.

31073 {
31074 return interval_t(begin, begin + size);
31075 }

◆ 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 31077 of file exprtk.hpp.

31078 {
31079 return interval_t(begin, begin + size);
31080 }

◆ 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 30793 of file exprtk.hpp.

30794 {
30795 assert(details::imatch(current_token().value, "assert"));
30796
30798 {
30801 current_token(),
30802 "ERR219 - Assert statement within an assert statement is not allowed",
30804
30805 return error_node();
30806 }
30807
30808 scoped_bool_negator sbn(state_.parsing_assert_stmt);
30809
30810 next_token();
30811
30812 std::vector<expression_node_ptr> assert_arg_list(3, error_node());
30813 scoped_vec_delete<expression_node_t> svd((*this), assert_arg_list);
30814
30815 expression_node_ptr& assert_condition = assert_arg_list[0];
30816 expression_node_ptr& assert_message = assert_arg_list[1];
30817 expression_node_ptr& assert_id = assert_arg_list[2];
30818
30820 {
30823 current_token(),
30824 "ERR220 - Expected '(' at start of assert statement",
30826
30827 return error_node();
30828 }
30829
30830 const token_t start_token = current_token();
30831
30832 // Parse the assert condition
30833 if (0 == (assert_condition = parse_expression()))
30834 {
30837 current_token(),
30838 "ERR221 - Failed to parse condition for assert statement",
30840
30841 return error_node();
30842 }
30843
30844 const token_t end_token = current_token();
30845
30847 {
30849 {
30852 current_token(),
30853 "ERR222 - Expected ',' between condition and message for assert statement",
30855
30856 return error_node();
30857 }
30858 // Parse the assert message
30859 else if (
30860 (0 == (assert_message = parse_expression())) ||
30861 !details::is_generally_string_node(assert_message)
30862 )
30863 {
30866 current_token(),
30867 "ERR223 - " +
30868 (assert_message ?
30869 std::string("Expected string for assert message") :
30870 std::string("Failed to parse message for assert statement")),
30872
30873 return error_node();
30874 }
30875 else if (!token_is(token_t::e_rbracket))
30876 {
30878 {
30881 current_token(),
30882 "ERR224 - Expected ',' between message and ID for assert statement",
30884
30885 return error_node();
30886 }
30887 // Parse assert ID
30888 else if (
30889 (0 == (assert_id = parse_expression())) ||
30891 )
30892 {
30895 current_token(),
30896 "ERR225 - " +
30897 (assert_id ?
30898 std::string("Expected literal string for assert ID") :
30899 std::string("Failed to parse string for assert ID")),
30901
30902 return error_node();
30903 }
30904 else if (!token_is(token_t::e_rbracket))
30905 {
30908 current_token(),
30909 "ERR226 - Expected ')' at start of assert statement",
30911
30912 return error_node();
30913 }
30914 }
30915 }
30916
30918 context.condition = lexer().substr(start_token.position, end_token.position);
30919 context.offet = start_token.position;
30920
30921 if (0 == assert_check_)
30922 {
30923 exprtk_debug(("parse_assert_statement() - assert functionality is disabled. assert condition: %s\n",
30924 context.condition.c_str()));
30925
30926 return new details::null_node<T>();
30927 }
30928
30929 #ifndef exprtk_disable_string_capabilities
30930 if (assert_message && details::is_const_string_node(assert_message))
30931 {
30932 context.message = dynamic_cast<details::string_base_node<T>*>(assert_message)->str();
30933 }
30934
30935 if (assert_id && details::is_const_string_node(assert_id))
30936 {
30937 context.id = dynamic_cast<details::string_base_node<T>*>(assert_id)->str();
30938
30939 if (assert_ids_.end() != assert_ids_.find(context.id))
30940 {
30943 current_token(),
30944 "ERR227 - Duplicate assert ID: " + context.id,
30946
30947 return error_node();
30948 }
30949
30950 assert_ids_.insert(context.id);
30951 free_node(node_allocator_, assert_id);
30952 }
30953 #endif
30954
30955 expression_node_ptr result_node =
30957 assert_condition,
30958 assert_message,
30959 context);
30960
30961 exprtk_debug(("parse_assert_statement() - assert condition: [%s]\n", context.condition.c_str() ));
30962 exprtk_debug(("parse_assert_statement() - assert message: [%s]\n", context.message .c_str() ));
30963 exprtk_debug(("parse_assert_statement() - assert id: [%s]\n", context.id .c_str() ));
30964 exprtk_debug(("parse_assert_statement() - assert offset: [%d]\n", static_cast<int>(context.offet)));
30965
30966 if (0 == result_node)
30967 {
30970 current_token(),
30971 "ERR228 - Failed to synthesize assert",
30973
30974 return error_node();
30975 }
30976
30977 svd.delete_ptr = false;
30978 return result_node;
30979 }
bool token_is(const token_t::token_type &ttype, const token_advance_mode mode=e_advance)
Definition exprtk.hpp:4474
expression_node_ptr assert_call(expression_node_ptr &assert_condition, expression_node_ptr &assert_message, const assert_check::assert_context &context)
Definition exprtk.hpp:33358
expression_node_ptr parse_expression(precedence_level precedence=e_level00)
Definition exprtk.hpp:25395
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:605
bool is_const_string_node(const expression_node< T > *node)
Definition exprtk.hpp:19130
bool is_generally_string_node(const expression_node< T > *node)
Definition exprtk.hpp:19184

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 26116 of file exprtk.hpp.

26117 {
26118 std::fill_n(param_list, MaxNumberofParameters, reinterpret_cast<expression_node_ptr>(0));
26119
26120 scoped_delete<expression_node_t,MaxNumberofParameters> sd((*this),param_list);
26121
26122 next_token();
26123
26125 {
26128 current_token(),
26129 "ERR029 - Expected a '(' at start of function call to '" + function_name +
26130 "', instead got: '" + current_token().value + "'",
26132
26133 return 0;
26134 }
26135
26137 {
26140 current_token(),
26141 "ERR030 - Expected at least one input parameter for function call '" + function_name + "'",
26143
26144 return 0;
26145 }
26146
26147 std::size_t param_index = 0;
26148
26149 for (; param_index < MaxNumberofParameters; ++param_index)
26150 {
26151 param_list[param_index] = parse_expression();
26152
26153 if (0 == param_list[param_index])
26154 return 0;
26155 else if (token_is(token_t::e_rbracket))
26156 {
26157 sd.delete_ptr = false;
26158 break;
26159 }
26160 else if (token_is(token_t::e_comma))
26161 continue;
26162 else
26163 {
26166 current_token(),
26167 "ERR031 - Expected a ',' between function input parameters, instead got: '" + current_token().value + "'",
26169
26170 return 0;
26171 }
26172 }
26173
26174 if (sd.delete_ptr)
26175 {
26178 current_token(),
26179 "ERR032 - Invalid number of input parameters passed to function '" + function_name + "'",
26181
26182 return 0;
26183 }
26184
26185 return (param_index + 1);
26186 }

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 26188 of file exprtk.hpp.

26189 {
26190 typedef std::pair<base_ops_map_t::iterator,base_ops_map_t::iterator> map_range_t;
26191
26192 const std::string operation_name = current_token().value;
26193 const token_t diagnostic_token = current_token();
26194
26195 map_range_t itr_range = base_ops_map_.equal_range(operation_name);
26196
26197 if (0 == std::distance(itr_range.first,itr_range.second))
26198 {
26201 diagnostic_token,
26202 "ERR033 - No entry found for base operation: " + operation_name,
26204
26205 return error_node();
26206 }
26207
26208 static const std::size_t MaxNumberofParameters = 4;
26209 expression_node_ptr param_list[MaxNumberofParameters] = {0};
26210
26211 const std::size_t parameter_count = parse_base_function_call(param_list, operation_name);
26212
26213 if ((parameter_count > 0) && (parameter_count <= MaxNumberofParameters))
26214 {
26215 for (base_ops_map_t::iterator itr = itr_range.first; itr != itr_range.second; ++itr)
26216 {
26217 const details::base_operation_t& operation = itr->second;
26218
26219 if (operation.num_params == parameter_count)
26220 {
26221 switch (parameter_count)
26222 {
26223 #define base_opr_case(N) \
26224 case N : { \
26225 expression_node_ptr pl##N[N] = {0}; \
26226 std::copy(param_list, param_list + N, pl##N); \
26227 lodge_symbol(operation_name, e_st_function); \
26228 return expression_generator_(operation.type, pl##N); \
26229 } \
26230
26231 base_opr_case(1)
26232 base_opr_case(2)
26233 base_opr_case(3)
26234 base_opr_case(4)
26235 #undef base_opr_case
26236 }
26237 }
26238 }
26239 }
26240
26241 for (std::size_t i = 0; i < MaxNumberofParameters; ++i)
26242 {
26243 free_node(node_allocator_, param_list[i]);
26244 }
26245
26248 diagnostic_token,
26249 "ERR034 - Invalid number of input parameters for call to function: '" + operation_name + "'",
26251
26252 return error_node();
26253 }
std::size_t parse_base_function_call(expression_node_ptr(&param_list)[MaxNumberofParameters], const std::string &function_name="")
Definition exprtk.hpp:26116
#define base_opr_case(N)
std::string value
Definition exprtk.hpp:2453

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 31569 of file exprtk.hpp.

31570 {
31571 stack_limit_handler slh(*this);
31572
31573 if (!slh)
31574 {
31575 return error_node();
31576 }
31577
31579
31580 if (token_t::e_number == current_token().type)
31581 {
31582 T numeric_value = T(0);
31583
31584 if (details::string_to_real(current_token().value, numeric_value))
31585 {
31586 expression_node_ptr literal_exp = expression_generator_(numeric_value);
31587
31588 if (0 == literal_exp)
31589 {
31592 current_token(),
31593 "ERR242 - Failed generate node for scalar: '" + current_token().value + "'",
31595
31596 return error_node();
31597 }
31598
31599 next_token();
31600 branch = literal_exp;
31601 }
31602 else
31603 {
31606 current_token(),
31607 "ERR243 - Failed to convert '" + current_token().value + "' to a number",
31609
31610 return error_node();
31611 }
31612 }
31613 else if (token_t::e_symbol == current_token().type)
31614 {
31615 branch = parse_symbol();
31616 }
31617 #ifndef exprtk_disable_string_capabilities
31618 else if (token_t::e_string == current_token().type)
31619 {
31620 branch = parse_const_string();
31621 }
31622 #endif
31623 else if (token_t::e_lbracket == current_token().type)
31624 {
31625 next_token();
31626
31627 if (0 == (branch = parse_expression()))
31628 {
31629 return error_node();
31630 }
31631
31633
31635 {
31638 current_token(),
31639 "ERR244 - Expected ')' instead of: '" + current_token().value + "'",
31641
31643
31644 return error_node();
31645 }
31646 else if (!post_bracket_process(token_t::e_lbracket,branch))
31647 {
31649
31650 return error_node();
31651 }
31652
31654 }
31655 else if (token_t::e_lsqrbracket == current_token().type)
31656 {
31657 next_token();
31658
31659 if (0 == (branch = parse_expression()))
31660 return error_node();
31662 {
31665 current_token(),
31666 "ERR245 - Expected ']' instead of: '" + current_token().value + "'",
31668
31670
31671 return error_node();
31672 }
31674 {
31676
31677 return error_node();
31678 }
31679 }
31680 else if (token_t::e_lcrlbracket == current_token().type)
31681 {
31682 next_token();
31683
31684 if (0 == (branch = parse_expression()))
31685 return error_node();
31687 {
31690 current_token(),
31691 "ERR246 - Expected '}' instead of: '" + current_token().value + "'",
31693
31695
31696 return error_node();
31697 }
31699 {
31701
31702 return error_node();
31703 }
31704 }
31705 else if (token_t::e_sub == current_token().type)
31706 {
31707 next_token();
31708 branch = parse_expression(e_level11);
31709
31710 if (
31711 branch &&
31712 !(
31713 details::is_neg_unary_node (branch) &&
31715 )
31716 )
31717 {
31719
31720 if (0 == result)
31721 {
31723
31724 return error_node();
31725 }
31726 else
31727 branch = result;
31728 }
31729 }
31730 else if (token_t::e_add == current_token().type)
31731 {
31732 next_token();
31733 branch = parse_expression(e_level13);
31734 }
31735 else if (token_t::e_eof == current_token().type)
31736 {
31739 current_token(),
31740 "ERR247 - Premature end of expression[1]",
31742
31743 return error_node();
31744 }
31745 else
31746 {
31749 current_token(),
31750 "ERR248 - Premature end of expression[2]",
31752
31753 return error_node();
31754 }
31755
31756 if (
31757 branch &&
31758 (e_level00 == precedence) &&
31759 token_is(token_t::e_ternary,prsrhlpr_t::e_hold)
31760 )
31761 {
31762 branch = parse_ternary_conditional_statement(branch);
31763 }
31764
31766
31767 return branch;
31768 }
expression_node_ptr parse_const_string()
Definition exprtk.hpp:28284
void parse_pending_vector_index_operator(expression_node_ptr &expression)
Definition exprtk.hpp:27767
bool post_bracket_process(const typename token_t::token_type &token, expression_node_ptr &branch)
Definition exprtk.hpp:31006
bool simplify_unary_negation_branch(expression_node_ptr &node)
Definition exprtk.hpp:25706
expression_node_ptr parse_ternary_conditional_statement(expression_node_ptr condition)
Definition exprtk.hpp:26660
expression_node_ptr parse_symbol()
Definition exprtk.hpp:31443
bool parse_pending_string_rangesize(expression_node_ptr &expression)
Definition exprtk.hpp:27745
bool string_to_real(Iterator &itr_external, const Iterator end, T &t, numeric::details::real_type_tag)
Definition exprtk.hpp:1973
bool is_neg_unary_node(const expression_node< T > *node)
Definition exprtk.hpp:5794

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 29273 of file exprtk.hpp.

29274 {
29276 {
29279 current_token(),
29280 "ERR151 - Invoking 'break' within a break call is not allowed",
29282
29283 return error_node();
29284 }
29285 else if (0 == state_.parsing_loop_stmt_count)
29286 {
29289 current_token(),
29290 "ERR152 - Invalid use of 'break', allowed only in the scope of a loop",
29292
29293 return error_node();
29294 }
29295
29296 scoped_bool_negator sbn(state_.parsing_break_stmt);
29297
29298 if (!brkcnt_list_.empty())
29299 {
29300 next_token();
29301
29302 brkcnt_list_.front() = true;
29303
29304 expression_node_ptr return_expr = error_node();
29305
29307 {
29308 if (0 == (return_expr = parse_expression()))
29309 {
29312 current_token(),
29313 "ERR153 - Failed to parse return expression for 'break' statement",
29315
29316 return error_node();
29317 }
29319 {
29322 current_token(),
29323 "ERR154 - Expected ']' at the completion of break's return expression",
29325
29326 free_node(node_allocator_, return_expr);
29327
29328 return error_node();
29329 }
29330 }
29331
29332 state_.activate_side_effect("parse_break_statement()");
29333
29334 return node_allocator_.allocate<details::break_node<T> >(return_expr);
29335 }
29336 else
29337 {
29340 current_token(),
29341 "ERR155 - Invalid use of 'break', allowed only in the scope of a loop",
29343 }
29344
29345 return error_node();
29346 }
expression_node< typename ResultNode::value_type > * allocate(OpType &operation, ExprNode(&branch)[1])
Definition exprtk.hpp:19253
void activate_side_effect(const std::string &)
Definition exprtk.hpp:23687
std::size_t parsing_loop_stmt_count
Definition exprtk.hpp:23708

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 26597 of file exprtk.hpp.

26598 {
26599 expression_node_ptr condition = error_node();
26600
26601 next_token();
26602
26604 {
26607 current_token(),
26608 "ERR053 - Expected '(' at start of if-statement, instead got: '" + current_token().value + "'",
26610
26611 return error_node();
26612 }
26613 else if (0 == (condition = parse_expression()))
26614 {
26617 current_token(),
26618 "ERR054 - Failed to parse condition for if-statement",
26620
26621 return error_node();
26622 }
26623 else if (token_is(token_t::e_comma,prsrhlpr_t::e_hold))
26624 {
26625 // if (x,y,z)
26626 return parse_conditional_statement_01(condition);
26627 }
26628 else if (token_is(token_t::e_rbracket))
26629 {
26630 /*
26631 00. if (x) y;
26632 01. if (x) y; else z;
26633 02. if (x) y; else {z0; ... zn;}
26634 03. if (x) y; else if (z) w;
26635 04. if (x) y; else if (z) w; else u;
26636 05. if (x) y; else if (z) w; else {u0; ... un;}
26637 06. if (x) y; else if (z) {w0; ... wn;}
26638 07. if (x) {y0; ... yn;}
26639 08. if (x) {y0; ... yn;} else z;
26640 09. if (x) {y0; ... yn;} else {z0; ... zn;};
26641 10. if (x) {y0; ... yn;} else if (z) w;
26642 11. if (x) {y0; ... yn;} else if (z) w; else u;
26643 12. if (x) {y0; ... nex;} else if (z) w; else {u0 ... un;}
26644 13. if (x) {y0; ... yn;} else if (z) {w0; ... wn;}
26645 */
26646 return parse_conditional_statement_02(condition);
26647 }
26648
26651 current_token(),
26652 "ERR055 - Invalid if-statement",
26654
26655 free_node(node_allocator_, condition);
26656
26657 return error_node();
26658 }
expression_node_ptr parse_conditional_statement_01(expression_node_ptr condition)
Definition exprtk.hpp:26255
expression_node_ptr parse_conditional_statement_02(expression_node_ptr condition)
Definition exprtk.hpp:26391

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 26255 of file exprtk.hpp.

26256 {
26257 // Parse: [if][(][condition][,][consequent][,][alternative][)]
26258
26259 expression_node_ptr consequent = error_node();
26260 expression_node_ptr alternative = error_node();
26261
26262 bool result = true;
26263
26265 {
26268 current_token(),
26269 "ERR035 - Expected ',' between if-statement condition and consequent",
26271
26272 result = false;
26273 }
26274 else if (0 == (consequent = parse_expression()))
26275 {
26278 current_token(),
26279 "ERR036 - Failed to parse consequent for if-statement",
26281
26282 result = false;
26283 }
26284 else if (!token_is(token_t::e_comma))
26285 {
26288 current_token(),
26289 "ERR037 - Expected ',' between if-statement consequent and alternative",
26291
26292 result = false;
26293 }
26294 else if (0 == (alternative = parse_expression()))
26295 {
26298 current_token(),
26299 "ERR038 - Failed to parse alternative for if-statement",
26301
26302 result = false;
26303 }
26304 else if (!token_is(token_t::e_rbracket))
26305 {
26308 current_token(),
26309 "ERR039 - Expected ')' at the end of if-statement",
26311
26312 result = false;
26313 }
26314
26315 #ifndef exprtk_disable_string_capabilities
26316 if (result)
26317 {
26318 const bool consq_is_str = is_generally_string_node(consequent );
26319 const bool alter_is_str = is_generally_string_node(alternative);
26320
26321 if (consq_is_str || alter_is_str)
26322 {
26323 if (consq_is_str && alter_is_str)
26324 {
26325 expression_node_ptr result_node =
26327 .conditional_string(condition, consequent, alternative);
26328
26329 if (result_node && result_node->valid())
26330 {
26331 return result_node;
26332 }
26333
26336 current_token(),
26337 "ERR040 - Failed to synthesize node: conditional_string",
26339
26340 free_node(node_allocator_, result_node);
26341 return error_node();
26342 }
26343
26346 current_token(),
26347 "ERR041 - Return types of if-statement differ: string/non-string",
26349
26350 result = false;
26351 }
26352 }
26353 #endif
26354
26355 if (result)
26356 {
26357 const bool consq_is_vec = is_ivector_node(consequent );
26358 const bool alter_is_vec = is_ivector_node(alternative);
26359
26360 if (consq_is_vec || alter_is_vec)
26361 {
26362 if (consq_is_vec && alter_is_vec)
26363 {
26365 .conditional_vector(condition, consequent, alternative);
26366 }
26367
26370 current_token(),
26371 "ERR042 - Return types of if-statement differ: vector/non-vector",
26373
26374 result = false;
26375 }
26376 }
26377
26378 if (!result)
26379 {
26380 free_node(node_allocator_, condition );
26381 free_node(node_allocator_, consequent );
26382 free_node(node_allocator_, alternative);
26383
26384 return error_node();
26385 }
26386 else
26388 .conditional(condition, consequent, alternative);
26389 }
expression_node_ptr conditional(expression_node_ptr condition, expression_node_ptr consequent, expression_node_ptr alternative) const
Definition exprtk.hpp:32692
expression_node_ptr conditional_vector(expression_node_ptr condition, expression_node_ptr consequent, expression_node_ptr alternative) const
Definition exprtk.hpp:32844
expression_node_ptr conditional_string(expression_node_ptr condition, expression_node_ptr consequent, expression_node_ptr alternative) const
Definition exprtk.hpp:32768
bool is_ivector_node(const expression_node< T > *node)
Definition exprtk.hpp:5883

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 26391 of file exprtk.hpp.

26392 {
26393 expression_node_ptr consequent = error_node();
26394 expression_node_ptr alternative = error_node();
26395
26396 bool result = true;
26397
26398 if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold))
26399 {
26400 if (0 == (consequent = parse_multi_sequence("if-statement-01")))
26401 {
26404 current_token(),
26405 "ERR043 - Failed to parse body of consequent for if-statement",
26407
26408 result = false;
26409 }
26410 else if
26411 (
26413 !token_is("else",prsrhlpr_t::e_hold) &&
26414 !token_is_loop(prsrhlpr_t::e_hold) &&
26415 !token_is_arithmetic_opr(prsrhlpr_t::e_hold) &&
26416 !token_is_right_bracket (prsrhlpr_t::e_hold) &&
26417 !token_is_ineq_opr (prsrhlpr_t::e_hold) &&
26418 !token_is(token_t::e_ternary,prsrhlpr_t::e_hold) &&
26419 !token_is(token_t::e_eof ,prsrhlpr_t::e_hold)
26420 )
26421 {
26424 current_token(),
26425 "ERR044 - Expected ';' at the end of the consequent for if-statement (1)",
26427
26428 result = false;
26429 }
26430 }
26431 else
26432 {
26433 if (
26435 token_is(token_t::e_mul,prsrhlpr_t::e_hold)
26436 )
26437 {
26438 next_token();
26439 }
26440
26441 if (0 != (consequent = parse_expression()))
26442 {
26443 if (!token_is(token_t::e_eof, prsrhlpr_t::e_hold))
26444 {
26447 current_token(),
26448 "ERR045 - Expected ';' at the end of the consequent for if-statement (2)",
26450
26451 result = false;
26452 }
26453 }
26454 else
26455 {
26458 current_token(),
26459 "ERR046 - Failed to parse body of consequent for if-statement",
26461
26462 result = false;
26463 }
26464 }
26465
26466 if (result)
26467 {
26468 if (
26469 details::imatch(current_token().value,"else") ||
26470 (token_is(token_t::e_eof, prsrhlpr_t::e_hold) && peek_token_is("else"))
26471 )
26472 {
26473 next_token();
26474
26475 if (details::imatch(current_token().value,"else"))
26476 {
26477 next_token();
26478 }
26479
26480 if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold))
26481 {
26482 if (0 == (alternative = parse_multi_sequence("else-statement-01")))
26483 {
26486 current_token(),
26487 "ERR047 - Failed to parse body of the 'else' for if-statement",
26489
26490 result = false;
26491 }
26492 }
26493 else if (details::imatch(current_token().value,"if"))
26494 {
26495 if (0 == (alternative = parse_conditional_statement()))
26496 {
26499 current_token(),
26500 "ERR048 - Failed to parse body of if-else statement",
26502
26503 result = false;
26504 }
26505 }
26506 else if (0 != (alternative = parse_expression()))
26507 {
26508 if (
26509 !token_is(token_t::e_ternary , prsrhlpr_t::e_hold) &&
26510 !token_is(token_t::e_rcrlbracket, prsrhlpr_t::e_hold) &&
26512 )
26513 {
26516 current_token(),
26517 "ERR049 - Expected ';' at the end of the 'else-if' for the if-statement",
26519
26520 result = false;
26521 }
26522 }
26523 else
26524 {
26527 current_token(),
26528 "ERR050 - Failed to parse body of the 'else' for if-statement",
26530
26531 result = false;
26532 }
26533 }
26534 }
26535
26536 #ifndef exprtk_disable_string_capabilities
26537 if (result)
26538 {
26539 const bool consq_is_str = is_generally_string_node(consequent );
26540 const bool alter_is_str = is_generally_string_node(alternative);
26541
26542 if (consq_is_str || alter_is_str)
26543 {
26544 if (consq_is_str && alter_is_str)
26545 {
26547 .conditional_string(condition, consequent, alternative);
26548 }
26549
26552 current_token(),
26553 "ERR051 - Return types of if-statement differ: string/non-string",
26555
26556 result = false;
26557 }
26558 }
26559 #endif
26560
26561 if (result)
26562 {
26563 const bool consq_is_vec = is_ivector_node(consequent );
26564 const bool alter_is_vec = is_ivector_node(alternative);
26565
26566 if (consq_is_vec || alter_is_vec)
26567 {
26568 if (consq_is_vec && alter_is_vec)
26569 {
26571 .conditional_vector(condition, consequent, alternative);
26572 }
26573
26576 current_token(),
26577 "ERR052 - Return types of if-statement differ: vector/non-vector",
26579
26580 result = false;
26581 }
26582 }
26583
26584 if (!result)
26585 {
26586 free_node(node_allocator_, condition );
26587 free_node(node_allocator_, consequent );
26588 free_node(node_allocator_, alternative);
26589
26590 return error_node();
26591 }
26592 else
26594 .conditional(condition, consequent, alternative);
26595 }
bool token_is_loop(const token_advance_mode mode=e_advance)
Definition exprtk.hpp:4600
bool token_is_arithmetic_opr(const token_advance_mode mode=e_advance)
Definition exprtk.hpp:4516
bool token_is_right_bracket(const token_advance_mode mode=e_advance)
Definition exprtk.hpp:4567
bool token_is_ineq_opr(const token_advance_mode mode=e_advance)
Definition exprtk.hpp:4534
bool peek_token_is(const token_t::token_type &ttype)
Definition exprtk.hpp:4607
expression_node_ptr parse_conditional_statement()
Definition exprtk.hpp:26597
expression_node_ptr parse_multi_sequence(const std::string &source="", const bool enforce_crlbrackets=false)
Definition exprtk.hpp:27906

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::lexer::token::e_rcrlbracket, 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::lexer::parser_helper::peek_token_is(), 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 28284 of file exprtk.hpp.

28285 {
28286 const std::string const_str = current_token().value;
28287 expression_node_ptr result = expression_generator_(const_str);
28288
28290 {
28291 next_token();
28292
28294 {
28295 next_token();
28296 next_token();
28297
28298 free_node(node_allocator_, result);
28299
28300 return expression_generator_(T(const_str.size()));
28301 }
28302
28303 range_t rp;
28304
28305 if (!parse_range(rp))
28306 {
28307 free_node(node_allocator_, result);
28308 rp.free();
28309
28310 return error_node();
28311 }
28312
28313 free_node(node_allocator_, result);
28314
28315 if (rp.n1_c.first && (rp.n1_c.second == std::numeric_limits<std::size_t>::max()))
28316 {
28317 rp.n1_c.second = const_str.size() - 1;
28318 rp.cache.second = rp.n1_c.second;
28319 }
28320
28321 if (
28322 (rp.n0_c.first && (rp.n0_c.second >= const_str.size())) ||
28323 (rp.n1_c.first && (rp.n1_c.second >= const_str.size()))
28324 )
28325 {
28328 current_token(),
28329 "ERR122 - Overflow in range for string: '" + const_str + "'[" +
28330 (rp.n0_c.first ? details::to_str(static_cast<int>(rp.n0_c.second)) : "?") + ":" +
28331 (rp.n1_c.first ? details::to_str(static_cast<int>(rp.n1_c.second)) : "?") + "]",
28333
28334 rp.free();
28335
28336 return error_node();
28337 }
28338
28339 result = expression_generator_(const_str,rp);
28340
28341 if (result)
28342 rp.clear();
28343 }
28344 else
28345 next_token();
28346
28347 return result;
28348 }
bool parse_range(range_t &rp, const bool skip_lsqr=false)
Definition exprtk.hpp:27987
details::range_pack< T > range_t
Definition exprtk.hpp:22493
std::string to_str(int i)
Definition exprtk.hpp:302
std::string to_str(const StringView &view)
Definition exprtk.hpp:4996

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 29348 of file exprtk.hpp.

29349 {
29351 {
29354 current_token(),
29355 "ERR156 - Invalid use of 'continue', allowed only in the scope of a loop",
29357
29358 return error_node();
29359 }
29360 else
29361 {
29362 next_token();
29363
29364 brkcnt_list_.front() = true;
29365 state_.activate_side_effect("parse_continue_statement()");
29366
29368 }
29369 }

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 25216 of file exprtk.hpp.

25217 {
25218 std::vector<expression_node_ptr> arg_list;
25219 std::vector<bool> side_effect_list;
25220
25221 scoped_vec_delete<expression_node_t> svd((*this), arg_list);
25222
25223 lexer::token begin_token;
25224 lexer::token end_token;
25225
25226 for ( ; ; )
25227 {
25229
25230 begin_token = current_token();
25231
25233
25234 if (0 == arg)
25235 {
25236 if (error_list_.empty())
25237 {
25240 current_token(),
25241 "ERR009 - Invalid expression encountered",
25243 }
25244
25245 return error_node();
25246 }
25247 else
25248 {
25249 arg_list.push_back(arg);
25250
25251 side_effect_list.push_back(state_.side_effect_present);
25252
25253 end_token = current_token();
25254
25255 const std::string sub_expr = construct_subexpr(begin_token, end_token);
25256
25257 exprtk_debug(("parse_corpus(%02d) Subexpr: %s\n",
25258 static_cast<int>(arg_list.size() - 1),
25259 sub_expr.c_str()));
25260
25261 exprtk_debug(("parse_corpus(%02d) - Side effect present: %s\n",
25262 static_cast<int>(arg_list.size() - 1),
25263 state_.side_effect_present ? "true" : "false"));
25264
25265 exprtk_debug(("-------------------------------------------------\n"));
25266 }
25267
25268 if (token_is(token_t::e_eof,prsrhlpr_t::e_hold))
25269 {
25270 if (lexer().finished())
25271 break;
25272 else
25273 next_token();
25274 }
25275 else if (
25277 (
25278 current_token().type == token_t::e_symbol ||
25279 current_token().type == token_t::e_number ||
25280 current_token().type == token_t::e_string ||
25281 token_is_bracket(prsrhlpr_t::e_hold)
25282 )
25283 )
25284 {
25287 current_token(),
25288 "ERR010 - Invalid syntax '" + current_token().value + "' possible missing operator or context",
25290
25291 return error_node();
25292 }
25293 }
25294
25295 if (
25296 !arg_list.empty() &&
25297 is_return_node(arg_list.back())
25298 )
25299 {
25300 dec_.final_stmt_return_ = true;
25301 }
25302
25303 const expression_node_ptr result = simplify(arg_list,side_effect_list);
25304
25305 svd.delete_ptr = (0 == result);
25306
25307 return result;
25308 }
bool token_is_bracket(const token_advance_mode mode=e_advance)
Definition exprtk.hpp:4582
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:27823
std::string construct_subexpr(lexer::token &begin_token, lexer::token &end_token, const bool cleanup_whitespace=true)
Definition exprtk.hpp:25310
bool is_return_node(const expression_node< T > *node)
Definition exprtk.hpp:5972

References exprtk::parser< T >::settings_store::commutative_check_enabled(), 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::lexer::token::e_number, exprtk::lexer::token::e_string, exprtk::lexer::token::e_symbol, 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 >::settings_, exprtk::parser< T >::parser_state::side_effect_present, exprtk::parser< T >::simplify(), exprtk::parser< T >::state_, exprtk::lexer::parser_helper::token_is(), and exprtk::lexer::parser_helper::token_is_bracket().

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 30140 of file exprtk.hpp.

30141 {
30143 {
30146 current_token(),
30147 "ERR187 - Illegal const variable definition",
30149
30150 return error_node();
30151 }
30152 else if (!token_is("const"))
30153 {
30156 current_token(),
30157 "ERR188 - Expected 'const' keyword for const-variable definition",
30159
30160 return error_node();
30161 }
30162 else if (!token_is("var"))
30163 {
30166 current_token(),
30167 "ERR189 - Expected 'var' keyword for const-variable definition",
30169
30170 return error_node();
30171 }
30172
30173 const std::string var_name = current_token().value;
30174
30175 expression_node_ptr initialisation_expression = error_node();
30176
30178 {
30181 current_token(),
30182 "ERR190 - Expected a symbol for const-variable definition",
30184
30185 return error_node();
30186 }
30187 else if (details::is_reserved_symbol(var_name))
30188 {
30191 current_token(),
30192 "ERR191 - Illegal redefinition of reserved keyword: '" + var_name + "'",
30194
30195 return error_node();
30196 }
30197 else if (symtab_store_.symbol_exists(var_name))
30198 {
30201 current_token(),
30202 "ERR192 - Illegal redefinition of variable '" + var_name + "'",
30204
30205 return error_node();
30206 }
30207 else if (local_variable_is_shadowed(var_name))
30208 {
30211 current_token(),
30212 "ERR193 - Illegal redefinition of local variable: '" + var_name + "'",
30214
30215 return error_node();
30216 }
30217 else if (!token_is(token_t::e_assign))
30218 {
30221 current_token(),
30222 "ERR194 - Expected assignment operator after const-variable: '" + var_name + "' definition",
30224
30225 return error_node();
30226 }
30227 else if (0 == (initialisation_expression = parse_expression()))
30228 {
30231 current_token(),
30232 "ERR195 - Failed to parse initialisation expression for const-variable: '" + var_name + "'",
30234
30235 return error_node();
30236 }
30237
30238 if (!details::is_literal_node(initialisation_expression))
30239 {
30242 current_token(),
30243 "ERR196 - initialisation expression for const-variable: '" + var_name + "' must be a constant/literal",
30245
30246 free_node(node_allocator_, initialisation_expression);
30247
30248 return error_node();
30249 }
30250
30251 assert(initialisation_expression);
30252
30253 const T init_value = initialisation_expression->value();
30254
30255 free_node(node_allocator_, initialisation_expression);
30256
30257 expression_node_ptr var_node = reinterpret_cast<expression_node_ptr>(0);
30258
30259 scope_element& se = sem_.get_element(var_name);
30260
30261 if (se.name == var_name)
30262 {
30263 if (se.active)
30264 {
30267 current_token(),
30268 "ERR197 - Illegal redefinition of local variable: '" + var_name + "'",
30270
30271 return error_node();
30272 }
30273 else if (scope_element::e_literal == se.type)
30274 {
30275 var_node = se.var_node;
30276 se.active = true;
30277 se.depth = state_.scope_depth;
30278 se.ref_count++;
30279 }
30280 }
30281
30282 if (0 == var_node)
30283 {
30284 const std::size_t predicted_total_lclsymb_size = sizeof(T) + sem_.total_local_symb_size_bytes();
30285
30286 if (predicted_total_lclsymb_size > settings().max_total_local_symbol_size_bytes())
30287 {
30290 current_token(),
30291 "ERR198 - Adding variable '" + var_name + "' "
30292 "will exceed max total local symbol size of: " + details::to_str(settings().max_total_local_symbol_size_bytes()) + " bytes, "
30293 "current total size: " + details::to_str(sem_.total_local_symb_size_bytes()) + " bytes",
30295
30296 return error_node();
30297 }
30298
30299 scope_element nse;
30300 nse.name = var_name;
30301 nse.active = true;
30302 nse.ref_count = 1;
30303 nse.type = scope_element::e_literal;
30304 nse.depth = state_.scope_depth;
30305 nse.data = 0;
30306 nse.var_node = node_allocator_.allocate<literal_node_t>(init_value);
30307
30308 if (!sem_.add_element(nse))
30309 {
30312 current_token(),
30313 "ERR199 - Failed to add new local const-variable '" + var_name + "' to SEM",
30315
30316 sem_.free_element(nse);
30317
30318 return error_node();
30319 }
30320
30321 assert(sem_.total_local_symb_size_bytes() <= settings().max_total_local_symbol_size_bytes());
30322
30323 var_node = nse.var_node;
30324
30325 exprtk_debug(("parse_define_constvar_statement() - INFO - Added new local const-variable: %s\n", nse.name.c_str()));
30326 }
30327
30328 state_.activate_side_effect("parse_define_constvar_statement()");
30329
30331
30332 return expression_generator_(var_node->value());
30333 }
bool add_element(const scope_element &se)
Definition exprtk.hpp:22736
std::size_t total_local_symb_size_bytes() const
Definition exprtk.hpp:22839
void free_element(scope_element &se)
Definition exprtk.hpp:22793
std::size_t max_total_local_symbol_size_bytes() const
Definition exprtk.hpp:24522
void lodge_symbol(const std::string &symbol, const symbol_type st)
Definition exprtk.hpp:28171
details::literal_node< T > literal_node_t
Definition exprtk.hpp:22460
bool local_variable_is_shadowed(const std::string &symbol)
Definition exprtk.hpp:29932
bool is_reserved_symbol(const std::string &symbol)
Definition exprtk.hpp:536
bool is_literal_node(const expression_node< T > *node)
Definition exprtk.hpp:5782
bool symbol_exists(const std::string &symbol) const
Definition exprtk.hpp:23506

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 >::settings_store::max_total_local_symbol_size_bytes(), 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 >::settings_, exprtk::parser< T >::state_, exprtk::parser< T >::symtab_store::symbol_exists(), exprtk::parser< T >::symtab_store_, exprtk::details::to_str(), exprtk::lexer::parser_helper::token_is(), exprtk::parser< T >::scope_element_manager::total_local_symb_size_bytes(), 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 29852 of file exprtk.hpp.

29853 {
29854 stringvar_node_t* str_node = reinterpret_cast<stringvar_node_t*>(0);
29855
29856 scope_element& se = sem_.get_element(str_name);
29857
29858 if (se.name == str_name)
29859 {
29860 if (se.active)
29861 {
29864 current_token(),
29865 "ERR175 - Illegal redefinition of local variable: '" + str_name + "'",
29867
29868 free_node(node_allocator_, initialisation_expression);
29869
29870 return error_node();
29871 }
29872 else if (scope_element::e_string == se.type)
29873 {
29874 str_node = se.str_node;
29875 se.active = true;
29876 se.depth = state_.scope_depth;
29877 se.ref_count++;
29878 }
29879 }
29880
29881 if (0 == str_node)
29882 {
29883 scope_element nse;
29884 nse.name = str_name;
29885 nse.active = true;
29886 nse.ref_count = 1;
29887 nse.type = scope_element::e_string;
29888 nse.depth = state_.scope_depth;
29889 nse.data = new std::string;
29890 nse.str_node = new stringvar_node_t(*reinterpret_cast<std::string*>(nse.data));
29891
29892 if (!sem_.add_element(nse))
29893 {
29896 current_token(),
29897 "ERR176 - Failed to add new local string variable '" + str_name + "' to SEM",
29899
29900 free_node(node_allocator_, initialisation_expression);
29901
29902 sem_.free_element(nse);
29903
29904 return error_node();
29905 }
29906
29907 assert(sem_.total_local_symb_size_bytes() <= settings().max_total_local_symbol_size_bytes());
29908
29909 str_node = nse.str_node;
29910
29911 exprtk_debug(("parse_define_string_statement() - INFO - Added new local string variable: %s\n", nse.name.c_str()));
29912 }
29913
29915
29916 state_.activate_side_effect("parse_define_string_statement()");
29917
29918 expression_node_ptr branch[2] = {0};
29919
29920 branch[0] = str_node;
29921 branch[1] = initialisation_expression;
29922
29924 }
details::stringvar_node< T > stringvar_node_t
Definition exprtk.hpp:22495

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 >::settings(), exprtk::parser< T >::state_, exprtk::parser< T >::scope_element::str_node, exprtk::parser< T >::scope_element_manager::total_local_symb_size_bytes(), 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 29938 of file exprtk.hpp.

29939 {
29941 {
29944 current_token(),
29945 "ERR177 - Illegal variable definition",
29947
29948 return error_node();
29949 }
29950 else if (!details::imatch(current_token().value,"var"))
29951 {
29952 return error_node();
29953 }
29954 else
29955 next_token();
29956
29957 const std::string var_name = current_token().value;
29958
29959 expression_node_ptr initialisation_expression = error_node();
29960
29962 {
29965 current_token(),
29966 "ERR178 - Expected a symbol for variable definition",
29968
29969 return error_node();
29970 }
29971 else if (details::is_reserved_symbol(var_name))
29972 {
29975 current_token(),
29976 "ERR179 - Illegal redefinition of reserved keyword: '" + var_name + "'",
29978
29979 return error_node();
29980 }
29981 else if (symtab_store_.symbol_exists(var_name))
29982 {
29985 current_token(),
29986 "ERR180 - Illegal redefinition of variable '" + var_name + "'",
29988
29989 return error_node();
29990 }
29991 else if (local_variable_is_shadowed(var_name))
29992 {
29995 current_token(),
29996 "ERR181 - Illegal redefinition of local variable: '" + var_name + "'",
29998
29999 return error_node();
30000 }
30001 else if (token_is(token_t::e_lsqrbracket,prsrhlpr_t::e_hold))
30002 {
30003 return parse_define_vector_statement(var_name);
30004 }
30005 else if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold))
30006 {
30007 return parse_uninitialised_var_statement(var_name);
30008 }
30009 else if (token_is(token_t::e_assign))
30010 {
30011 if (0 == (initialisation_expression = parse_expression()))
30012 {
30015 current_token(),
30016 "ERR182 - Failed to parse initialisation expression for variable '" + var_name + "'",
30018
30019 return error_node();
30020 }
30021 }
30022
30023 if (
30024 !token_is(token_t::e_rbracket , prsrhlpr_t::e_hold) &&
30025 !token_is(token_t::e_rcrlbracket, prsrhlpr_t::e_hold) &&
30026 !token_is(token_t::e_rsqrbracket, prsrhlpr_t::e_hold)
30027 )
30028 {
30029 if (!token_is(token_t::e_eof,prsrhlpr_t::e_hold))
30030 {
30033 current_token(),
30034 "ERR183 - Expected ';' after variable '" + var_name + "' definition",
30036
30037 free_node(node_allocator_, initialisation_expression);
30038
30039 return error_node();
30040 }
30041 }
30042
30043 if (
30044 (0 != initialisation_expression) &&
30045 details::is_generally_string_node(initialisation_expression)
30046 )
30047 {
30048 return parse_define_string_statement(var_name,initialisation_expression);
30049 }
30050
30051 expression_node_ptr var_node = reinterpret_cast<expression_node_ptr>(0);
30052
30053 scope_element& se = sem_.get_element(var_name);
30054
30055 if (se.name == var_name)
30056 {
30057 if (se.active)
30058 {
30061 current_token(),
30062 "ERR184 - Illegal redefinition of local variable: '" + var_name + "'",
30064
30065 free_node(node_allocator_, initialisation_expression);
30066
30067 return error_node();
30068 }
30069 else if (scope_element::e_variable == se.type)
30070 {
30071 var_node = se.var_node;
30072 se.active = true;
30073 se.depth = state_.scope_depth;
30074 se.ref_count++;
30075 }
30076 }
30077
30078 if (0 == var_node)
30079 {
30080 const std::size_t predicted_total_lclsymb_size = sizeof(T) + sem_.total_local_symb_size_bytes();
30081
30082 if (predicted_total_lclsymb_size > settings().max_total_local_symbol_size_bytes())
30083 {
30086 current_token(),
30087 "ERR185 - Adding variable '" + var_name + "' "
30088 "will exceed max total local symbol size of: " + details::to_str(settings().max_total_local_symbol_size_bytes()) + " bytes, "
30089 "current total size: " + details::to_str(sem_.total_local_symb_size_bytes()) + " bytes",
30091
30092 free_node(node_allocator_, initialisation_expression);
30093
30094 return error_node();
30095 }
30096
30097 scope_element nse;
30098 nse.name = var_name;
30099 nse.active = true;
30100 nse.ref_count = 1;
30101 nse.type = scope_element::e_variable;
30102 nse.depth = state_.scope_depth;
30103 nse.data = new T(T(0));
30104 nse.var_node = node_allocator_.allocate<variable_node_t>(*reinterpret_cast<T*>(nse.data));
30105
30106 if (!sem_.add_element(nse))
30107 {
30110 current_token(),
30111 "ERR186 - Failed to add new local variable '" + var_name + "' to SEM",
30113
30114 free_node(node_allocator_, initialisation_expression);
30115
30116 sem_.free_element(nse);
30117
30118 return error_node();
30119 }
30120
30121 assert(sem_.total_local_symb_size_bytes() <= settings().max_total_local_symbol_size_bytes());
30122
30123 var_node = nse.var_node;
30124
30125 exprtk_debug(("parse_define_var_statement() - INFO - Added new local variable: %s\n", nse.name.c_str()));
30126 }
30127
30128 state_.activate_side_effect("parse_define_var_statement()");
30129
30131
30132 expression_node_ptr branch[2] = {0};
30133
30134 branch[0] = var_node;
30135 branch[1] = initialisation_expression ? initialisation_expression : expression_generator_(T(0));
30136
30138 }
details::variable_node< T > variable_node_t
Definition exprtk.hpp:22482
expression_node_ptr parse_define_vector_statement(const std::string &vec_name)
Definition exprtk.hpp:29372
expression_node_ptr parse_define_string_statement(const std::string &str_name, expression_node_ptr initialisation_expression)
Definition exprtk.hpp:29852
expression_node_ptr parse_uninitialised_var_statement(const std::string &var_name)
Definition exprtk.hpp:30335

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 >::settings_store::max_total_local_symbol_size_bytes(), 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 >::settings_, exprtk::parser< T >::state_, exprtk::parser< T >::symtab_store::symbol_exists(), exprtk::parser< T >::symtab_store_, exprtk::details::to_str(), exprtk::lexer::parser_helper::token_is(), exprtk::parser< T >::scope_element_manager::total_local_symb_size_bytes(), 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 29372 of file exprtk.hpp.

29373 {
29374 expression_node_ptr size_expression_node = error_node();
29375
29377 {
29380 current_token(),
29381 "ERR157 - Expected '[' as part of vector size definition",
29383
29384 return error_node();
29385 }
29386 else if (0 == (size_expression_node = parse_expression()))
29387 {
29390 current_token(),
29391 "ERR158 - Failed to determine size of vector '" + vec_name + "'",
29393
29394 return error_node();
29395 }
29396 else if (!is_constant_node(size_expression_node))
29397 {
29398 const bool is_rebaseble_vector =
29399 (size_expression_node->type() == details::expression_node<T>::e_vecsize) &&
29400 static_cast<details::vector_size_node<T>*>(size_expression_node)->vec_holder()->rebaseable();
29401
29402 free_node(node_allocator_, size_expression_node);
29403
29404 const std::string error_msg = (is_rebaseble_vector) ?
29405 std::string("Rebasable/Resizable vector cannot be used to define the size of vector") :
29406 std::string("Expected a constant literal number as size of vector");
29409 current_token(),
29410 "ERR159 - " + error_msg + " '" + vec_name + "'",
29412
29413 return error_node();
29414 }
29415
29416 const T vector_size = size_expression_node->value();
29417
29418 free_node(node_allocator_, size_expression_node);
29419
29420 const std::size_t max_vector_size = settings_.max_local_vector_size();
29421
29422 if (
29423 (vector_size <= T(0)) ||
29424 std::not_equal_to<T>()
29425 (T(0),vector_size - details::numeric::trunc(vector_size)) ||
29426 (static_cast<std::size_t>(vector_size) > max_vector_size)
29427 )
29428 {
29431 current_token(),
29432 "ERR160 - Invalid vector size. Must be an integer in the "
29433 "range [0," + details::to_str(static_cast<std::size_t>(max_vector_size)) + "], size: " +
29436
29437 return error_node();
29438 }
29439
29441
29442 const std::size_t vec_size = static_cast<std::size_t>(details::numeric::to_int32(vector_size));
29443 const std::size_t predicted_total_lclsymb_size = sizeof(T) * vec_size + sem_.total_local_symb_size_bytes();
29444
29445 if (predicted_total_lclsymb_size > settings().max_total_local_symbol_size_bytes())
29446 {
29449 current_token(),
29450 "ERR161 - Adding vector '" + vec_name + "' of size " + details::to_str(vec_size) + " bytes "
29451 "will exceed max total local symbol size of: " + details::to_str(settings().max_total_local_symbol_size_bytes()) + " bytes, "
29452 "current total size: " + details::to_str(sem_.total_local_symb_size_bytes()) + " bytes",
29454
29455 return error_node();
29456 }
29457
29458 scope_element& se = sem_.get_element(vec_name);
29459
29460 if (se.name == vec_name)
29461 {
29462 if (se.active)
29463 {
29466 current_token(),
29467 "ERR162 - Illegal redefinition of local vector: '" + vec_name + "'",
29469
29470 return error_node();
29471 }
29472 else if (
29473 (se.size == vec_size) &&
29474 (scope_element::e_vector == se.type)
29475 )
29476 {
29477 vec_holder = se.vec_node;
29478 se.active = true;
29479 se.depth = state_.scope_depth;
29480 se.ref_count++;
29481 }
29482 }
29483
29484 if (0 == vec_holder)
29485 {
29486 scope_element nse;
29487 nse.name = vec_name;
29488 nse.active = true;
29489 nse.ref_count = 1;
29490 nse.type = scope_element::e_vector;
29491 nse.depth = state_.scope_depth;
29492 nse.size = vec_size;
29493 nse.data = new T[vec_size];
29494 nse.vec_node = new typename scope_element::vector_holder_t(reinterpret_cast<T*>(nse.data),nse.size);
29495
29496 details::set_zero_value(reinterpret_cast<T*>(nse.data),vec_size);
29497
29498 if (!sem_.add_element(nse))
29499 {
29502 current_token(),
29503 "ERR163 - Failed to add new local vector '" + vec_name + "' to SEM",
29505
29506 sem_.free_element(nse);
29507
29508 return error_node();
29509 }
29510
29511 assert(sem_.total_local_symb_size_bytes() <= settings().max_total_local_symbol_size_bytes());
29512
29513 vec_holder = nse.vec_node;
29514
29515 exprtk_debug(("parse_define_vector_statement() - INFO - Added new local vector: %s[%d]\n",
29516 nse.name.c_str(),
29517 static_cast<int>(nse.size)));
29518 }
29519
29520 state_.activate_side_effect("parse_define_vector_statement()");
29521
29523
29524 std::vector<expression_node_ptr> vec_initilizer_list;
29525
29526 scoped_vec_delete<expression_node_t> svd((*this), vec_initilizer_list);
29527
29528 bool single_value_initialiser = false;
29529 bool range_value_initialiser = false;
29530 bool vec_to_vec_initialiser = false;
29531 bool null_initialisation = false;
29532
29534 {
29537 current_token(),
29538 "ERR164 - Expected ']' as part of vector size definition",
29540
29541 return error_node();
29542 }
29543 else if (!token_is(token_t::e_eof, prsrhlpr_t::e_hold))
29544 {
29546 {
29549 current_token(),
29550 "ERR165 - Expected ':=' as part of vector definition",
29552
29553 return error_node();
29554 }
29556 {
29557 expression_node_ptr initialiser_component = parse_expression();
29558
29559 if (0 == initialiser_component)
29560 {
29563 current_token(),
29564 "ERR166 - Failed to parse first component of vector initialiser for vector: " + vec_name,
29566
29567 return error_node();
29568 }
29569
29570 vec_initilizer_list.push_back(initialiser_component);
29571
29573 {
29574 initialiser_component = parse_expression();
29575
29576 if (0 == initialiser_component)
29577 {
29580 current_token(),
29581 "ERR167 - Failed to parse second component of vector initialiser for vector: " + vec_name,
29583
29584 return error_node();
29585 }
29586
29587 vec_initilizer_list.push_back(initialiser_component);
29588 }
29589
29591 {
29594 current_token(),
29595 "ERR168 - Expected ']' to close single value vector initialiser",
29597
29598 return error_node();
29599 }
29600
29601 switch (vec_initilizer_list.size())
29602 {
29603 case 1 : single_value_initialiser = true; break;
29604 case 2 : range_value_initialiser = true; break;
29605 }
29606 }
29608 {
29609 expression_node_ptr initialiser = error_node();
29610
29611 // Is this a vector to vector assignment and initialisation?
29612 if (token_t::e_symbol == current_token().type)
29613 {
29614 // Is it a locally defined vector?
29615 const scope_element& lcl_se = sem_.get_active_element(current_token().value);
29616
29617 if (scope_element::e_vector == lcl_se.type)
29618 {
29619 if (0 != (initialiser = parse_expression()))
29620 vec_initilizer_list.push_back(initialiser);
29621 else
29622 return error_node();
29623 }
29624 // Are we dealing with a user defined vector?
29625 else if (symtab_store_.is_vector(current_token().value))
29626 {
29628
29629 if (0 != (initialiser = parse_expression()))
29630 vec_initilizer_list.push_back(initialiser);
29631 else
29632 return error_node();
29633 }
29634 // Are we dealing with a null initialisation vector definition?
29635 else if (token_is(token_t::e_symbol,"null"))
29636 null_initialisation = true;
29637 }
29638
29639 if (!null_initialisation)
29640 {
29641 if (0 == initialiser)
29642 {
29645 current_token(),
29646 "ERR169 - Expected '{' as part of vector initialiser list",
29648
29649 return error_node();
29650 }
29651 else
29652 vec_to_vec_initialiser = true;
29653 }
29654 }
29656 {
29657 for ( ; ; )
29658 {
29659 expression_node_ptr initialiser = parse_expression();
29660
29661 if (0 == initialiser)
29662 {
29665 current_token(),
29666 "ERR170 - Expected '{' as part of vector initialiser list",
29668
29669 return error_node();
29670 }
29671 else
29672 vec_initilizer_list.push_back(initialiser);
29673
29675 break;
29676
29677 const bool is_next_close = peek_token_is(token_t::e_rcrlbracket);
29678
29679 if (!token_is(token_t::e_comma) && is_next_close)
29680 {
29683 current_token(),
29684 "ERR171 - Expected ',' between vector initialisers",
29686
29687 return error_node();
29688 }
29689
29691 break;
29692 }
29693 }
29694
29695 if (
29696 !token_is(token_t::e_rbracket , prsrhlpr_t::e_hold) &&
29697 !token_is(token_t::e_rcrlbracket, prsrhlpr_t::e_hold) &&
29698 !token_is(token_t::e_rsqrbracket, prsrhlpr_t::e_hold)
29699 )
29700 {
29701 if (!token_is(token_t::e_eof,prsrhlpr_t::e_hold))
29702 {
29705 current_token(),
29706 "ERR172 - Expected ';' at end of vector definition",
29708
29709 return error_node();
29710 }
29711 }
29712
29713 if (
29714 !single_value_initialiser &&
29715 !range_value_initialiser &&
29716 (T(vec_initilizer_list.size()) > vector_size)
29717 )
29718 {
29721 current_token(),
29722 "ERR173 - Initialiser list larger than the number of elements in the vector: '" + vec_name + "'",
29724
29725 return error_node();
29726 }
29727 }
29728
29730
29731 if (
29732 (vec_initilizer_list.size() == 1) &&
29733 single_value_initialiser
29734 )
29735 {
29736 if (details::is_constant_node(vec_initilizer_list[0]))
29737 {
29738 // vector_init_zero_value_node var v[10] := [0]
29739 if (T(0) == vec_initilizer_list[0]->value())
29740 {
29741 result = node_allocator_
29743 (*vec_holder)[0],
29744 vec_size,
29745 vec_initilizer_list);
29746 }
29747 else
29748 {
29749 // vector_init_single_constvalue_node var v[10] := [123]
29750 result = node_allocator_
29752 (*vec_holder)[0],
29753 vec_size,
29754 vec_initilizer_list);
29755 }
29756 }
29757 else
29758 {
29759 // vector_init_single_value_node var v[10] := [123 + (x / y)]
29760 result = node_allocator_
29762 (*vec_holder)[0],
29763 vec_size,
29764 vec_initilizer_list);
29765 }
29766 }
29767 else if (
29768 (vec_initilizer_list.size() == 2) &&
29769 range_value_initialiser
29770 )
29771 {
29772 bool base_const = details::is_constant_node(vec_initilizer_list[0]);
29773 bool inc_const = details::is_constant_node(vec_initilizer_list[1]);
29774
29775 if (base_const && inc_const)
29776 {
29777 // vector_init_single_value_node var v[10] := [1 : 3.5]
29778 result = node_allocator_
29780 (*vec_holder)[0],
29781 vec_size,
29782 vec_initilizer_list);
29783 }
29784 else if (base_const && !inc_const)
29785 {
29786 // vector_init_single_value_node var v[10] := [1 : x + y]
29787 result = node_allocator_
29789 (*vec_holder)[0],
29790 vec_size,
29791 vec_initilizer_list);
29792 }
29793 else if (!base_const && inc_const)
29794 {
29795 // vector_init_single_value_node var v[10] := [x + y : 3]
29796 result = node_allocator_
29798 (*vec_holder)[0],
29799 vec_size,
29800 vec_initilizer_list);
29801 }
29802 else if (!base_const && !inc_const)
29803 {
29804 // vector_init_single_value_node var v[10] := [x + y : z / w]
29805 result = node_allocator_
29807 (*vec_holder)[0],
29808 vec_size,
29809 vec_initilizer_list);
29810 }
29811 }
29812 else if (null_initialisation)
29813 result = expression_generator_(T(0.0));
29814 else if (vec_to_vec_initialiser)
29815 {
29817
29818 result = expression_generator_(
29820 vec_node,
29821 vec_initilizer_list[0]);
29822 }
29823 else
29824 {
29825 result = node_allocator_
29827 (*vec_holder)[0],
29828 vec_size,
29829 vec_initilizer_list,
29830 single_value_initialiser);
29831 }
29832
29833 svd.delete_ptr = false;
29834
29835 if (result && result->valid())
29836 {
29837 return result;
29838 }
29839
29841
29844 current_token(),
29845 "ERR174 - Failed to generate initialisation node for vector: " + vec_name,
29847
29848 return error_node();
29849 }
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:22714
std::size_t max_local_vector_size() const
Definition exprtk.hpp:24517
details::vector_node< T > vector_node_t
Definition exprtk.hpp:22491
vector_holder_t * vector_holder_ptr
Definition exprtk.hpp:20943
int to_int32(const T v)
Definition exprtk.hpp:1505
bool is_constant_node(const expression_node< T > *node)
Definition exprtk.hpp:5926
T value(details::expression_node< T > *n)
Definition exprtk.hpp:15948
void set_zero_value(T *data, const std::size_t size)
Definition exprtk.hpp:793
details::vector_holder< T > vector_holder_t
Definition exprtk.hpp:22583
bool is_vector(const std::string &vector_name) const
Definition exprtk.hpp:23612

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 >::settings_store::max_total_local_symbol_size_bytes(), 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 >::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::parser< T >::scope_element_manager::total_local_symb_size_bytes(), 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 25395 of file exprtk.hpp.

25396 {
25398 {
25399 exprtk_debug(("halt_compilation_check() - parse_expression checkpoint 2\n"));
25400 return error_node();
25401 }
25402
25403 stack_limit_handler slh(*this);
25404
25405 if (!slh)
25406 {
25407 return error_node();
25408 }
25409
25410 expression_node_ptr expression = parse_branch(precedence);
25411
25412 if (0 == expression)
25413 {
25414 return error_node();
25415 }
25416
25417 if (token_is(token_t::e_eof,prsrhlpr_t::e_hold))
25418 {
25419 return expression;
25420 }
25421
25422 bool break_loop = false;
25423
25424 state_t current_state;
25425
25426 for ( ; ; )
25427 {
25429
25430 switch (current_token().type)
25431 {
25451 default :
25452 if (token_t::e_symbol == current_token().type)
25453 {
25454 static const std::string s_and = "and" ;
25455 static const std::string s_nand = "nand" ;
25456 static const std::string s_or = "or" ;
25457 static const std::string s_nor = "nor" ;
25458 static const std::string s_xor = "xor" ;
25459 static const std::string s_xnor = "xnor" ;
25460 static const std::string s_in = "in" ;
25461 static const std::string s_like = "like" ;
25462 static const std::string s_ilike = "ilike";
25463 static const std::string s_and1 = "&" ;
25464 static const std::string s_or1 = "|" ;
25465 static const std::string s_not = "not" ;
25466
25467 if (details::imatch(current_token().value,s_and))
25468 {
25470 break;
25471 }
25472 else if (details::imatch(current_token().value,s_and1))
25473 {
25474 #ifndef exprtk_disable_sc_andor
25476 #else
25478 #endif
25479 break;
25480 }
25481 else if (details::imatch(current_token().value,s_nand))
25482 {
25484 break;
25485 }
25486 else if (details::imatch(current_token().value,s_or))
25487 {
25489 break;
25490 }
25491 else if (details::imatch(current_token().value,s_or1))
25492 {
25493 #ifndef exprtk_disable_sc_andor
25495 #else
25497 #endif
25498 break;
25499 }
25500 else if (details::imatch(current_token().value,s_nor))
25501 {
25503 break;
25504 }
25505 else if (details::imatch(current_token().value,s_xor))
25506 {
25508 break;
25509 }
25510 else if (details::imatch(current_token().value,s_xnor))
25511 {
25513 break;
25514 }
25515 else if (details::imatch(current_token().value,s_in))
25516 {
25518 break;
25519 }
25520 else if (details::imatch(current_token().value,s_like))
25521 {
25523 break;
25524 }
25525 else if (details::imatch(current_token().value,s_ilike))
25526 {
25528 break;
25529 }
25530 else if (details::imatch(current_token().value,s_not))
25531 {
25532 break;
25533 }
25534 }
25535
25536 break_loop = true;
25537 }
25538
25539 if (break_loop)
25540 {
25542 break;
25543 }
25544 else if (current_state.left < precedence)
25545 break;
25546
25547 const lexer::token prev_token = current_token();
25548
25549 next_token();
25550
25551 expression_node_ptr right_branch = error_node();
25552 expression_node_ptr new_expression = error_node();
25553
25555 {
25556 free_node(node_allocator_, expression);
25557
25560 prev_token,
25561 "ERR012 - Invalid or disabled logic operation '" + details::to_str(current_state.operation) + "'",
25563
25564 return error_node();
25565 }
25567 {
25568 free_node(node_allocator_, expression);
25569
25572 prev_token,
25573 "ERR013 - Invalid or disabled arithmetic operation '" + details::to_str(current_state.operation) + "'",
25575
25576 return error_node();
25577 }
25579 {
25580 free_node(node_allocator_, expression);
25581
25584 prev_token,
25585 "ERR014 - Invalid inequality operation '" + details::to_str(current_state.operation) + "'",
25587
25588 return error_node();
25589 }
25591 {
25592 free_node(node_allocator_, expression);
25593
25596 prev_token,
25597 "ERR015 - Invalid or disabled assignment operation '" + details::to_str(current_state.operation) + "'",
25599
25600 return error_node();
25601 }
25602
25603 if (0 != (right_branch = parse_expression(current_state.right)))
25604 {
25605 if (
25606 details::is_return_node(expression ) ||
25607 details::is_return_node(right_branch)
25608 )
25609 {
25610 free_node(node_allocator_, expression );
25611 free_node(node_allocator_, right_branch);
25612
25615 prev_token,
25616 "ERR016 - Return statements cannot be part of sub-expressions",
25618
25619 return error_node();
25620 }
25621
25623
25624 new_expression = expression_generator_
25625 (
25627 expression,
25628 right_branch
25629 );
25630
25632 }
25633
25634 if (0 == new_expression)
25635 {
25636 if (error_list_.empty())
25637 {
25640 prev_token,
25641 !synthesis_error_.empty() ?
25643 "ERR017 - General parsing error at token: '" + prev_token.value + "'",
25645 }
25646
25647 free_node(node_allocator_, expression );
25648 free_node(node_allocator_, right_branch);
25649
25650 return error_node();
25651 }
25652 else
25653 {
25654 if (
25655 token_is(token_t::e_ternary,prsrhlpr_t::e_hold) &&
25656 (e_level00 == precedence)
25657 )
25658 {
25659 expression = parse_ternary_conditional_statement(new_expression);
25660 }
25661 else
25662 expression = new_expression;
25663
25665 }
25666 }
25667
25668 if ((0 != expression) && (expression->node_depth() > settings_.max_node_depth_))
25669 {
25672 current_token(),
25673 "ERR018 - Expression depth of " + details::to_str(static_cast<int>(expression->node_depth())) +
25674 " exceeds maximum allowed expression depth of " + details::to_str(static_cast<int>(settings_.max_node_depth_)),
25676
25677 free_node(node_allocator_, expression);
25678
25679 return error_node();
25680 }
25681 else if (
25685 (
25686 current_token().type == token_t::e_symbol ||
25687 current_token().type == token_t::e_number ||
25689 )
25690 )
25691 {
25694 current_token(),
25695 "ERR019 - Invalid syntax '" + current_token().value + "' possible missing operator or context",
25697
25698 free_node(node_allocator_, expression);
25699
25700 return error_node();
25701 }
25702
25703 return expression;
25704 }
bool is_invalid_inequality_operation(const details::operator_type operation) const
Definition exprtk.hpp:25193
bool is_invalid_assignment_operation(const details::operator_type operation) const
Definition exprtk.hpp:25188
bool is_invalid_logic_operation(const details::operator_type operation) const
Definition exprtk.hpp:25178
bool is_invalid_arithmetic_operation(const details::operator_type operation) const
Definition exprtk.hpp:25183
void pop_current_state()
Definition exprtk.hpp:25359
void push_current_state(const state_t current_state)
Definition exprtk.hpp:25354
expression_node_ptr parse_branch(precedence_level precedence=e_level00)
Definition exprtk.hpp:31569
state_t current_state() const
Definition exprtk.hpp:25367
bool is_logic_opr(const std::string &lgc_opr)
Definition exprtk.hpp:575
precedence_level right
Definition exprtk.hpp:25349
void set(const precedence_level &l, const precedence_level &r, const details::operator_type &o, const token_t &tkn=token_t())
Definition exprtk.hpp:25330
precedence_level left
Definition exprtk.hpp:25348
details::operator_type operation
Definition exprtk.hpp:25350

References exprtk::parser< T >::settings_store::commutative_check_enabled(), 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::details::e_default, exprtk::lexer::token::e_div, exprtk::details::e_div, exprtk::lexer::token::e_divass, exprtk::details::e_divass, exprtk::lexer::token::e_eof, 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::lexer::token::e_number, 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_string, 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_logic_opr(), 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 27059 of file exprtk.hpp.

27060 {
27061 expression_node_ptr initialiser = error_node();
27062 expression_node_ptr condition = error_node();
27063 expression_node_ptr incrementor = error_node();
27064 expression_node_ptr loop_body = error_node();
27065
27066 scope_element* se = 0;
27067 bool result = true;
27068
27069 next_token();
27070
27071 scope_handler sh(*this);
27072
27074 {
27077 current_token(),
27078 "ERR077 - Expected '(' at start of for-loop",
27080
27081 return error_node();
27082 }
27083
27085 {
27086 if (
27087 !token_is(token_t::e_symbol,prsrhlpr_t::e_hold) &&
27088 details::imatch(current_token().value,"var")
27089 )
27090 {
27091 next_token();
27092
27093 if (!token_is(token_t::e_symbol,prsrhlpr_t::e_hold))
27094 {
27097 current_token(),
27098 "ERR078 - Expected a variable at the start of initialiser section of for-loop",
27100
27101 return error_node();
27102 }
27104 {
27107 current_token(),
27108 "ERR079 - Expected variable assignment of initialiser section of for-loop",
27110
27111 return error_node();
27112 }
27113
27114 const std::string loop_counter_symbol = current_token().value;
27115
27116 se = &sem_.get_element(loop_counter_symbol);
27117
27118 if ((se->name == loop_counter_symbol) && se->active)
27119 {
27122 current_token(),
27123 "ERR080 - For-loop variable '" + loop_counter_symbol+ "' is being shadowed by a previous declaration",
27125
27126 return error_node();
27127 }
27128 else if (!symtab_store_.is_variable(loop_counter_symbol))
27129 {
27130 if (
27131 !se->active &&
27132 (se->name == loop_counter_symbol) &&
27133 (se->type == scope_element::e_variable)
27134 )
27135 {
27136 se->active = true;
27137 se->ref_count++;
27138 }
27139 else
27140 {
27141 scope_element nse;
27142 nse.name = loop_counter_symbol;
27143 nse.active = true;
27144 nse.ref_count = 1;
27145 nse.type = scope_element::e_variable;
27146 nse.depth = state_.scope_depth;
27147 nse.data = new T(T(0));
27148 nse.var_node = node_allocator_.allocate<variable_node_t>(*reinterpret_cast<T*>(nse.data));
27149
27150 if (!sem_.add_element(nse))
27151 {
27154 current_token(),
27155 "ERR081 - Failed to add new local variable '" + loop_counter_symbol + "' to SEM",
27157
27158 sem_.free_element(nse);
27159
27160 result = false;
27161 }
27162 else
27163 {
27164 exprtk_debug(("parse_for_loop() - INFO - Added new local variable: %s\n", nse.name.c_str()));
27165
27166 state_.activate_side_effect("parse_for_loop()");
27167 }
27168 }
27169 }
27170 }
27171
27172 if (0 == (initialiser = parse_expression()))
27173 {
27176 current_token(),
27177 "ERR082 - Failed to parse initialiser of for-loop",
27179
27180 result = false;
27181 }
27182 else if (!token_is(token_t::e_eof))
27183 {
27186 current_token(),
27187 "ERR083 - Expected ';' after initialiser of for-loop",
27189
27190 result = false;
27191 }
27192 }
27193
27195 {
27196 if (0 == (condition = parse_expression()))
27197 {
27200 current_token(),
27201 "ERR084 - Failed to parse condition of for-loop",
27203
27204 result = false;
27205 }
27206 else if (!token_is(token_t::e_eof))
27207 {
27210 current_token(),
27211 "ERR085 - Expected ';' after condition section of for-loop",
27213
27214 result = false;
27215 }
27216 }
27217
27219 {
27220 if (0 == (incrementor = parse_expression()))
27221 {
27224 current_token(),
27225 "ERR086 - Failed to parse incrementor of for-loop",
27227
27228 result = false;
27229 }
27230 else if (!token_is(token_t::e_rbracket))
27231 {
27234 current_token(),
27235 "ERR087 - Expected ')' after incrementor section of for-loop",
27237
27238 result = false;
27239 }
27240 }
27241
27242 if (result)
27243 {
27244 brkcnt_list_.push_front(false);
27245
27246 scoped_inc_dec sid(state_.parsing_loop_stmt_count);
27247
27248 if (0 == (loop_body = parse_multi_sequence("for-loop", true)))
27249 {
27252 current_token(),
27253 "ERR088 - Failed to parse body of for-loop",
27255
27256 result = false;
27257 }
27258 }
27259
27260 if (!result)
27261 {
27262 if (se)
27263 {
27264 se->ref_count--;
27265 }
27266
27267 free_node(node_allocator_, initialiser);
27268 free_node(node_allocator_, condition );
27269 free_node(node_allocator_, incrementor);
27270 free_node(node_allocator_, loop_body );
27271 return error_node();
27272 }
27273
27274 expression_node_ptr result_node =
27275 expression_generator_.for_loop(initialiser,
27276 condition,
27277 incrementor,
27278 loop_body,
27279 brkcnt_list_.front());
27281
27282 if (result_node && result_node->valid())
27283 {
27284 return result_node;
27285 }
27286
27289 current_token(),
27290 "ERR089 - Failed to synthesize 'valid' for-loop",
27292
27293 free_node(node_allocator_, result_node);
27294
27295 return error_node();
27296 }
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:33035
void handle_brkcnt_scope_exit()
Definition exprtk.hpp:26796
bool is_variable(const std::string &variable_name) const
Definition exprtk.hpp:23524

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 26001 of file exprtk.hpp.

26002 {
26003 #ifdef _MSC_VER
26004 #pragma warning(push)
26005 #pragma warning(disable: 4127)
26006 #endif
26007 if (0 == NumberofParameters)
26008 {
26011 current_token(),
26012 "ERR023 - Expecting ifunction '" + function_name + "' to have non-zero parameter count",
26014
26015 return error_node();
26016 }
26017 #ifdef _MSC_VER
26018 #pragma warning(pop)
26019 #endif
26020
26021 expression_node_ptr branch[NumberofParameters];
26023
26024 std::fill_n(branch, NumberofParameters, reinterpret_cast<expression_node_ptr>(0));
26025
26026 scoped_delete<expression_node_t,NumberofParameters> sd((*this),branch);
26027
26028 next_token();
26029
26031 {
26034 current_token(),
26035 "ERR024 - Expecting argument list for function: '" + function_name + "'",
26037
26038 return error_node();
26039 }
26040
26041 for (int i = 0; i < static_cast<int>(NumberofParameters); ++i)
26042 {
26043 branch[i] = parse_expression();
26044
26045 if (0 == branch[i])
26046 {
26049 current_token(),
26050 "ERR025 - Failed to parse argument " + details::to_str(i) + " for function: '" + function_name + "'",
26052
26053 return error_node();
26054 }
26055 else if (i < static_cast<int>(NumberofParameters - 1))
26056 {
26058 {
26061 current_token(),
26062 "ERR026 - Invalid number of arguments for function: '" + function_name + "'",
26064
26065 return error_node();
26066 }
26067 }
26068 }
26069
26071 {
26074 current_token(),
26075 "ERR027 - Invalid number of arguments for function: '" + function_name + "'",
26077
26078 return error_node();
26079 }
26080 else
26081 result = expression_generator_.function(function,branch);
26082
26083 sd.delete_ptr = (0 == result);
26084
26085 return result;
26086 }
expression_node_ptr function(ifunction_t *f, expression_node_ptr(&b)[N])
Definition exprtk.hpp:33854

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 26088 of file exprtk.hpp.

26089 {
26091
26092 state_.side_effect_present = function->has_side_effects();
26093
26094 next_token();
26095
26096 if (
26099 )
26100 {
26103 current_token(),
26104 "ERR028 - Expecting '()' to proceed call to function: '" + function_name + "'",
26106
26107 free_node(node_allocator_, result);
26108
26109 return error_node();
26110 }
26111 else
26112 return result;
26113 }

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 25948 of file exprtk.hpp.

25949 {
25950 expression_node_ptr func_node = reinterpret_cast<expression_node_ptr>(0);
25951
25952 switch (function->param_count)
25953 {
25954 case 0 : func_node = parse_function_call_0 (function,function_name); break;
25955 case 1 : func_node = parse_function_call< 1>(function,function_name); break;
25956 case 2 : func_node = parse_function_call< 2>(function,function_name); break;
25957 case 3 : func_node = parse_function_call< 3>(function,function_name); break;
25958 case 4 : func_node = parse_function_call< 4>(function,function_name); break;
25959 case 5 : func_node = parse_function_call< 5>(function,function_name); break;
25960 case 6 : func_node = parse_function_call< 6>(function,function_name); break;
25961 case 7 : func_node = parse_function_call< 7>(function,function_name); break;
25962 case 8 : func_node = parse_function_call< 8>(function,function_name); break;
25963 case 9 : func_node = parse_function_call< 9>(function,function_name); break;
25964 case 10 : func_node = parse_function_call<10>(function,function_name); break;
25965 case 11 : func_node = parse_function_call<11>(function,function_name); break;
25966 case 12 : func_node = parse_function_call<12>(function,function_name); break;
25967 case 13 : func_node = parse_function_call<13>(function,function_name); break;
25968 case 14 : func_node = parse_function_call<14>(function,function_name); break;
25969 case 15 : func_node = parse_function_call<15>(function,function_name); break;
25970 case 16 : func_node = parse_function_call<16>(function,function_name); break;
25971 case 17 : func_node = parse_function_call<17>(function,function_name); break;
25972 case 18 : func_node = parse_function_call<18>(function,function_name); break;
25973 case 19 : func_node = parse_function_call<19>(function,function_name); break;
25974 case 20 : func_node = parse_function_call<20>(function,function_name); break;
25975 default : {
25978 current_token(),
25979 "ERR021 - Invalid number of parameters for function: '" + function_name + "'",
25981
25982 return error_node();
25983 }
25984 }
25985
25986 if (func_node)
25987 return func_node;
25988 else
25989 {
25992 current_token(),
25993 "ERR022 - Failed to generate call to function: '" + function_name + "'",
25995
25996 return error_node();
25997 }
25998 }
expression_node_ptr parse_function_call_0(ifunction< T > *function, const std::string &function_name)
Definition exprtk.hpp:26088

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 28844 of file exprtk.hpp.

28845 {
28846 std::vector<expression_node_ptr> arg_list;
28847
28848 scoped_vec_delete<expression_node_t> svd((*this), arg_list);
28849
28850 next_token();
28851
28852 std::string param_type_list;
28853
28854 type_checker tc(
28855 (*this),
28856 function_name,
28857 function->parameter_sequence,
28859
28860 if (tc.invalid())
28861 {
28864 current_token(),
28865 "ERR136 - Type checker instantiation failure for generic function: " + function_name,
28867
28868 return error_node();
28869 }
28870
28872 {
28874 {
28875 if (
28876 !function->allow_zero_parameters() &&
28877 !tc .allow_zero_parameters()
28878 )
28879 {
28882 current_token(),
28883 "ERR137 - Zero parameter call to generic function: "
28884 + function_name + " not allowed",
28886
28887 return error_node();
28888 }
28889 }
28890 else
28891 {
28892 for ( ; ; )
28893 {
28895
28896 if (0 == arg)
28897 return error_node();
28898
28899 if (is_ivector_node(arg))
28900 param_type_list += 'V';
28901 else if (is_generally_string_node(arg))
28902 param_type_list += 'S';
28903 else // Everything else is assumed to be a scalar returning expression
28904 param_type_list += 'T';
28905
28906 arg_list.push_back(arg);
28907
28909 break;
28910 else if (!token_is(token_t::e_comma))
28911 {
28914 current_token(),
28915 "ERR138 - Expected ',' for call to generic function: " + function_name,
28917
28918 return error_node();
28919 }
28920 }
28921 }
28922 }
28923 else if (
28924 !function->parameter_sequence.empty() &&
28925 function->allow_zero_parameters () &&
28926 !tc .allow_zero_parameters ()
28927 )
28928 {
28931 current_token(),
28932 "ERR139 - Zero parameter call to generic function: "
28933 + function_name + " not allowed",
28935
28936 return error_node();
28937 }
28938
28939 std::size_t param_seq_index = 0;
28940
28941 if (
28943 !tc.verify(param_type_list, param_seq_index)
28944 )
28945 {
28948 current_token(),
28949 "ERR140 - Invalid input parameter sequence for call to generic function: " + function_name,
28951
28952 return error_node();
28953 }
28954
28955 expression_node_ptr result =
28956 (tc.paramseq_count() <= 1) ?
28958 .generic_function_call(function, arg_list) :
28960 .generic_function_call(function, arg_list, param_seq_index);
28961
28962 svd.delete_ptr = (0 == result);
28963
28964 return result;
28965 }
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:33955

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 28967 of file exprtk.hpp.

28972 {
28974 {
28976 {
28977 if (
28978 !function->allow_zero_parameters() &&
28979 !tc .allow_zero_parameters()
28980 )
28981 {
28984 current_token(),
28985 "ERR141 - Zero parameter call to generic function: "
28986 + function_name + " not allowed",
28988
28989 return false;
28990 }
28991 }
28992 else
28993 {
28994 for ( ; ; )
28995 {
28997
28998 if (0 == arg)
28999 return false;
29000
29001 if (is_ivector_node(arg))
29002 param_type_list += 'V';
29003 else if (is_generally_string_node(arg))
29004 param_type_list += 'S';
29005 else // Everything else is a scalar returning expression
29006 param_type_list += 'T';
29007
29008 arg_list.push_back(arg);
29009
29011 break;
29012 else if (!token_is(token_t::e_comma))
29013 {
29016 current_token(),
29017 "ERR142 - Expected ',' for call to string function: " + function_name,
29019
29020 return false;
29021 }
29022 }
29023 }
29024
29025 return true;
29026 }
29027 else
29028 return false;
29029 }

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 27906 of file exprtk.hpp.

27908 {
27912
27913 if (!token_is(open_bracket))
27914 {
27915 if (!enforce_crlbrackets && token_is(token_t::e_lbracket))
27916 {
27917 open_bracket = token_t::e_lbracket;
27918 close_bracket = token_t::e_rbracket;
27919 separator = token_t::e_comma;
27920 }
27921 else
27922 {
27925 current_token(),
27926 "ERR111 - Expected '" + token_t::to_str(open_bracket) + "' for call to multi-sequence" +
27927 ((!source.empty()) ? std::string(" section of " + source): ""),
27929
27930 return error_node();
27931 }
27932 }
27933 else if (token_is(close_bracket))
27934 {
27936 }
27937
27938 std::vector<expression_node_ptr> arg_list;
27939 std::vector<bool> side_effect_list;
27940
27941 scoped_vec_delete<expression_node_t> svd((*this), arg_list);
27942
27943 scope_handler sh(*this);
27944
27945 scoped_bool_or_restorer sbr(state_.side_effect_present);
27946
27947 for ( ; ; )
27948 {
27950
27952
27953 if (0 == arg)
27954 return error_node();
27955 else
27956 {
27957 arg_list.push_back(arg);
27958 side_effect_list.push_back(state_.side_effect_present);
27959 }
27960
27961 if (token_is(close_bracket))
27962 break;
27963
27964 const bool is_next_close = peek_token_is(close_bracket);
27965
27966 if (!token_is(separator) && is_next_close)
27967 {
27970 current_token(),
27971 "ERR112 - Expected '" + lexer::token::seperator_to_str(separator) + "' for call to multi-sequence section of " + source,
27973
27974 return error_node();
27975 }
27976
27977 if (token_is(close_bracket))
27978 break;
27979 }
27980
27981 expression_node_ptr result = simplify(arg_list, side_effect_list, source.empty());
27982
27983 svd.delete_ptr = (0 == result);
27984 return result;
27985 }
static std::string seperator_to_str(const token_type t)
Definition exprtk.hpp:2428
static std::string to_str(const token_type t)
Definition exprtk.hpp:2381

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::lexer::token::seperator_to_str(), 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(), 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 27470 of file exprtk.hpp.

27471 {
27472 std::vector<expression_node_ptr> arg_list;
27473
27474 if (!details::imatch(current_token().value,"[*]"))
27475 {
27478 current_token(),
27479 "ERR098 - Expected token '[*]'",
27481
27482 return error_node();
27483 }
27484
27485 scoped_vec_delete<expression_node_t> svd((*this), arg_list);
27486
27487 next_token();
27488
27490 {
27493 current_token(),
27494 "ERR099 - Expected '{' for call to [*] statement",
27496
27497 return error_node();
27498 }
27499
27500 for ( ; ; )
27501 {
27502 if (!details::imatch("case",current_token().value))
27503 {
27506 current_token(),
27507 "ERR100 - Expected a 'case' statement for multi-switch",
27509
27510 return error_node();
27511 }
27512
27513 next_token();
27514
27516
27517 if (0 == condition)
27518 return error_node();
27519
27521 {
27524 current_token(),
27525 "ERR101 - Expected ':' for case of [*] statement",
27527
27528 return error_node();
27529 }
27530
27531 expression_node_ptr consequent =
27532 (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold)) ?
27533 parse_multi_sequence("multi-switch-consequent") :
27535
27536 if (0 == consequent)
27537 return error_node();
27538
27540 {
27543 current_token(),
27544 "ERR102 - Expected ';' at end of case for [*] statement",
27546
27547 return error_node();
27548 }
27549
27550 // Can we optimise away the case statement?
27551 if (is_constant_node(condition) && is_false(condition))
27552 {
27553 free_node(node_allocator_, condition );
27554 free_node(node_allocator_, consequent);
27555 }
27556 else
27557 {
27558 arg_list.push_back(condition );
27559 arg_list.push_back(consequent);
27560 }
27561
27562 if (token_is(token_t::e_rcrlbracket,prsrhlpr_t::e_hold))
27563 {
27564 break;
27565 }
27566 }
27567
27569 {
27572 current_token(),
27573 "ERR103 - Expected '}' at end of [*] statement",
27575
27576 return error_node();
27577 }
27578
27580
27581 svd.delete_ptr = (0 == result);
27582
27583 return result;
27584 }
expression_node_ptr multi_switch_statement(Sequence< expression_node_ptr, Allocator > &arg_list)
Definition exprtk.hpp:33344
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 26780 of file exprtk.hpp.

26781 {
26782 if (settings_.logic_disabled("not"))
26783 {
26786 current_token(),
26787 "ERR063 - Invalid or disabled logic operation 'not'",
26789
26790 return error_node();
26791 }
26792
26793 return parse_base_operation();
26794 }
expression_node_ptr parse_base_operation()
Definition exprtk.hpp:26188

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 29266 of file exprtk.hpp.

29267 {
29268 next_token();
29270 }

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 29082 of file exprtk.hpp.

29083 {
29084 // Move pass the function name
29085 next_token();
29086
29087 std::string param_type_list;
29088
29089 type_checker tc((*this), function_name, function->parameter_sequence, type_checker::e_overload);
29090
29091 if (
29092 (!function->parameter_sequence.empty()) &&
29093 (0 == tc.paramseq_count())
29094 )
29095 {
29096 return error_node();
29097 }
29098
29099 std::vector<expression_node_ptr> arg_list;
29100 scoped_vec_delete<expression_node_t> svd((*this), arg_list);
29101
29102 if (!parse_igeneric_function_params(param_type_list, arg_list, function_name, function, tc))
29103 {
29104 return error_node();
29105 }
29106
29107 std::size_t param_seq_index = 0;
29108
29109 if (!tc.verify(param_type_list, param_seq_index))
29110 {
29113 current_token(),
29114 "ERR144 - Invalid input parameter sequence for call to overloaded function: " + function_name,
29116
29117 return error_node();
29118 }
29119
29121
29122 if (type_checker::e_numeric == tc.return_type(param_seq_index))
29123 {
29124 if (tc.paramseq_count() <= 1)
29125 result = expression_generator_
29126 .generic_function_call(function, arg_list);
29127 else
29128 result = expression_generator_
29129 .generic_function_call(function, arg_list, param_seq_index);
29130 }
29131 else if (type_checker::e_string == tc.return_type(param_seq_index))
29132 {
29133 if (tc.paramseq_count() <= 1)
29134 result = expression_generator_
29135 .string_function_call(function, arg_list);
29136 else
29137 result = expression_generator_
29138 .string_function_call(function, arg_list, param_seq_index);
29139 }
29140 else
29141 {
29144 current_token(),
29145 "ERR145 - Invalid return type for call to overloaded function: " + function_name,
29147 }
29148
29149 svd.delete_ptr = (0 == result);
29150 return result;
29151 }
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:34030
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:28967

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 27745 of file exprtk.hpp.

27746 {
27747 // Allow no more than 100 range calls, eg: s[][][]...[][]
27748 const std::size_t max_rangesize_parses = 100;
27749
27750 std::size_t i = 0;
27751
27752 while
27753 (
27754 (0 != expression) &&
27755 (i++ < max_rangesize_parses) &&
27756 error_list_.empty() &&
27757 is_generally_string_node(expression) &&
27758 token_is(token_t::e_lsqrbracket,prsrhlpr_t::e_hold)
27759 )
27760 {
27761 expression = parse_string_range_statement(expression);
27762 }
27763
27764 return (i > 1);
27765 }
expression_node_ptr parse_string_range_statement(expression_node_ptr &expression)
Definition exprtk.hpp:27679

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 27767 of file exprtk.hpp.

27768 {
27769 if
27770 (
27771 (0 != expression) &&
27772 error_list_.empty() &&
27773 is_ivector_node(expression)
27774 )
27775 {
27776 if (
27778 token_is(token_t::e_mul,prsrhlpr_t::e_hold) &&
27780 )
27781 {
27784 }
27785 else if (token_is(token_t::e_lsqrbracket,prsrhlpr_t::e_hold))
27786 {
27788 }
27789 else if (
27790 token_is(token_t::e_rbracket,prsrhlpr_t::e_hold) &&
27792 )
27793 {
27796 }
27797 else
27798 return;
27799
27800 details::vector_interface<T>* vi = dynamic_cast<details::vector_interface<T>*>(expression);
27801
27802 if (vi)
27803 {
27804 details::vector_holder<T>& vec = vi->vec()->vec_holder();
27805 const std::string vector_name = sem_.get_vector_name(vec.data());
27806 expression_node_ptr index = parse_vector_index(vector_name);
27807
27808 if (index)
27809 {
27810 expression = synthesize_vector_element(vector_name, &vec, expression, index);
27811 return;
27812 }
27813 }
27814
27815 free_node(node_allocator_, expression);
27816 expression = error_node();
27817 }
27818 }
std::string get_vector_name(const T *data)
Definition exprtk.hpp:22873
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:28458
expression_node_ptr parse_vector_index(const std::string &vector_name="")
Definition exprtk.hpp:28356

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 27987 of file exprtk.hpp.

27988 {
27989 // Examples of valid ranges:
27990 // 1. [1:5] -> [1,5)
27991 // 2. [ :5] -> [0,5)
27992 // 3. [1: ] -> [1,end)
27993 // 4. [x:y] -> [x,y) where x <= y
27994 // 5. [x+1:y/2] -> [x+1,y/2) where x+1 <= y/2
27995 // 6. [ :y] -> [0,y) where 0 <= y
27996 // 7. [x: ] -> [x,end) where x <= end
27997
27998 rp.clear();
27999
28000 if (!skip_lsqr && !token_is(token_t::e_lsqrbracket))
28001 {
28004 current_token(),
28005 "ERR113 - Expected '[' for start of range",
28007
28008 return false;
28009 }
28010
28012 {
28013 rp.n0_c.first = true;
28014 rp.n0_c.second = 0;
28015 rp.cache.first = 0;
28016 }
28017 else
28018 {
28020
28021 if (0 == r0)
28022 {
28025 current_token(),
28026 "ERR114 - Failed parse begin section of range",
28028
28029 return false;
28030 }
28031 else if (is_constant_node(r0))
28032 {
28033 const T r0_value = r0->value();
28034
28035 if (r0_value >= T(0))
28036 {
28037 rp.n0_c.first = true;
28038 rp.n0_c.second = static_cast<std::size_t>(details::numeric::to_int64(r0_value));
28039 rp.cache.first = rp.n0_c.second;
28040 }
28041
28043
28044 if (r0_value < T(0))
28045 {
28048 current_token(),
28049 "ERR115 - Range lower bound less than zero! Constraint: r0 >= 0",
28051
28052 return false;
28053 }
28054 }
28055 else
28056 {
28057 rp.n0_e.first = true;
28058 rp.n0_e.second = r0;
28059 }
28060
28062 {
28065 current_token(),
28066 "ERR116 - Expected ':' for break in range",
28068
28069 rp.free();
28070
28071 return false;
28072 }
28073 }
28074
28076 {
28077 rp.n1_c.first = true;
28078 rp.n1_c.second = std::numeric_limits<std::size_t>::max();
28079 }
28080 else
28081 {
28083
28084 if (0 == r1)
28085 {
28088 current_token(),
28089 "ERR117 - Failed parse end section of range",
28091
28092 rp.free();
28093
28094 return false;
28095 }
28096 else if (is_constant_node(r1))
28097 {
28098 const T r1_value = r1->value();
28099
28100 if (r1_value >= T(0))
28101 {
28102 rp.n1_c.first = true;
28103 rp.n1_c.second = static_cast<std::size_t>(details::numeric::to_int64(r1_value));
28104 rp.cache.second = rp.n1_c.second;
28105 }
28106
28108
28109 if (r1_value < T(0))
28110 {
28113 current_token(),
28114 "ERR118 - Range upper bound less than zero! Constraint: r1 >= 0",
28116
28117 rp.free();
28118
28119 return false;
28120 }
28121 }
28122 else
28123 {
28124 rp.n1_e.first = true;
28125 rp.n1_e.second = r1;
28126 }
28127
28129 {
28132 current_token(),
28133 "ERR119 - Expected ']' for start of range",
28135
28136 rp.free();
28137
28138 return false;
28139 }
28140 }
28141
28142 if (rp.const_range())
28143 {
28144 std::size_t r0 = 0;
28145 std::size_t r1 = 0;
28146
28147 bool rp_result = false;
28148
28149 try
28150 {
28151 rp_result = rp(r0, r1);
28152 }
28153 catch (std::runtime_error&)
28154 {}
28155
28156 if (!rp_result || (r0 > r1))
28157 {
28160 current_token(),
28161 "ERR120 - Invalid range, Constraint: r0 <= r1",
28163
28164 return false;
28165 }
28166 }
28167
28168 return true;
28169 }
_int64_t to_int64(const T v)
Definition exprtk.hpp:1512

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 26899 of file exprtk.hpp.

26900 {
26901 // Parse: [repeat][{][expression][}][until][(][test expr][)]
26902 expression_node_ptr condition = error_node();
26904 next_token();
26905
26906 std::vector<expression_node_ptr> arg_list;
26907 std::vector<bool> side_effect_list;
26908
26909 scoped_vec_delete<expression_node_t> svd((*this), arg_list);
26910
26911 brkcnt_list_.push_front(false);
26912
26913 if (details::imatch(current_token().value,"until"))
26914 {
26915 next_token();
26917 }
26918 else
26919 {
26920 const token_t::token_type separator = token_t::e_eof;
26921
26922 scope_handler sh(*this);
26923
26924 scoped_bool_or_restorer sbr(state_.side_effect_present);
26925
26926 scoped_inc_dec sid(state_.parsing_loop_stmt_count);
26927
26928 for ( ; ; )
26929 {
26931
26933
26934 if (0 == arg)
26935 return error_node();
26936 else
26937 {
26938 arg_list.push_back(arg);
26939 side_effect_list.push_back(state_.side_effect_present);
26940 }
26941
26942 if (details::imatch(current_token().value,"until"))
26943 {
26944 next_token();
26945 break;
26946 }
26947
26948 const bool is_next_until = peek_token_is(token_t::e_symbol) &&
26949 peek_token_is("until");
26950
26951 if (!token_is(separator) && is_next_until)
26952 {
26955 current_token(),
26956 "ERR070 - Expected '" + token_t::to_str(separator) + "' in body of repeat until loop",
26958
26959 return error_node();
26960 }
26961
26962 if (details::imatch(current_token().value,"until"))
26963 {
26964 next_token();
26965 break;
26966 }
26967 }
26968
26969 branch = simplify(arg_list,side_effect_list);
26970
26971 svd.delete_ptr = (0 == branch);
26972
26973 if (svd.delete_ptr)
26974 {
26977 current_token(),
26978 "ERR071 - Failed to parse body of repeat until loop",
26980
26981 return error_node();
26982 }
26983 }
26984
26986 {
26989 current_token(),
26990 "ERR072 - Expected '(' before condition statement of repeat until loop",
26992
26993 free_node(node_allocator_, branch);
26994 return error_node();
26995 }
26996 else if (0 == (condition = parse_expression()))
26997 {
27000 current_token(),
27001 "ERR073 - Failed to parse condition for repeat until loop",
27003
27004 free_node(node_allocator_, branch);
27005 return error_node();
27006 }
27007 else if (!token_is(token_t::e_rbracket))
27008 {
27011 current_token(),
27012 "ERR074 - Expected ')' after condition of repeat until loop",
27014
27015 free_node(node_allocator_, branch );
27016 free_node(node_allocator_, condition);
27017
27018 return error_node();
27019 }
27020
27021 expression_node_ptr result_node =
27024 condition,
27025 branch,
27026 brkcnt_list_.front());
27027
27028 if (0 == result_node)
27029 {
27032 current_token(),
27033 "ERR075 - Failed to synthesize repeat until loop",
27035
27036 free_node(node_allocator_, condition);
27037
27038 return error_node();
27039 }
27040
27042
27043 if (result_node && result_node->valid())
27044 {
27045 return result_node;
27046 }
27047
27050 current_token(),
27051 "ERR076 - Failed to synthesize 'valid' repeat until loop",
27053
27054 free_node(node_allocator_, result_node);
27055
27056 return error_node();
27057 }
expression_node_ptr repeat_until_loop(expression_node_ptr &condition, expression_node_ptr &branch, const bool break_continue_present=false) const
Definition exprtk.hpp:32981

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 30672 of file exprtk.hpp.

30673 {
30675 {
30678 current_token(),
30679 "ERR214 - Return call within a return call is not allowed",
30681
30682 return error_node();
30683 }
30684
30685 scoped_bool_negator sbn(state_.parsing_return_stmt);
30686
30687 std::vector<expression_node_ptr> arg_list;
30688
30689 scoped_vec_delete<expression_node_t> svd((*this), arg_list);
30690
30691 if (!details::imatch(current_token().value,"return"))
30692 {
30693 return error_node();
30694 }
30695 else
30696 next_token();
30697
30699 {
30702 current_token(),
30703 "ERR215 - Expected '[' at start of return statement",
30705
30706 return error_node();
30707 }
30709 {
30710 for ( ; ; )
30711 {
30713
30714 if (0 == arg)
30715 return error_node();
30716
30717 arg_list.push_back(arg);
30718
30720 break;
30721 else if (!token_is(token_t::e_comma))
30722 {
30725 current_token(),
30726 "ERR216 - Expected ',' between values during call to return",
30728
30729 return error_node();
30730 }
30731 }
30732 }
30734 {
30737 current_token(),
30738 "ERR217 - Zero parameter return statement not allowed",
30740
30741 return error_node();
30742 }
30743
30744 const lexer::token prev_token = current_token();
30745
30747 {
30748 if (!arg_list.empty())
30749 {
30752 prev_token,
30753 "ERR218 - Invalid ']' found during return call",
30755
30756 return error_node();
30757 }
30758 }
30759
30760 std::string ret_param_type_list;
30761
30762 for (std::size_t i = 0; i < arg_list.size(); ++i)
30763 {
30764 if (0 == arg_list[i])
30765 return error_node();
30766 else if (is_ivector_node(arg_list[i]))
30767 ret_param_type_list += 'V';
30768 else if (is_generally_string_node(arg_list[i]))
30769 ret_param_type_list += 'S';
30770 else
30771 ret_param_type_list += 'T';
30772 }
30773
30774 dec_.retparam_list_.push_back(ret_param_type_list);
30775
30777
30778 svd.delete_ptr = (0 == result);
30779
30781
30782 state_.activate_side_effect("parse_return_statement()");
30783
30784 return result;
30785 }
expression_node_ptr return_call(std::vector< expression_node_ptr > &arg_list)
Definition exprtk.hpp:34105

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 29221 of file exprtk.hpp.

29222 {
29223 const std::string sf_name = current_token().value;
29224
29225 // Expect: $fDD(expr0,expr1,expr2) or $fDD(expr0,expr1,expr2,expr3)
29226 if (
29227 !details::is_digit(sf_name[2]) ||
29228 !details::is_digit(sf_name[3])
29229 )
29230 {
29233 current_token(),
29234 "ERR149 - Invalid special function[1]: " + sf_name,
29236
29237 return error_node();
29238 }
29239
29240 const int id = (sf_name[2] - '0') * 10 +
29241 (sf_name[3] - '0');
29242
29243 if (id >= details::e_sffinal)
29244 {
29247 current_token(),
29248 "ERR150 - Invalid special function[2]: " + sf_name,
29250
29251 return error_node();
29252 }
29253
29254 const int sf_3_to_4 = details::e_sf48;
29255 const details::operator_type opt_type = details::operator_type(id + 1000);
29256 const std::size_t NumberOfParameters = (id < (sf_3_to_4 - 1000)) ? 3U : 4U;
29257
29258 switch (NumberOfParameters)
29259 {
29260 case 3 : return parse_special_function_impl<T,3>::process((*this), opt_type, sf_name);
29261 case 4 : return parse_special_function_impl<T,4>::process((*this), opt_type, sf_name);
29262 default : return error_node();
29263 }
29264 }
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:29157

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 28178 of file exprtk.hpp.

28179 {
28180 const std::string symbol = current_token().value;
28181
28182 typedef details::stringvar_node<T>* strvar_node_t;
28183
28185 strvar_node_t const_str_node = static_cast<strvar_node_t>(0);
28186
28187 scope_element& se = sem_.get_active_element(symbol);
28188
28189 if (scope_element::e_string == se.type)
28190 {
28191 se.active = true;
28192 result = se.str_node;
28194 }
28195 else
28196 {
28197 typedef typename symtab_store::string_context str_ctxt_t;
28198 str_ctxt_t str_ctx = symtab_store_.get_string_context(symbol);
28199
28200 if ((0 == str_ctx.str_var) || !symtab_store_.is_conststr_stringvar(symbol))
28201 {
28204 current_token(),
28205 "ERR121 - Unknown string symbol",
28207
28208 return error_node();
28209 }
28210
28211 assert(str_ctx.str_var != 0);
28212 assert(str_ctx.symbol_table != 0);
28213
28214 result = str_ctx.str_var;
28215
28217 {
28218 const_str_node = static_cast<strvar_node_t>(result);
28219 result = expression_generator_(const_str_node->str());
28220 }
28221 else if (symbol_table_t::e_immutable == str_ctx.symbol_table->mutability())
28222 {
28224 current_token(),
28225 make_memory_range(str_ctx.str_var->base(), str_ctx.str_var->size()));
28226 }
28227
28228 lodge_symbol(symbol, e_st_string);
28229 }
28230
28232 {
28233 next_token();
28234
28236 {
28237 next_token();
28238 next_token();
28239
28240 if (const_str_node)
28241 {
28242 free_node(node_allocator_, result);
28243
28244 return expression_generator_(T(const_str_node->size()));
28245 }
28246 else
28248 (static_cast<details::stringvar_node<T>*>(result)->ref());
28249 }
28250
28251 range_t rp;
28252
28253 if (!parse_range(rp))
28254 {
28255 free_node(node_allocator_, result);
28256
28257 return error_node();
28258 }
28259 else if (const_str_node)
28260 {
28261 free_node(node_allocator_, result);
28262 result = expression_generator_(const_str_node->ref(),rp);
28263 }
28264 else
28266 (result)->ref(), rp);
28267
28268 if (result)
28269 rp.clear();
28270 }
28271 else
28272 next_token();
28273
28274 return result;
28275 }
void lodge_immutable_symbol(const lexer::token &token, const interval_t interval)
Definition exprtk.hpp:31082
interval_t make_memory_range(const T &t)
Definition exprtk.hpp:31065
bool is_conststr_stringvar(const std::string &symbol_name) const
Definition exprtk.hpp:23557
string_context get_string_context(const std::string &string_name) const
Definition exprtk.hpp:23262
bool is_constant_string(const std::string &symbol_name) const
Definition exprtk.hpp:23487

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 29032 of file exprtk.hpp.

29033 {
29034 // Move pass the function name
29035 next_token();
29036
29037 std::string param_type_list;
29038
29039 type_checker tc((*this), function_name, function->parameter_sequence, type_checker::e_string);
29040
29041 if (
29042 (!function->parameter_sequence.empty()) &&
29043 (0 == tc.paramseq_count())
29044 )
29045 {
29046 return error_node();
29047 }
29048
29049 std::vector<expression_node_ptr> arg_list;
29050 scoped_vec_delete<expression_node_t> svd((*this), arg_list);
29051
29052 if (!parse_igeneric_function_params(param_type_list, arg_list, function_name, function, tc))
29053 {
29054 return error_node();
29055 }
29056
29057 std::size_t param_seq_index = 0;
29058
29059 if (!tc.verify(param_type_list, param_seq_index))
29060 {
29063 current_token(),
29064 "ERR143 - Invalid input parameter sequence for call to string function: " + function_name,
29066
29067 return error_node();
29068 }
29069
29070 expression_node_ptr result =
29071 (tc.paramseq_count() <= 1) ?
29073 .string_function_call(function, arg_list) :
29075 .string_function_call(function, arg_list, param_seq_index);
29076
29077 svd.delete_ptr = (0 == result);
29078
29079 return result;
29080 }

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 27679 of file exprtk.hpp.

27680 {
27682 {
27685 current_token(),
27686 "ERR108 - Expected '[' as start of string range definition",
27688
27689 free_node(node_allocator_, expression);
27690
27691 return error_node();
27692 }
27694 {
27696 }
27697
27698 range_t rp;
27699
27700 if (!parse_range(rp,true))
27701 {
27702 free_node(node_allocator_, expression);
27703
27704 return error_node();
27705 }
27706
27707 expression_node_ptr result = expression_generator_(expression,rp);
27708
27709 if (0 == result)
27710 {
27713 current_token(),
27714 "ERR109 - Failed to generate string range node",
27716
27717 free_node(node_allocator_, expression);
27718 rp.free();
27719 }
27720
27721 rp.clear();
27722
27723 if (result && result->valid())
27724 {
27725 return result;
27726 }
27727
27730 current_token(),
27731 "ERR110 - Failed to synthesize node: string_range_node",
27733
27734 free_node(node_allocator_, result);
27735 rp.free();
27736 return error_node();
27737 }

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 30438 of file exprtk.hpp.

30439 {
30440 if (!details::imatch(current_token().value,"swap"))
30441 {
30442 return error_node();
30443 }
30444 else
30445 next_token();
30446
30448 {
30451 current_token(),
30452 "ERR205 - Expected '(' at start of swap statement",
30454
30455 return error_node();
30456 }
30457
30458 expression_node_ptr variable0 = error_node();
30459 expression_node_ptr variable1 = error_node();
30460
30461 bool variable0_generated = false;
30462 bool variable1_generated = false;
30463
30464 const std::string var0_name = current_token().value;
30465
30466 if (!token_is(token_t::e_symbol,prsrhlpr_t::e_hold))
30467 {
30470 current_token(),
30471 "ERR206 - Expected a symbol for variable or vector element definition",
30473
30474 return error_node();
30475 }
30477 {
30478 if (0 == (variable0 = parse_vector()))
30479 {
30482 current_token(),
30483 "ERR207 - First parameter to swap is an invalid vector element: '" + var0_name + "'",
30485
30486 return error_node();
30487 }
30488
30489 variable0_generated = true;
30490 }
30491 else
30492 {
30493 if (symtab_store_.is_variable(var0_name))
30494 {
30495 variable0 = symtab_store_.get_variable(var0_name);
30496 }
30497
30498 const scope_element& se = sem_.get_element(var0_name);
30499
30500 if (
30501 (se.active) &&
30502 (se.name == var0_name) &&
30503 (scope_element::e_variable == se.type)
30504 )
30505 {
30506 variable0 = se.var_node;
30507 }
30508
30509 lodge_symbol(var0_name, e_st_variable);
30510
30511 if (0 == variable0)
30512 {
30515 current_token(),
30516 "ERR208 - First parameter to swap is an invalid variable: '" + var0_name + "'",
30518
30519 return error_node();
30520 }
30521 else
30522 next_token();
30523 }
30524
30526 {
30529 current_token(),
30530 "ERR209 - Expected ',' between parameters to swap",
30532
30533 if (variable0_generated)
30534 {
30535 free_node(node_allocator_, variable0);
30536 }
30537
30538 return error_node();
30539 }
30540
30541 const std::string var1_name = current_token().value;
30542
30543 if (!token_is(token_t::e_symbol,prsrhlpr_t::e_hold))
30544 {
30547 current_token(),
30548 "ERR210 - Expected a symbol for variable or vector element definition",
30550
30551 if (variable0_generated)
30552 {
30553 free_node(node_allocator_, variable0);
30554 }
30555
30556 return error_node();
30557 }
30559 {
30560 if (0 == (variable1 = parse_vector()))
30561 {
30564 current_token(),
30565 "ERR211 - Second parameter to swap is an invalid vector element: '" + var1_name + "'",
30567
30568 if (variable0_generated)
30569 {
30570 free_node(node_allocator_, variable0);
30571 }
30572
30573 return error_node();
30574 }
30575
30576 variable1_generated = true;
30577 }
30578 else
30579 {
30580 if (symtab_store_.is_variable(var1_name))
30581 {
30582 variable1 = symtab_store_.get_variable(var1_name);
30583 }
30584
30585 const scope_element& se = sem_.get_element(var1_name);
30586
30587 if (
30588 (se.active) &&
30589 (se.name == var1_name) &&
30590 (scope_element::e_variable == se.type)
30591 )
30592 {
30593 variable1 = se.var_node;
30594 }
30595
30596 lodge_symbol(var1_name, e_st_variable);
30597
30598 if (0 == variable1)
30599 {
30602 current_token(),
30603 "ERR212 - Second parameter to swap is an invalid variable: '" + var1_name + "'",
30605
30606 if (variable0_generated)
30607 {
30608 free_node(node_allocator_, variable0);
30609 }
30610
30611 return error_node();
30612 }
30613 else
30614 next_token();
30615 }
30616
30618 {
30621 current_token(),
30622 "ERR213 - Expected ')' at end of swap statement",
30624
30625 if (variable0_generated)
30626 {
30627 free_node(node_allocator_, variable0);
30628 }
30629
30630 if (variable1_generated)
30631 {
30632 free_node(node_allocator_, variable1);
30633 }
30634
30635 return error_node();
30636 }
30637
30638 typedef details::variable_node<T>* variable_node_ptr;
30639
30640 variable_node_ptr v0 = variable_node_ptr(0);
30641 variable_node_ptr v1 = variable_node_ptr(0);
30642
30644
30645 if (
30646 (0 != (v0 = dynamic_cast<variable_node_ptr>(variable0))) &&
30647 (0 != (v1 = dynamic_cast<variable_node_ptr>(variable1)))
30648 )
30649 {
30651
30652 if (variable0_generated)
30653 {
30654 free_node(node_allocator_, variable0);
30655 }
30656
30657 if (variable1_generated)
30658 {
30659 free_node(node_allocator_, variable1);
30660 }
30661 }
30662 else
30664 (variable0, variable1);
30665
30666 state_.activate_side_effect("parse_swap_statement()");
30667
30668 return result;
30669 }
expression_node_ptr parse_vector()
Definition exprtk.hpp:28386
expression_node_ptr var_node
Definition exprtk.hpp:22654
variable_ptr get_variable(const std::string &variable_name) const
Definition exprtk.hpp:23222

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 27298 of file exprtk.hpp.

27299 {
27300 std::vector<expression_node_ptr> arg_list;
27301
27302 if (!details::imatch(current_token().value,"switch"))
27303 {
27306 current_token(),
27307 "ERR090 - Expected keyword 'switch'",
27309
27310 return error_node();
27311 }
27312
27313 scoped_vec_delete<expression_node_t> svd((*this), arg_list);
27314
27315 next_token();
27316
27318 {
27321 current_token(),
27322 "ERR091 - Expected '{' for call to switch statement",
27324
27325 return error_node();
27326 }
27327
27328 expression_node_ptr default_statement = error_node();
27329
27330 scoped_expression_delete defstmt_delete((*this), default_statement);
27331
27332 for ( ; ; )
27333 {
27334 if (details::imatch("case",current_token().value))
27335 {
27336 next_token();
27337
27339
27340 if (0 == condition)
27341 return error_node();
27342 else if (!token_is(token_t::e_colon))
27343 {
27346 current_token(),
27347 "ERR092 - Expected ':' for case of switch statement",
27349
27350 free_node(node_allocator_, condition);
27351
27352 return error_node();
27353 }
27354
27355 expression_node_ptr consequent =
27356 (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold)) ?
27357 parse_multi_sequence("switch-consequent") :
27359
27360 if (0 == consequent)
27361 {
27362 free_node(node_allocator_, condition);
27363
27364 return error_node();
27365 }
27366 else if (!token_is(token_t::e_eof))
27367 {
27370 current_token(),
27371 "ERR093 - Expected ';' at end of case for switch statement",
27373
27374 free_node(node_allocator_, condition );
27375 free_node(node_allocator_, consequent);
27376
27377 return error_node();
27378 }
27379
27380 // Can we optimise away the case statement?
27381 if (is_constant_node(condition) && is_false(condition))
27382 {
27383 free_node(node_allocator_, condition );
27384 free_node(node_allocator_, consequent);
27385 }
27386 else
27387 {
27388 arg_list.push_back(condition );
27389 arg_list.push_back(consequent);
27390 }
27391
27392 }
27393 else if (details::imatch("default",current_token().value))
27394 {
27395 if (0 != default_statement)
27396 {
27399 current_token(),
27400 "ERR094 - Multiple default cases for switch statement",
27402
27403 return error_node();
27404 }
27405
27406 next_token();
27407
27409 {
27412 current_token(),
27413 "ERR095 - Expected ':' for default of switch statement",
27415
27416 return error_node();
27417 }
27418
27419 default_statement =
27420 (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold)) ?
27421 parse_multi_sequence("switch-default"):
27423
27424 if (0 == default_statement)
27425 return error_node();
27426 else if (!token_is(token_t::e_eof))
27427 {
27430 current_token(),
27431 "ERR096 - Expected ';' at end of default for switch statement",
27433
27434 return error_node();
27435 }
27436 }
27438 break;
27439 else
27440 {
27443 current_token(),
27444 "ERR097 - Expected '}' at end of switch statement",
27446
27447 return error_node();
27448 }
27449 }
27450
27451 const bool default_statement_present = (0 != default_statement);
27452
27453 if (default_statement_present)
27454 {
27455 arg_list.push_back(default_statement);
27456 }
27457 else
27458 {
27459 arg_list.push_back(node_allocator_.allocate_c<literal_node_t>(std::numeric_limits<T>::quiet_NaN()));
27460 }
27461
27462 expression_node_ptr result = expression_generator_.switch_statement(arg_list, (0 != default_statement));
27463
27464 svd.delete_ptr = (0 == result);
27465 defstmt_delete.delete_ptr = (0 == result);
27466
27467 return result;
27468 }
expression_node< typename node_type::value_type > * allocate_c(const T1 &t1) const
Definition exprtk.hpp:19334
expression_node_ptr switch_statement(Sequence< expression_node_ptr, Allocator > &arg_list, const bool default_statement_present)
Definition exprtk.hpp:33305

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 31443 of file exprtk.hpp.

31444 {
31445 static const std::string symbol_if = "if" ;
31446 static const std::string symbol_while = "while" ;
31447 static const std::string symbol_repeat = "repeat" ;
31448 static const std::string symbol_for = "for" ;
31449 static const std::string symbol_switch = "switch" ;
31450 static const std::string symbol_null = "null" ;
31451 static const std::string symbol_break = "break" ;
31452 static const std::string symbol_continue = "continue";
31453 static const std::string symbol_var = "var" ;
31454 static const std::string symbol_const = "const" ;
31455 static const std::string symbol_swap = "swap" ;
31456 static const std::string symbol_return = "return" ;
31457 static const std::string symbol_not = "not" ;
31458 static const std::string symbol_assert = "assert" ;
31459
31460 const std::string symbol = current_token().value;
31461
31462 if (valid_vararg_operation(symbol))
31463 {
31464 return parse_vararg_function();
31465 }
31466 else if (details::imatch(symbol, symbol_not))
31467 {
31468 return parse_not_statement();
31469 }
31470 else if (valid_base_operation(symbol))
31471 {
31472 return parse_base_operation();
31473 }
31474 else if (
31475 details::imatch(symbol, symbol_if) &&
31477 )
31478 {
31480 }
31481 else if (
31482 details::imatch(symbol, symbol_while) &&
31484 )
31485 {
31487 }
31488 else if (
31489 details::imatch(symbol, symbol_repeat) &&
31491 )
31492 {
31494 }
31495 else if (
31496 details::imatch(symbol, symbol_for) &&
31498 )
31499 {
31501 }
31502 else if (
31503 details::imatch(symbol, symbol_switch) &&
31505 )
31506 {
31508 }
31509 else if (details::is_valid_sf_symbol(symbol))
31510 {
31511 return parse_special_function();
31512 }
31513 else if (details::imatch(symbol, symbol_null))
31514 {
31515 return parse_null_statement();
31516 }
31517 #ifndef exprtk_disable_break_continue
31518 else if (details::imatch(symbol, symbol_break))
31519 {
31520 return parse_break_statement();
31521 }
31522 else if (details::imatch(symbol, symbol_continue))
31523 {
31524 return parse_continue_statement();
31525 }
31526 #endif
31527 else if (details::imatch(symbol, symbol_var))
31528 {
31530 }
31531 else if (details::imatch(symbol, symbol_const))
31532 {
31534 }
31535 else if (details::imatch(symbol, symbol_swap))
31536 {
31537 return parse_swap_statement();
31538 }
31539 #ifndef exprtk_disable_return_statement
31540 else if (
31541 details::imatch(symbol, symbol_return) &&
31543 )
31544 {
31546 }
31547 #endif
31548 else if (details::imatch(symbol, symbol_assert))
31549 {
31550 return parse_assert_statement();
31551 }
31552 else if (symtab_store_.valid() || !sem_.empty())
31553 {
31554 return parse_symtab_symbol();
31555 }
31556 else
31557 {
31560 current_token(),
31561 "ERR241 - Unknown variable or function encountered. Symbol table(s) "
31562 "is either invalid or does not contain symbol: '" + symbol + "'",
31564
31565 return error_node();
31566 }
31567 }
bool control_struct_enabled(const std::string &control_struct) const
Definition exprtk.hpp:24198
expression_node_ptr parse_swap_statement()
Definition exprtk.hpp:30438
expression_node_ptr parse_for_loop()
Definition exprtk.hpp:27059
expression_node_ptr parse_special_function()
Definition exprtk.hpp:29221
bool valid_vararg_operation(const std::string &symbol) const
Definition exprtk.hpp:25151
bool valid_base_operation(const std::string &symbol) const
Definition exprtk.hpp:25137
expression_node_ptr parse_continue_statement()
Definition exprtk.hpp:29348
expression_node_ptr parse_switch_statement()
Definition exprtk.hpp:27298
expression_node_ptr check_block_statement_closure(expression_node_ptr expression)
Definition exprtk.hpp:31419
expression_node_ptr parse_while_loop()
Definition exprtk.hpp:26802
expression_node_ptr parse_define_var_statement()
Definition exprtk.hpp:29938
expression_node_ptr parse_vararg_function()
Definition exprtk.hpp:27586
expression_node_ptr parse_break_statement()
Definition exprtk.hpp:29273
expression_node_ptr parse_not_statement()
Definition exprtk.hpp:26780
expression_node_ptr parse_assert_statement()
Definition exprtk.hpp:30793
expression_node_ptr parse_null_statement()
Definition exprtk.hpp:29266
expression_node_ptr parse_return_statement()
Definition exprtk.hpp:30672
expression_node_ptr parse_symtab_symbol()
Definition exprtk.hpp:31088
expression_node_ptr parse_repeat_until_loop()
Definition exprtk.hpp:26899
expression_node_ptr parse_define_constvar_statement()
Definition exprtk.hpp:30140
bool is_valid_sf_symbol(const std::string &symbol)
Definition exprtk.hpp:257

References exprtk::parser< T >::check_block_statement_closure(), 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 31088 of file exprtk.hpp.

31089 {
31090 const std::string symbol = current_token().value;
31091
31092 // Are we dealing with a variable or a special constant?
31093 typedef typename symtab_store::variable_context var_ctxt_t;
31094 var_ctxt_t var_ctx = symtab_store_.get_variable_context(symbol);
31095
31096 if (var_ctx.variable)
31097 {
31098 assert(var_ctx.symbol_table);
31099
31100 expression_node_ptr result_variable = var_ctx.variable;
31101
31102 if (symtab_store_.is_constant_node(symbol))
31103 {
31104 result_variable = expression_generator_(var_ctx.variable->value());
31105 }
31106 else if (symbol_table_t::e_immutable == var_ctx.symbol_table->mutability())
31107 {
31108 lodge_immutable_symbol(current_token(), make_memory_range(var_ctx.variable->ref()));
31109 result_variable = var_ctx.variable;
31110 }
31111
31112 if (!post_variable_process(symbol))
31113 return error_node();
31114
31115 lodge_symbol(symbol, e_st_variable);
31116
31117 next_token();
31118
31119 return result_variable;
31120 }
31121
31122 // Are we dealing with a locally defined variable, vector or string?
31123 if (!sem_.empty())
31124 {
31125 scope_element& se = sem_.get_active_element(symbol);
31126
31127 if (se.active && details::imatch(se.name, symbol))
31128 {
31129 if (
31130 (scope_element::e_variable == se.type) ||
31131 (scope_element::e_literal == se.type)
31132 )
31133 {
31134 se.active = true;
31136
31137 if (!post_variable_process(symbol))
31138 return error_node();
31139
31140 next_token();
31141
31142 return (scope_element::e_variable == se.type) ?
31143 se.var_node :
31144 expression_generator_(se.var_node->value());
31145 }
31146 else if (scope_element::e_vector == se.type)
31147 {
31148 return parse_vector();
31149 }
31150 #ifndef exprtk_disable_string_capabilities
31151 else if (scope_element::e_string == se.type)
31152 {
31153 return parse_string();
31154 }
31155 #endif
31156 }
31157 }
31158
31159 #ifndef exprtk_disable_string_capabilities
31160 // Are we dealing with a string variable?
31161 if (symtab_store_.is_stringvar(symbol))
31162 {
31163 return parse_string();
31164 }
31165 #endif
31166
31167 {
31168 // Are we dealing with a function?
31169 ifunction<T>* function = symtab_store_.get_function(symbol);
31170
31171 if (function)
31172 {
31173 lodge_symbol(symbol, e_st_function);
31174
31175 expression_node_ptr func_node =
31176 parse_function_invocation(function,symbol);
31177
31178 if (func_node)
31179 return func_node;
31180 else
31181 {
31184 current_token(),
31185 "ERR231 - Failed to generate node for function: '" + symbol + "'",
31187
31188 return error_node();
31189 }
31190 }
31191 }
31192
31193 {
31194 // Are we dealing with a vararg function?
31195 ivararg_function<T>* vararg_function = symtab_store_.get_vararg_function(symbol);
31196
31197 if (vararg_function)
31198 {
31199 lodge_symbol(symbol, e_st_function);
31200
31201 expression_node_ptr vararg_func_node =
31202 parse_vararg_function_call(vararg_function, symbol);
31203
31204 if (vararg_func_node)
31205 return vararg_func_node;
31206 else
31207 {
31210 current_token(),
31211 "ERR232 - Failed to generate node for vararg function: '" + symbol + "'",
31213
31214 return error_node();
31215 }
31216 }
31217 }
31218
31219 {
31220 // Are we dealing with a vararg generic function?
31221 igeneric_function<T>* generic_function = symtab_store_.get_generic_function(symbol);
31222
31223 if (generic_function)
31224 {
31225 lodge_symbol(symbol, e_st_function);
31226
31227 expression_node_ptr genericfunc_node =
31228 parse_generic_function_call(generic_function, symbol);
31229
31230 if (genericfunc_node)
31231 return genericfunc_node;
31232 else
31233 {
31236 current_token(),
31237 "ERR233 - Failed to generate node for generic function: '" + symbol + "'",
31239
31240 return error_node();
31241 }
31242 }
31243 }
31244
31245 #ifndef exprtk_disable_string_capabilities
31246 {
31247 // Are we dealing with a vararg string returning function?
31248 igeneric_function<T>* string_function = symtab_store_.get_string_function(symbol);
31249
31250 if (string_function)
31251 {
31252 lodge_symbol(symbol, e_st_function);
31253
31254 expression_node_ptr stringfunc_node =
31255 parse_string_function_call(string_function, symbol);
31256
31257 if (stringfunc_node)
31258 return stringfunc_node;
31259 else
31260 {
31263 current_token(),
31264 "ERR234 - Failed to generate node for string function: '" + symbol + "'",
31266
31267 return error_node();
31268 }
31269 }
31270 }
31271
31272 {
31273 // Are we dealing with a vararg overloaded scalar/string returning function?
31274 igeneric_function<T>* overload_function = symtab_store_.get_overload_function(symbol);
31275
31276 if (overload_function)
31277 {
31278 lodge_symbol(symbol, e_st_function);
31279
31280 expression_node_ptr overloadfunc_node =
31281 parse_overload_function_call(overload_function, symbol);
31282
31283 if (overloadfunc_node)
31284 return overloadfunc_node;
31285 else
31286 {
31289 current_token(),
31290 "ERR235 - Failed to generate node for overload function: '" + symbol + "'",
31292
31293 return error_node();
31294 }
31295 }
31296 }
31297 #endif
31298
31299 // Are we dealing with a vector?
31300 if (symtab_store_.is_vector(symbol))
31301 {
31302 lodge_symbol(symbol, e_st_vector);
31303 return parse_vector();
31304 }
31305
31306 if (details::is_reserved_symbol(symbol))
31307 {
31308 if (
31309 settings_.function_enabled(symbol) ||
31311 )
31312 {
31315 current_token(),
31316 "ERR236 - Invalid use of reserved symbol '" + symbol + "'",
31318
31319 return error_node();
31320 }
31321 }
31322
31323 // Should we handle unknown symbols?
31325 {
31327 {
31329
31330 std::string error_message;
31331
31333 {
31334 T default_value = T(0);
31335
31337
31338 if (unknown_symbol_resolver_->process(symbol, usr_symbol_type, default_value, error_message))
31339 {
31340 bool create_result = false;
31341
31342 switch (usr_symbol_type)
31343 {
31345 create_result = symtab.create_variable(symbol, default_value);
31346 break;
31347
31349 create_result = symtab.add_constant(symbol, default_value);
31350 break;
31351
31352 default : create_result = false;
31353 }
31354
31355 if (create_result)
31356 {
31358
31359 if (var)
31360 {
31361 if (symtab_store_.is_constant_node(symbol))
31362 {
31363 var = expression_generator_(var->value());
31364 }
31365
31366 lodge_symbol(symbol, e_st_variable);
31367
31368 if (!post_variable_process(symbol))
31369 return error_node();
31370
31371 next_token();
31372
31373 return var;
31374 }
31375 }
31376 }
31377
31380 current_token(),
31381 "ERR237 - Failed to create variable: '" + symbol + "'" +
31382 (error_message.empty() ? "" : " - " + error_message),
31384
31385 }
31387 {
31388 if (unknown_symbol_resolver_->process(symbol, symtab, error_message))
31389 {
31391
31392 if (result)
31393 {
31394 return result;
31395 }
31396 }
31397
31400 current_token(),
31401 "ERR238 - Failed to resolve symbol: '" + symbol + "'" +
31402 (error_message.empty() ? "" : " - " + error_message),
31404 }
31405
31406 return error_node();
31407 }
31408 }
31409
31412 current_token(),
31413 "ERR239 - Undefined symbol: '" + symbol + "'",
31415
31416 return error_node();
31417 }
bool function_enabled(const std::string &function_name) const
Definition exprtk.hpp:24190
expression_node_ptr parse_string_function_call(igeneric_function< T > *function, const std::string &function_name)
Definition exprtk.hpp:29032
expression_node_ptr parse_function_invocation(ifunction< T > *function, const std::string &function_name)
Definition exprtk.hpp:25948
expression_node_ptr parse_generic_function_call(igeneric_function< T > *function, const std::string &function_name)
Definition exprtk.hpp:28844
expression_node_ptr parse_vararg_function_call(ivararg_function< T > *vararg_function, const std::string &vararg_function_name)
Definition exprtk.hpp:28488
expression_node_ptr parse_overload_function_call(igeneric_function< T > *function, const std::string &function_name)
Definition exprtk.hpp:29082
bool post_variable_process(const std::string &symbol)
Definition exprtk.hpp:30981
expression_node_ptr parse_string()
Definition exprtk.hpp:28178
symbol_table< T > symbol_table_t
Definition exprtk.hpp:22520
bool is_base_function(const std::string &function_name)
Definition exprtk.hpp:549
function_ptr get_function(const std::string &function_name) const
Definition exprtk.hpp:23310
bool is_stringvar(const std::string &stringvar_name) const
Definition exprtk.hpp:23541
generic_function_ptr get_generic_function(const std::string &function_name) const
Definition exprtk.hpp:23352
bool is_constant_node(const std::string &symbol_name) const
Definition exprtk.hpp:23465
variable_context get_variable_context(const std::string &variable_name) const
Definition exprtk.hpp:23196
symbol_table_t & get_symbol_table(const std::size_t &index=0)
Definition exprtk.hpp:23660
vararg_function_ptr get_vararg_function(const std::string &vararg_function_name) const
Definition exprtk.hpp:23331
generic_function_ptr get_overload_function(const std::string &function_name) const
Definition exprtk.hpp:23394
generic_function_ptr get_string_function(const std::string &function_name) const
Definition exprtk.hpp:23373
virtual bool process(const std::string &, usr_symbol_type &st, T &default_value, std::string &error_message)
Definition exprtk.hpp:23738

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 26660 of file exprtk.hpp.

26661 {
26662 // Parse: [condition][?][consequent][:][alternative]
26663 expression_node_ptr consequent = error_node();
26664 expression_node_ptr alternative = error_node();
26665
26666 bool result = true;
26667
26668 if (0 == condition)
26669 {
26672 current_token(),
26673 "ERR056 - Encountered invalid condition branch for ternary if-statement",
26675
26676 return error_node();
26677 }
26678 else if (!token_is(token_t::e_ternary))
26679 {
26682 current_token(),
26683 "ERR057 - Expected '?' after condition of ternary if-statement",
26685
26686 result = false;
26687 }
26688 else if (0 == (consequent = parse_expression()))
26689 {
26692 current_token(),
26693 "ERR058 - Failed to parse consequent for ternary if-statement",
26695
26696 result = false;
26697 }
26698 else if (!token_is(token_t::e_colon))
26699 {
26702 current_token(),
26703 "ERR059 - Expected ':' between ternary if-statement consequent and alternative",
26705
26706 result = false;
26707 }
26708 else if (0 == (alternative = parse_expression()))
26709 {
26712 current_token(),
26713 "ERR060 - Failed to parse alternative for ternary if-statement",
26715
26716 result = false;
26717 }
26718
26719 #ifndef exprtk_disable_string_capabilities
26720 if (result)
26721 {
26722 const bool consq_is_str = is_generally_string_node(consequent );
26723 const bool alter_is_str = is_generally_string_node(alternative);
26724
26725 if (consq_is_str || alter_is_str)
26726 {
26727 if (consq_is_str && alter_is_str)
26728 {
26730 .conditional_string(condition, consequent, alternative);
26731 }
26732
26735 current_token(),
26736 "ERR061 - Return types of ternary differ: string/non-string",
26738
26739 result = false;
26740 }
26741 }
26742 #endif
26743
26744 if (result)
26745 {
26746 const bool consq_is_vec = is_ivector_node(consequent );
26747 const bool alter_is_vec = is_ivector_node(alternative);
26748
26749 if (consq_is_vec || alter_is_vec)
26750 {
26751 if (consq_is_vec && alter_is_vec)
26752 {
26754 .conditional_vector(condition, consequent, alternative);
26755 }
26756
26759 current_token(),
26760 "ERR062 - Return types of ternary differ: vector/non-vector",
26762
26763 result = false;
26764 }
26765 }
26766
26767 if (!result)
26768 {
26769 free_node(node_allocator_, condition );
26770 free_node(node_allocator_, consequent );
26771 free_node(node_allocator_, alternative);
26772
26773 return error_node();
26774 }
26775 else
26777 .conditional(condition, consequent, alternative);
26778 }

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 30335 of file exprtk.hpp.

30336 {
30337 if (
30340 )
30341 {
30344 current_token(),
30345 "ERR200 - Expected a '{}' for uninitialised var definition",
30347
30348 return error_node();
30349 }
30350 else if (!token_is(token_t::e_eof,prsrhlpr_t::e_hold))
30351 {
30354 current_token(),
30355 "ERR201 - Expected ';' after uninitialised variable definition",
30357
30358 return error_node();
30359 }
30360
30361 expression_node_ptr var_node = reinterpret_cast<expression_node_ptr>(0);
30362
30363 scope_element& se = sem_.get_element(var_name);
30364
30365 if (se.name == var_name)
30366 {
30367 if (se.active)
30368 {
30371 current_token(),
30372 "ERR202 - Illegal redefinition of local variable: '" + var_name + "'",
30374
30375 return error_node();
30376 }
30377 else if (scope_element::e_variable == se.type)
30378 {
30379 var_node = se.var_node;
30380 se.active = true;
30381 se.ref_count++;
30382 }
30383 }
30384
30385 if (0 == var_node)
30386 {
30387 const std::size_t predicted_total_lclsymb_size = sizeof(T) + sem_.total_local_symb_size_bytes();
30388
30389 if (predicted_total_lclsymb_size > settings().max_total_local_symbol_size_bytes())
30390 {
30393 current_token(),
30394 "ERR203 - Adding variable '" + var_name + "' "
30395 "will exceed max total local symbol size of: " + details::to_str(settings().max_total_local_symbol_size_bytes()) + " bytes, "
30396 "current total size: " + details::to_str(sem_.total_local_symb_size_bytes()) + " bytes",
30398
30399 return error_node();
30400 }
30401
30402 scope_element nse;
30403 nse.name = var_name;
30404 nse.active = true;
30405 nse.ref_count = 1;
30406 nse.type = scope_element::e_variable;
30407 nse.depth = state_.scope_depth;
30408 nse.ip_index = sem_.next_ip_index();
30409 nse.data = new T(T(0));
30410 nse.var_node = node_allocator_.allocate<variable_node_t>(*reinterpret_cast<T*>(nse.data));
30411
30412 if (!sem_.add_element(nse))
30413 {
30416 current_token(),
30417 "ERR204 - Failed to add new local variable '" + var_name + "' to SEM",
30419
30420 sem_.free_element(nse);
30421
30422 return error_node();
30423 }
30424
30425 assert(sem_.total_local_symb_size_bytes() <= settings().max_total_local_symbol_size_bytes());
30426
30427 exprtk_debug(("parse_uninitialised_var_statement() - INFO - Added new local variable: %s\n",
30428 nse.name.c_str()));
30429 }
30430
30432
30433 state_.activate_side_effect("parse_uninitialised_var_statement()");
30434
30435 return expression_generator_(T(0));
30436 }

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 >::settings_store::max_total_local_symbol_size_bytes(), 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 >::settings(), exprtk::parser< T >::state_, exprtk::details::to_str(), exprtk::lexer::parser_helper::token_is(), exprtk::parser< T >::scope_element_manager::total_local_symb_size_bytes(), 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 27586 of file exprtk.hpp.

27587 {
27588 std::vector<expression_node_ptr> arg_list;
27589
27591 const std::string symbol = current_token().value;
27592
27593 if (details::imatch(symbol,"~"))
27594 {
27595 next_token();
27597 }
27598 else if (details::imatch(symbol,"[*]"))
27599 {
27601 }
27602 else if (details::imatch(symbol, "avg" )) opt_type = details::e_avg ;
27603 else if (details::imatch(symbol, "mand")) opt_type = details::e_mand;
27604 else if (details::imatch(symbol, "max" )) opt_type = details::e_max ;
27605 else if (details::imatch(symbol, "min" )) opt_type = details::e_min ;
27606 else if (details::imatch(symbol, "mor" )) opt_type = details::e_mor ;
27607 else if (details::imatch(symbol, "mul" )) opt_type = details::e_prod;
27608 else if (details::imatch(symbol, "sum" )) opt_type = details::e_sum ;
27609 else
27610 {
27613 current_token(),
27614 "ERR104 - Unsupported built-in vararg function: " + symbol,
27616
27617 return error_node();
27618 }
27619
27620 scoped_vec_delete<expression_node_t> svd((*this), arg_list);
27621
27622 lodge_symbol(symbol, e_st_function);
27623
27624 next_token();
27625
27627 {
27630 current_token(),
27631 "ERR105 - Expected '(' for call to vararg function: " + symbol,
27633
27634 return error_node();
27635 }
27636
27638 {
27641 current_token(),
27642 "ERR106 - vararg function: " + symbol +
27643 " requires at least one input parameter",
27645
27646 return error_node();
27647 }
27648
27649 for ( ; ; )
27650 {
27652
27653 if (0 == arg)
27654 return error_node();
27655 else
27656 arg_list.push_back(arg);
27657
27659 break;
27660 else if (!token_is(token_t::e_comma))
27661 {
27664 current_token(),
27665 "ERR107 - Expected ',' for call to vararg function: " + symbol,
27667
27668 return error_node();
27669 }
27670 }
27671
27672 const expression_node_ptr result = expression_generator_.vararg_function(opt_type,arg_list);
27673
27674 svd.delete_ptr = (0 == result);
27675 return result;
27676 }
expression_node_ptr vararg_function(const details::operator_type &operation, Sequence< expression_node_ptr, Allocator > &arg_list)
Definition exprtk.hpp:33776
expression_node_ptr parse_multi_switch_statement()
Definition exprtk.hpp:27470

References exprtk::parser< T >::check_block_statement_closure(), 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 28488 of file exprtk.hpp.

28489 {
28490 std::vector<expression_node_ptr> arg_list;
28491
28492 scoped_vec_delete<expression_node_t> svd((*this), arg_list);
28493
28494 next_token();
28495
28497 {
28499 {
28500 if (!vararg_function->allow_zero_parameters())
28501 {
28504 current_token(),
28505 "ERR127 - Zero parameter call to vararg function: "
28506 + vararg_function_name + " not allowed",
28508
28509 return error_node();
28510 }
28511 }
28512 else
28513 {
28514 for ( ; ; )
28515 {
28517
28518 if (0 == arg)
28519 return error_node();
28520 else
28521 arg_list.push_back(arg);
28522
28524 break;
28525 else if (!token_is(token_t::e_comma))
28526 {
28529 current_token(),
28530 "ERR128 - Expected ',' for call to vararg function: "
28531 + vararg_function_name,
28533
28534 return error_node();
28535 }
28536 }
28537 }
28538 }
28539 else if (!vararg_function->allow_zero_parameters())
28540 {
28543 current_token(),
28544 "ERR129 - Zero parameter call to vararg function: "
28545 + vararg_function_name + " not allowed",
28547
28548 return error_node();
28549 }
28550
28551 if (arg_list.size() < vararg_function->min_num_args())
28552 {
28555 current_token(),
28556 "ERR130 - Invalid number of parameters to call to vararg function: "
28557 + vararg_function_name + ", require at least "
28558 + details::to_str(static_cast<int>(vararg_function->min_num_args())) + " parameters",
28560
28561 return error_node();
28562 }
28563 else if (arg_list.size() > vararg_function->max_num_args())
28564 {
28567 current_token(),
28568 "ERR131 - Invalid number of parameters to call to vararg function: "
28569 + vararg_function_name + ", require no more than "
28570 + details::to_str(static_cast<int>(vararg_function->max_num_args())) + " parameters",
28572
28573 return error_node();
28574 }
28575
28576 expression_node_ptr result = expression_generator_.vararg_function_call(vararg_function,arg_list);
28577
28578 svd.delete_ptr = (0 == result);
28579
28580 return result;
28581 }
expression_node_ptr vararg_function_call(ivararg_function_t *vaf, std::vector< expression_node_ptr > &arg_list)
Definition exprtk.hpp:33913

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 28386 of file exprtk.hpp.

28387 {
28388 const std::string vector_name = current_token().value;
28389
28391
28392 const scope_element& se = sem_.get_active_element(vector_name);
28393
28394 if (
28395 !details::imatch(se.name, vector_name) ||
28396 (se.depth > state_.scope_depth) ||
28397 (scope_element::e_vector != se.type)
28398 )
28399 {
28400 typedef typename symtab_store::vector_context vec_ctxt_t;
28401 vec_ctxt_t vec_ctx = symtab_store_.get_vector_context(vector_name);
28402
28403 if (0 == vec_ctx.vector_holder)
28404 {
28407 current_token(),
28408 "ERR125 - Symbol '" + vector_name + " not a vector",
28410
28411 return error_node();
28412 }
28413
28414 assert(0 != vec_ctx.vector_holder);
28415 assert(0 != vec_ctx.symbol_table );
28416
28417 vec = vec_ctx.vector_holder;
28418
28419 if (symbol_table_t::e_immutable == vec_ctx.symbol_table->mutability())
28420 {
28422 current_token(),
28423 make_memory_range(vec->data(), vec->size()));
28424 }
28425 }
28426 else
28427 {
28428 vec = se.vec_node;
28429 }
28430
28431 assert(0 != vec);
28432
28433 next_token();
28434
28436 {
28438 }
28440 {
28441 return (vec->rebaseable()) ?
28443 expression_generator_(T(vec->size()));
28444 }
28445
28446 expression_node_ptr index_expr = parse_vector_index(vector_name);
28447
28448 if (index_expr)
28449 {
28451
28452 return synthesize_vector_element(vector_name, vec, vec_node, index_expr);
28453 }
28454
28455 return error_node();
28456 }
details::vector_size_node< T > vector_size_node_t
Definition exprtk.hpp:22492
vector_holder_t * vector_holder_ptr
Definition exprtk.hpp:22523
vector_context get_vector_context(const std::string &vector_name) const
Definition exprtk.hpp:23415

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 28356 of file exprtk.hpp.

28357 {
28358 expression_node_ptr index_expr = error_node();
28359
28360 if (0 == (index_expr = parse_expression()))
28361 {
28364 current_token(),
28365 "ERR123 - Failed to parse index for vector: '" + vector_name + "'",
28367
28368 return error_node();
28369 }
28371 {
28374 current_token(),
28375 "ERR124 - Expected ']' for index of vector: '" + vector_name + "'",
28377
28378 free_node(node_allocator_, index_expr);
28379
28380 return error_node();
28381 }
28382
28383 return index_expr;
28384 }

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 26802 of file exprtk.hpp.

26803 {
26804 // Parse: [while][(][test expr][)][{][expression][}]
26805 expression_node_ptr condition = error_node();
26807 expression_node_ptr result_node = error_node();
26808
26809 bool result = true;
26810
26811 next_token();
26812
26814 {
26817 current_token(),
26818 "ERR064 - Expected '(' at start of while-loop condition statement",
26820
26821 return error_node();
26822 }
26823 else if (0 == (condition = parse_expression()))
26824 {
26827 current_token(),
26828 "ERR065 - Failed to parse condition for while-loop",
26830
26831 return error_node();
26832 }
26833 else if (!token_is(token_t::e_rbracket))
26834 {
26837 current_token(),
26838 "ERR066 - Expected ')' at end of while-loop condition statement",
26840
26841 result = false;
26842 }
26843
26844 brkcnt_list_.push_front(false);
26845
26846 if (result)
26847 {
26848 scoped_inc_dec sid(state_.parsing_loop_stmt_count);
26849
26850 if (0 == (branch = parse_multi_sequence("while-loop", true)))
26851 {
26854 current_token(),
26855 "ERR067 - Failed to parse body of while-loop"));
26856 result = false;
26857 }
26858 else if (0 == (result_node = expression_generator_.while_loop(condition,
26859 branch,
26860 brkcnt_list_.front())))
26861 {
26864 current_token(),
26865 "ERR068 - Failed to synthesize while-loop",
26867
26868 result = false;
26869 }
26870 }
26871
26873
26874 if (!result)
26875 {
26876 free_node(node_allocator_, branch );
26877 free_node(node_allocator_, condition );
26878 free_node(node_allocator_, result_node);
26879
26880 return error_node();
26881 }
26882
26883 if (result_node && result_node->valid())
26884 {
26885 return result_node;
26886 }
26887
26890 current_token(),
26891 "ERR069 - Failed to synthesize 'valid' while-loop",
26893
26894 free_node(node_allocator_, result_node);
26895
26896 return error_node();
26897 }
expression_node_ptr while_loop(expression_node_ptr &condition, expression_node_ptr &branch, const bool break_continue_present=false) const
Definition exprtk.hpp:32917

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 25359 of file exprtk.hpp.

25360 {
25361 if (!current_state_stack_.empty())
25362 {
25363 current_state_stack_.pop_back();
25364 }
25365 }

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 31006 of file exprtk.hpp.

31007 {
31008 bool implied_mul = false;
31009
31011 return true;
31012
31013 if (details::is_ivector_node(branch))
31014 return true;
31015
31016 const lexer::parser_helper::token_advance_mode hold = prsrhlpr_t::e_hold;
31017
31018 switch (token)
31019 {
31020 case token_t::e_lcrlbracket : implied_mul = token_is(token_t::e_lbracket , hold) ||
31023 break;
31024
31025 case token_t::e_lbracket : implied_mul = token_is(token_t::e_lbracket , hold) ||
31028 break;
31029
31030 case token_t::e_lsqrbracket : implied_mul = token_is(token_t::e_lbracket , hold) ||
31033 break;
31034
31035 default : return true;
31036 }
31037
31038 if (implied_mul)
31039 {
31041 {
31044 current_token(),
31045 "ERR230 - Invalid sequence of brackets",
31047
31048 return false;
31049 }
31050 else if (token_t::e_eof != current_token().type)
31051 {
31054 next_token();
31055 }
31056 }
31057
31058 return true;
31059 }
void insert_front(token_t::token_type tk_type)
Definition exprtk.hpp:2575

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::details::is_ivector_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 30981 of file exprtk.hpp.

30982 {
30983 if (
30987 )
30988 {
30990 {
30993 current_token(),
30994 "ERR229 - Invalid sequence of variable '" + symbol + "' and bracket",
30996
30997 return false;
30998 }
30999
31001 }
31002
31003 return true;
31004 }

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 24870 of file exprtk.hpp.

24871 {
24872 for (std::size_t i = 0; i < lexer().size(); ++i)
24873 {
24874 if (lexer()[i].is_error())
24875 {
24876 std::string diagnostic = "ERR004 - ";
24877
24878 switch (lexer()[i].type)
24879 {
24880 case lexer::token::e_error : diagnostic += "General token error";
24881 break;
24882
24883 case lexer::token::e_err_symbol : diagnostic += "Symbol error";
24884 break;
24885
24886 case lexer::token::e_err_number : diagnostic += "Invalid numeric token";
24887 break;
24888
24889 case lexer::token::e_err_string : diagnostic += "Invalid string token";
24890 break;
24891
24892 case lexer::token::e_err_sfunc : diagnostic += "Invalid special function token";
24893 break;
24894
24895 default : diagnostic += "Unknown compiler error";
24896 }
24897
24900 lexer()[i],
24901 diagnostic + ": " + lexer()[i].value,
24903 }
24904 }
24905 }
std::size_t size() const
Definition exprtk.hpp:2509

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 25354 of file exprtk.hpp.

25355 {
25357 }

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 25110 of file exprtk.hpp.

25111 {
25112 assert_check_ = &assrt_chck;
25113 }

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 25105 of file exprtk.hpp.

25106 {
25107 compilation_check_ptr_ = &compchk;
25108 }

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 41826 of file exprtk.hpp.

41827 {
41828 for (std::size_t i = 0; i < sem_.size(); ++i)
41829 {
41830 scope_element& se = sem_.get_element(i);
41831
41832 exprtk_debug(("register_local_vars() - se[%s]\n", se.name.c_str()));
41833
41834 if (
41835 (scope_element::e_variable == se.type) ||
41836 (scope_element::e_literal == se.type) ||
41837 (scope_element::e_vecelem == se.type)
41838 )
41839 {
41840 if (se.var_node)
41841 {
41842 e.register_local_var(se.var_node);
41843 }
41844
41845 if (se.data)
41846 {
41847 e.register_local_data(se.data, 1, 0);
41848 }
41849 }
41850 else if (scope_element::e_vector == se.type)
41851 {
41852 if (se.vec_node)
41853 {
41854 e.register_local_var(se.vec_node);
41855 }
41856
41857 if (se.data)
41858 {
41859 e.register_local_data(se.data, se.size, 1);
41860 }
41861 }
41862 #ifndef exprtk_disable_string_capabilities
41863 else if (scope_element::e_string == se.type)
41864 {
41865 if (se.str_node)
41866 {
41867 e.register_local_var(se.str_node);
41868 }
41869
41870 if (se.data)
41871 {
41872 e.register_local_data(se.data, se.size, 2);
41873 }
41874 }
41875 #endif
41876
41877 se.var_node = 0;
41878 se.vec_node = 0;
41879 #ifndef exprtk_disable_string_capabilities
41880 se.str_node = 0;
41881 #endif
41882 se.data = 0;
41883 se.ref_count = 0;
41884 se.active = false;
41885 }
41886 }

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 25095 of file exprtk.hpp.

25096 {
25097 loop_runtime_check_ = &lrtchk;
25098 }

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 41888 of file exprtk.hpp.

41889 {
41890 e.register_return_results(results_context_);
41891 results_context_ = 0;
41892 }

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 25100 of file exprtk.hpp.

25101 {
25103 }

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 41810 of file exprtk.hpp.

41811 {
41812 if (!error_list_.empty())
41813 {
41814 error_list_.pop_back();
41815 }
41816 }

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 25064 of file exprtk.hpp.

25065 {
25067 return false;
25068 else if (details::is_reserved_word(symbol))
25069 return false;
25070 else
25071 return symbol_replacer_.remove(symbol);
25072 }
bool remove(const std::string &target_symbol)
Definition exprtk.hpp:3928
bool is_reserved_word(const std::string &symbol)
Definition exprtk.hpp:523

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 25054 of file exprtk.hpp.

25055 {
25057 return false;
25058 else if (details::is_reserved_word(old_symbol))
25059 return false;
25060 else
25061 return symbol_replacer_.add_replace(old_symbol,new_symbol,lexer::token::e_symbol);
25062 }

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 42061 of file exprtk.hpp.

42062 {
42063 if (0 == results_context_)
42064 {
42066 }
42067
42068 return (*results_context_);
42069 }
results_context< T > results_context_t
Definition exprtk.hpp:22567

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 42071 of file exprtk.hpp.

42072 {
42073 #ifndef exprtk_disable_return_statement
42074 if (results_context_)
42075 {
42076 delete results_context_;
42077 results_context_ = 0;
42078 }
42079
42081 #endif
42082 }

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 24907 of file exprtk.hpp.

24908 {
24910 {
24912 }
24913
24915 {
24917 }
24918
24920 {
24922 }
24923
24924 if (
24928 )
24929 {
24931 {
24933 {
24934 lexer::helper::bracket_checker* bracket_checker_ptr = 0;
24935 lexer::helper::numeric_checker<T>* numeric_checker_ptr = 0;
24936 lexer::helper::sequence_validator* sequence_validator_ptr = 0;
24937 lexer::helper::sequence_validator_3tokens* sequence_validator3_ptr = 0;
24938
24939 if (0 != (bracket_checker_ptr = dynamic_cast<lexer::helper::bracket_checker*>(helper_assembly_.error_token_scanner)))
24940 {
24943 bracket_checker_ptr->error_token(),
24944 "ERR005 - Mismatched brackets: '" + bracket_checker_ptr->error_token().value + "'",
24946 }
24947 else if (0 != (numeric_checker_ptr = dynamic_cast<lexer::helper::numeric_checker<T>*>(helper_assembly_.error_token_scanner)))
24948 {
24949 for (std::size_t i = 0; i < numeric_checker_ptr->error_count(); ++i)
24950 {
24951 lexer::token error_token = lexer()[numeric_checker_ptr->error_index(i)];
24952
24955 error_token,
24956 "ERR006 - Invalid numeric token: '" + error_token.value + "'",
24958 }
24959
24960 if (numeric_checker_ptr->error_count())
24961 {
24962 numeric_checker_ptr->clear_errors();
24963 }
24964 }
24965 else if (0 != (sequence_validator_ptr = dynamic_cast<lexer::helper::sequence_validator*>(helper_assembly_.error_token_scanner)))
24966 {
24967 for (std::size_t i = 0; i < sequence_validator_ptr->error_count(); ++i)
24968 {
24969 std::pair<lexer::token,lexer::token> error_token = sequence_validator_ptr->error(i);
24970
24973 error_token.first,
24974 "ERR007 - Invalid token sequence: '" +
24975 error_token.first.value + "' and '" +
24976 error_token.second.value + "'",
24978 }
24979
24980 if (sequence_validator_ptr->error_count())
24981 {
24982 sequence_validator_ptr->clear_errors();
24983 }
24984 }
24985 else if (0 != (sequence_validator3_ptr = dynamic_cast<lexer::helper::sequence_validator_3tokens*>(helper_assembly_.error_token_scanner)))
24986 {
24987 for (std::size_t i = 0; i < sequence_validator3_ptr->error_count(); ++i)
24988 {
24989 std::pair<lexer::token,lexer::token> error_token = sequence_validator3_ptr->error(i);
24990
24993 error_token.first,
24994 "ERR008 - Invalid token sequence: '" +
24995 error_token.first.value + "' and '" +
24996 error_token.second.value + "'",
24998 }
24999
25000 if (sequence_validator3_ptr->error_count())
25001 {
25002 sequence_validator3_ptr->clear_errors();
25003 }
25004 }
25005 }
25006
25007 return false;
25008 }
25009 }
25010
25011 return true;
25012 }
bool run_inserters(lexer::generator &g)
Definition exprtk.hpp:4346
bool run_joiners(lexer::generator &g)
Definition exprtk.hpp:4324
bool run_scanners(lexer::generator &g)
Definition exprtk.hpp:4368
lexer::token_scanner * error_token_scanner
Definition exprtk.hpp:4395
bool run_modifiers(lexer::generator &g)
Definition exprtk.hpp:4302

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 41805 of file exprtk.hpp.

41806 {
41807 error_list_.push_back(error_type);
41808 }

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

Referenced by exprtk::parser< T >::expression_generator< Type >::assign_immutable_symbol(), exprtk::parser< T >::check_block_statement_closure(), 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 >::valid_settings(), 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 27823 of file exprtk.hpp.

27826 {
27827 if (expression_list.empty())
27828 return error_node();
27829 else if (1 == expression_list.size())
27830 return expression_list[0];
27831
27832 Sequence<expression_node_ptr,Allocator1> tmp_expression_list;
27833
27834 exprtk_debug(("simplify() - expression_list.size: %d side_effect_list.size(): %d\n",
27835 static_cast<int>(expression_list .size()),
27836 static_cast<int>(side_effect_list.size())));
27837
27838 bool return_node_present = false;
27839
27840 for (std::size_t i = 0; i < (expression_list.size() - 1); ++i)
27841 {
27843 continue;
27844 else if (
27845 is_return_node (expression_list[i]) ||
27848 )
27849 {
27850 tmp_expression_list.push_back(expression_list[i]);
27851
27852 // Remove all subexpressions after first short-circuit
27853 // node has been encountered.
27854
27855 for (std::size_t j = i + 1; j < expression_list.size(); ++j)
27856 {
27858 }
27859
27860 return_node_present = true;
27861
27862 break;
27863 }
27864 else if (
27866 is_null_node (expression_list[i]) ||
27867 !side_effect_list[i]
27868 )
27869 {
27871 continue;
27872 }
27873 else
27874 tmp_expression_list.push_back(expression_list[i]);
27875 }
27876
27877 if (!return_node_present)
27878 {
27879 tmp_expression_list.push_back(expression_list.back());
27880 }
27881
27882 expression_list.swap(tmp_expression_list);
27883
27884 if (tmp_expression_list.size() > expression_list.size())
27885 {
27886 exprtk_debug(("simplify() - Reduced subexpressions from %d to %d\n",
27887 static_cast<int>(tmp_expression_list.size()),
27888 static_cast<int>(expression_list .size())));
27889 }
27890
27891 if (
27892 return_node_present ||
27893 side_effect_list.back() ||
27894 (expression_list.size() > 1)
27895 )
27896 state_.activate_side_effect("simplify()");
27897
27898 if (1 == expression_list.size())
27899 return expression_list[0];
27900 else if (specialise_on_final_type && is_generally_string_node(expression_list.back()))
27902 else
27904 }
static const std::string expression_list[]
bool is_variable_node(const expression_node< T > *node)
Definition exprtk.hpp:5806
bool is_continue_node(const expression_node< T > *node)
Definition exprtk.hpp:5948
bool is_break_node(const expression_node< T > *node)
Definition exprtk.hpp:5942

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 25706 of file exprtk.hpp.

25707 {
25708 {
25710 ubn_t* n = dynamic_cast<ubn_t*>(node);
25711
25712 if (n)
25713 {
25714 expression_node_ptr un_r = n->branch(0);
25715 n->release();
25717 node = un_r;
25718
25719 return true;
25720 }
25721 }
25722
25723 {
25725
25726 uvn_t* n = dynamic_cast<uvn_t*>(node);
25727
25728 if (n)
25729 {
25730 const T& v = n->v();
25731 expression_node_ptr return_node = error_node();
25732
25733 if (
25734 (0 != (return_node = symtab_store_.get_variable(v))) ||
25735 (0 != (return_node = sem_ .get_variable(v)))
25736 )
25737 {
25739 node = return_node;
25740
25741 return true;
25742 }
25743 else
25744 {
25747 current_token(),
25748 "ERR020 - Failed to find variable node in symbol table",
25750
25752
25753 return false;
25754 }
25755 }
25756 }
25757
25758 return false;
25759 }
virtual expression_node< T > * branch(const std::size_t &index=0) const
Definition exprtk.hpp:5723
expression_node_ptr get_variable(const T &v)
Definition exprtk.hpp:22849

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 28458 of file exprtk.hpp.

28462 {
28463 // Perform compile-time range check
28464 if (details::is_constant_node(index_expr))
28465 {
28466 const std::size_t index = static_cast<std::size_t>(details::numeric::to_int32(index_expr->value()));
28467 const std::size_t vec_size = vec->size();
28468
28469 if (index >= vec_size)
28470 {
28473 current_token(),
28474 "ERR126 - Index of " + details::to_str(index) + " out of range for "
28475 "vector '" + vector_name + "' of size " + details::to_str(vec_size),
28477
28478 free_node(node_allocator_, vec_node );
28479 free_node(node_allocator_, index_expr);
28480
28481 return error_node();
28482 }
28483 }
28484
28485 return expression_generator_.vector_element(vector_name, vec, vec_node, index_expr);
28486 }
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:34175

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:

◆ total_local_symbol_size_bytes()

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

Definition at line 25049 of file exprtk.hpp.

25050 {
25052 }

References exprtk::parser< T >::sem_, and exprtk::parser< T >::scope_element_manager::total_local_symb_size_bytes().

Here is the call 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 25137 of file exprtk.hpp.

25138 {
25139 const std::size_t length = symbol.size();
25140
25141 if (
25142 (length < 3) || // Shortest base op symbol length
25143 (length > 9) // Longest base op symbol length
25144 )
25145 return false;
25146 else
25147 return settings_.function_enabled(symbol) &&
25148 (base_ops_map_.end() != base_ops_map_.find(symbol));
25149 }

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_settings()

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

Definition at line 42084 of file exprtk.hpp.

42085 {
42086 const std::size_t max_local_vector_size_bytes = sizeof(T) * settings_.max_local_vector_size();
42087
42088 if (max_local_vector_size_bytes > settings_.max_total_local_symbol_size_bytes())
42089 {
42092 "ERR282 - Max local vector size of " + details::to_str(max_local_vector_size_bytes) + " bytes "
42093 "is larger than max total local symbol size of " + details::to_str(settings_.max_total_local_symbol_size_bytes()) + " bytes",
42095
42096 return false;
42097 }
42098
42099 return true;
42100 }

References exprtk::parser_error::e_parser, exprtk_error_location, exprtk::parser< T >::settings_store::max_local_vector_size(), exprtk::parser< T >::settings_store::max_total_local_symbol_size_bytes(), exprtk::parser< T >::set_error(), exprtk::parser< T >::settings_, and exprtk::details::to_str().

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

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 25151 of file exprtk.hpp.

25152 {
25153 static const std::string s_sum = "sum" ;
25154 static const std::string s_mul = "mul" ;
25155 static const std::string s_avg = "avg" ;
25156 static const std::string s_min = "min" ;
25157 static const std::string s_max = "max" ;
25158 static const std::string s_mand = "mand";
25159 static const std::string s_mor = "mor" ;
25160 static const std::string s_multi = "~" ;
25161 static const std::string s_mswitch = "[*]" ;
25162
25163 return
25164 (
25165 details::imatch(symbol,s_sum ) ||
25166 details::imatch(symbol,s_mul ) ||
25167 details::imatch(symbol,s_avg ) ||
25168 details::imatch(symbol,s_min ) ||
25169 details::imatch(symbol,s_max ) ||
25170 details::imatch(symbol,s_mand ) ||
25171 details::imatch(symbol,s_mor ) ||
25172 details::imatch(symbol,s_multi ) ||
25173 details::imatch(symbol,s_mswitch)
25174 ) &&
25176 }

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 42121 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 42138 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 42134 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 25326 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 42108 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 42122 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 42109 of file exprtk.hpp.

Referenced by exprtk::parser< T >::check_block_statement_closure(), 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 42139 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 42135 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 42136 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 42140 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 42141 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 42107 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_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_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(), exprtk::parser< T >::valid_settings(), and exprtk::parser< T >::valid_vararg_operation().

◆ sf3_map_

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

Definition at line 42123 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 42124 of file exprtk.hpp.

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

◆ state_

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

Definition at line 42114 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 42120 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: