C++ Mathematical Expression Toolkit (ExprTk) release
Loading...
Searching...
No Matches
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  scope_element
class  scope_element_manager
class  scope_handler
struct  halfopen_range_policy
struct  closed_range_policy
class  interval_container_t
class  stack_limit_handler
struct  symtab_store
struct  parser_state
struct  unknown_symbol_resolver
class  dependent_entity_collector
class  settings_store
struct  state_t
struct  scoped_expression_delete
struct  scoped_delete
struct  scoped_deq_delete
struct  scoped_vec_delete
struct  scoped_bool_negator
struct  scoped_bool_or_restorer
struct  scoped_inc_dec
class  type_checker
struct  parse_special_function_impl
class  expression_generator

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_store & settings ()
parser_error::type get_error (const std::size_t &index) const
std::string error () const
std::size_t error_count () const
dependent_entity_collector & dec ()
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_t & lexer ()
const generator_t & lexer () const
void store_token ()
void restore_token ()
void next_token ()
const token_t & current_token () const
const token_t & peek_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_t * expression_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_t * vector_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_t > unary_op_map_t
typedef std::map< operator_t, binary_functor_t > binary_op_map_t
typedef std::map< operator_t, trinary_functor_t > trinary_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_t> inv_binary_op_map_t
typedef std::multimap< std::string, details::base_operation_t, details::ilesscompare > base_ops_map_t
typedef std::set< std::string, details::ilesscompare > disabled_func_set_t
typedef details::T0oT1_define< T, cref_t, cref_t > vov_t
typedef details::T0oT1_define< T, const_t, cref_t > cov_t
typedef details::T0oT1_define< T, cref_t, const_t > voc_t
typedef details::T0oT1oT2_define< T, cref_t, cref_t, cref_t > vovov_t
typedef details::T0oT1oT2_define< T, cref_t, cref_t, const_t > vovoc_t
typedef details::T0oT1oT2_define< T, cref_t, const_t, cref_t > vocov_t
typedef details::T0oT1oT2_define< T, const_t, cref_t, cref_t > covov_t
typedef details::T0oT1oT2_define< T, const_t, cref_t, const_t > covoc_t
typedef details::T0oT1oT2_define< T, const_t, const_t, cref_t > cocov_t
typedef details::T0oT1oT2_define< T, cref_t, const_t, const_t > vococ_t
typedef details::T0oT1oT2oT3_define< T, cref_t, cref_t, cref_t, cref_t > vovovov_t
typedef details::T0oT1oT2oT3_define< T, cref_t, cref_t, cref_t, const_t > vovovoc_t
typedef details::T0oT1oT2oT3_define< T, cref_t, cref_t, const_t, cref_t > vovocov_t
typedef details::T0oT1oT2oT3_define< T, cref_t, const_t, cref_t, cref_t > vocovov_t
typedef details::T0oT1oT2oT3_define< T, const_t, cref_t, cref_t, cref_t > covovov_t
typedef details::T0oT1oT2oT3_define< T, const_t, cref_t, const_t, cref_t > covocov_t
typedef details::T0oT1oT2oT3_define< T, cref_t, const_t, cref_t, const_t > vocovoc_t
typedef details::T0oT1oT2oT3_define< T, const_t, cref_t, cref_t, const_t > covovoc_t
typedef details::T0oT1oT2oT3_define< T, cref_t, const_t, const_t, cref_t > vococov_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_t > immutable_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_t & results_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::type > error_list_
std::deque< bool > brkcnt_list_
parser_state state_
bool resolve_unknown_symbol_
results_context_t * results_context_
unknown_symbol_resolver * unknown_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_t > current_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 22524 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 22590 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 22595 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 22593 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 22594 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 22585 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 22586 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 22591 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 22592 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 22596 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 22597 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 22625 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 22612 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 22546 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 22618 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 22637 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 22549 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 22587 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 22598 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 22550 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 22588 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 22582 of file exprtk.hpp.

◆ const_t

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

Definition at line 22536 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 22629 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 22636 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 22646 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 22635 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 22648 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 22644 of file exprtk.hpp.

◆ cref_t

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

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

◆ expression_node_ptr

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

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

◆ expression_t

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

Definition at line 22603 of file exprtk.hpp.

◆ F

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

Definition at line 22537 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 22560 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 22563 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 22553 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 22556 of file exprtk.hpp.

◆ functor_t

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

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

◆ GF

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

Definition at line 22539 of file exprtk.hpp.

◆ ifunction_t

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

Definition at line 22540 of file exprtk.hpp.

◆ igeneric_function_t

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

Definition at line 22542 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 31155 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 31156 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 31154 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 22624 of file exprtk.hpp.

◆ ivararg_function_t

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

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

◆ operator_t

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

Definition at line 22615 of file exprtk.hpp.

◆ prsrhlpr_t

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

Definition at line 22653 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 22610 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 22548 of file exprtk.hpp.

◆ range_t

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

Definition at line 22577 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 22572 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 22574 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 22571 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 22573 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 22559 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 22562 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 22552 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 22555 of file exprtk.hpp.

◆ results_context_t

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

Definition at line 22651 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 22599 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 22600 of file exprtk.hpp.

◆ settings_t

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

Definition at line 24718 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 22621 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 22622 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 22584 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 22580 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 22581 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 22579 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 22565 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 22605 of file exprtk.hpp.

◆ symbol_table_t

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

Definition at line 22604 of file exprtk.hpp.

◆ token_t

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

Definition at line 22601 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 22611 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 22547 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 22619 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 22613 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 22545 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 22617 of file exprtk.hpp.

◆ VAF

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

Definition at line 22538 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 22566 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 22568 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 22570 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 22567 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 22569 of file exprtk.hpp.

◆ vector_holder_ptr

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

Definition at line 22607 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 22606 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 22575 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 22576 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 22630 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 22638 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 22649 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 22634 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 22647 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 22643 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 22628 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 22633 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 22642 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 22632 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 22641 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 22640 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 22558 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 22561 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 22551 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 22554 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 23845 of file exprtk.hpp.

23846 {
23847 e_ct_none = 0,
23848 e_ct_variables = 1,
23849 e_ct_functions = 2,
23851 };

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

23854 {
23855 e_st_unknown = 0,
23856 e_st_variable = 1,
23857 e_st_vector = 2,
23858 e_st_vecelem = 3,
23859 e_st_string = 4,
23860 e_st_function = 5,
23864 };

Constructor & Destructor Documentation

◆ parser() [1/2]

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

Definition at line 24720 of file exprtk.hpp.

24723 , results_context_(0)
24724 , unknown_symbol_resolver_(reinterpret_cast<unknown_symbol_resolver*>(0))
24725 #ifdef _MSC_VER
24726 #pragma warning(push)
24727 #pragma warning (disable:4355)
24728 #endif
24729 , sem_(*this)
24730 #ifdef _MSC_VER
24731 #pragma warning(pop)
24732 #endif
24738 , assert_check_(0)
24739 {
24741
24748
24749 expression_generator_.init_synthesize_map();
24750 expression_generator_.set_parser(*this);
24756 expression_generator_.set_strength_reduction_state(settings_.strength_reduction_enabled());
24757 }
sf4_map_t sf4_map_
Definition exprtk.hpp:42254
settings_store settings_
Definition exprtk.hpp:42237
void init_precompilation()
Definition exprtk.hpp:24762
binary_op_map_t binary_op_map_
Definition exprtk.hpp:42251
void load_unary_operations_map(unary_op_map_t &m)
Definition exprtk.hpp:42023
inv_binary_op_map_t inv_binary_op_map_
Definition exprtk.hpp:42252
void load_sf3_map(sf3_map_t &sf3_map)
Definition exprtk.hpp:42127
loop_runtime_check_ptr loop_runtime_check_
Definition exprtk.hpp:42273
lexer::helper::operator_joiner operator_joiner_3_
Definition exprtk.hpp:42266
unknown_symbol_resolver * unknown_symbol_resolver_
Definition exprtk.hpp:42247
vector_access_runtime_check_ptr vector_access_runtime_check_
Definition exprtk.hpp:42274
lexer::helper::operator_joiner operator_joiner_2_
Definition exprtk.hpp:42265
results_context_t * results_context_
Definition exprtk.hpp:42246
compilation_check_ptr compilation_check_ptr_
Definition exprtk.hpp:42275
sf3_map_t sf3_map_
Definition exprtk.hpp:42253
expression_generator< T > expression_generator_
Definition exprtk.hpp:42238
assert_check_ptr assert_check_
Definition exprtk.hpp:42276
void load_inv_binary_operations_map(inv_binary_op_map_t &m)
Definition exprtk.hpp:42099
void load_binary_operations_map(binary_op_map_t &m)
Definition exprtk.hpp:42071
unary_op_map_t unary_op_map_
Definition exprtk.hpp:42250
scope_element_manager sem_
Definition exprtk.hpp:42256
base_ops_map_t base_ops_map_
Definition exprtk.hpp:42249
void load_sf4_map(sf4_map_t &sf4_map)
Definition exprtk.hpp:42151
settings_store & settings()
Definition exprtk.hpp:25099
bool resolve_unknown_symbol_
Definition exprtk.hpp:42245

Referenced by exprtk::parser< T >::dependent_entity_collector::parser< T >, exprtk::parser< T >::parse_special_function_impl< Type, NumberOfParameters >::process(), exprtk::parser< T >::scope_element_manager::scope_element_manager(), exprtk::parser< T >::scope_handler::scope_handler(), exprtk::parser< T >::scoped_delete< Type, N >::scoped_delete(), exprtk::parser< T >::scoped_delete< Type, N >::scoped_delete(), exprtk::parser< T >::scoped_deq_delete< Type >::scoped_deq_delete(), exprtk::parser< T >::scoped_expression_delete::scoped_expression_delete(), exprtk::parser< T >::scoped_vec_delete< Type >::scoped_vec_delete(), and exprtk::parser< T >::stack_limit_handler::stack_limit_handler().

Here is the caller graph for this function:

◆ ~parser()

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

Definition at line 24759 of file exprtk.hpp.

24760 {}

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

31520 {
31521 if (
31522 expression &&
31523 (
31526 )
31527 )
31528 {
31530
31533 current_token(),
31534 "ERR240 - Invalid syntax '" + current_token().value + "' possible missing operator or context",
31536
31537 return error_node();
31538 }
31539
31540 return expression;
31541 }
const token_t & current_token() const
Definition exprtk.hpp:4458
void set_error(const parser_error::type &error_type)
Definition exprtk.hpp:41934
details::node_allocator node_allocator_
Definition exprtk.hpp:42239
static expression_node_ptr error_node()
Definition exprtk.hpp:25846

Referenced by exprtk::parser< Type >::parse_symbol(), and exprtk::parser< Type >::parse_vararg_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 25215 of file exprtk.hpp.

25216 {
25218 }

◆ clear_compilation_timeout_check()

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

Definition at line 25210 of file exprtk.hpp.

25211 {
25213 }

◆ clear_loop_runtime_check()

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

Definition at line 25200 of file exprtk.hpp.

25201 {
25203 }

◆ clear_vector_access_runtime_check()

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

Definition at line 25205 of file exprtk.hpp.

◆ compile() [1/2]

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

Definition at line 24826 of file exprtk.hpp.

24827 {
24828 state_ .reset();
24829 error_list_ .clear();
24830 brkcnt_list_ .clear();
24831 synthesis_error_ .clear();
24832 immutable_memory_map_.reset();
24833 immutable_symtok_map_.clear();
24834 current_state_stack_ .clear();
24835 assert_ids_ .clear();
24836 sem_ .cleanup();
24837
24839
24840 if (!valid_settings())
24841 {
24842 return false;
24843 }
24844
24846
24847 if (expression_string.empty())
24848 {
24851 "ERR001 - Empty expression!",
24853
24854 return false;
24855 }
24856
24857 if (!init(expression_string))
24858 {
24860 return false;
24861 }
24862
24863 if (lexer().empty())
24864 {
24867 "ERR002 - Empty expression!",
24869
24870 return false;
24871 }
24872
24874 {
24875 exprtk_debug(("halt_compilation_check() - compile checkpoint 0\n"));
24876 sem_.cleanup();
24877 return false;
24878 }
24879
24880 if (!run_assemblies())
24881 {
24882 sem_.cleanup();
24883 return false;
24884 }
24885
24887 {
24888 exprtk_debug(("halt_compilation_check() - compile checkpoint 1\n"));
24889 sem_.cleanup();
24890 return false;
24891 }
24892
24893 symtab_store_.symtab_list_ = expr.get_symbol_table_list();
24894 dec_.clear();
24895
24896 lexer().begin();
24897
24898 next_token();
24899
24901
24902 if ((0 != e) && (token_t::e_eof == current_token().type))
24903 {
24904 bool* retinvk_ptr = 0;
24905
24906 if (state_.return_stmt_present)
24907 {
24908 dec_.return_present_ = true;
24909
24911 .return_envelope(e, results_context_, retinvk_ptr);
24912 }
24913
24914 expr.set_expression(e);
24915 expr.set_retinvk(retinvk_ptr);
24916
24919
24920 return !(!expr);
24921 }
24922 else
24923 {
24924 if (error_list_.empty())
24925 {
24928 current_token(),
24929 "ERR003 - Invalid expression encountered",
24931 }
24932
24933 if ((0 != e) && branch_deletable(e))
24934 {
24935 destroy_node(e);
24936 }
24937
24938 dec_.clear ();
24939 sem_.cleanup ();
24941 expr = expression_t();
24942
24943 return false;
24944 }
24945 }
bool init(const std::string &str)
Definition exprtk.hpp:4417
std::set< std::string > assert_ids_
Definition exprtk.hpp:42277
expression_node_t * expression_node_ptr
Definition exprtk.hpp:22602
void return_cleanup()
Definition exprtk.hpp:42201
dependent_entity_collector dec_
Definition exprtk.hpp:42241
std::vector< state_t > current_state_stack_
Definition exprtk.hpp:42257
expression_node_ptr parse_corpus()
Definition exprtk.hpp:25301
std::deque< parser_error::type > error_list_
Definition exprtk.hpp:42242
void register_local_vars(expression< T > &e)
Definition exprtk.hpp:41955
void process_lexer_errors()
Definition exprtk.hpp:24955
immutable_symtok_map_t immutable_symtok_map_
Definition exprtk.hpp:42260
symtab_store symtab_store_
Definition exprtk.hpp:42240
expression< T > expression_t
Definition exprtk.hpp:22603
bool run_assemblies()
Definition exprtk.hpp:24992
parser_state state_
Definition exprtk.hpp:42244
std::string synthesis_error_
Definition exprtk.hpp:42255
void register_return_results(expression< T > &e)
Definition exprtk.hpp:42017
std::deque< bool > brkcnt_list_
Definition exprtk.hpp:42243
immutable_memory_map_t immutable_memory_map_
Definition exprtk.hpp:42259
bool valid_settings()
Definition exprtk.hpp:42214
bool halt_compilation_check()
Definition exprtk.hpp:25459
#define exprtk_debug(params)
Definition exprtk.hpp:64

Referenced by black_scholes_merton_model(), bubble_sort(), exprtk::details::collector_helper< T >::collection_pass(), exprtk::parser< Type >::compile(), exprtk::compute(), exprtk::compute(), exprtk::compute(), exprtk::compute(), e_10k_digits(), load_expression(), logic(), main(), pi_10k_digits(), exprtk::parser< T >::expression_generator< Type >::synthesize_cocov_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_covocov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covocov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covocov_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covocov_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covocov_expression4::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_covovoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovoc_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovoc_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovoc_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovoc_expression4::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovov_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovov_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovov_expression4::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococ_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococov_expression3::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_vocovoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovoc_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovoc_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovoc_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovoc_expression4::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovov_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovov_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovov_expression4::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_vovocov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovocov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovocov_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovocov_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovocov_expression4::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_vovovoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovoc_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovoc_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovoc_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovoc_expression4::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovov_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovov_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovov_expression4::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 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 24947 of file exprtk.hpp.

24948 {
24950 expression.register_symbol_table(symtab);
24952 return expression;
24953 }
bool compile(const std::string &expression_string, expression< T > &expr)
Definition exprtk.hpp:24826

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

25398 {
25399 std::string result = lexer().substr(begin_token.position,end_token.position);
25401 {
25402 for (std::size_t i = 0; i < result.size(); ++i)
25403 {
25404 if (details::is_whitespace(result[i])) result[i] = ' ';
25405 }
25406 }
25407
25408 return result;
25409 }

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

Here is the caller graph for this function:

◆ current_state()

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

Definition at line 25452 of file exprtk.hpp.

25453 {
25454 return (!current_state_stack_.empty()) ?
25455 current_state_stack_.back() :
25456 state_t();
25457 }

◆ dec()

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

Definition at line 25129 of file exprtk.hpp.

25130 {
25131 return dec_;
25132 }

Referenced by exprtk::details::collector_helper< T >::collection_pass().

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

25175 {
25178 }
unknown_symbol_resolver default_usr_
Definition exprtk.hpp:42248

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

25170 {
25172 }
void enable_unknown_symbol_resolver(unknown_symbol_resolver *usr=reinterpret_cast< unknown_symbol_resolver * >(0))
Definition exprtk.hpp:25159

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

25160 {
25162
25163 if (usr)
25165 else
25167 }

Referenced by exprtk::details::collector_helper< T >::collection_pass(), exprtk::parser< Type >::enable_unknown_symbol_resolver(), 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 25114 of file exprtk.hpp.

25115 {
25116 if (!error_list_.empty())
25117 {
25118 return error_list_[0].diagnostic;
25119 }
25120 else
25121 return std::string("No Error");
25122 }

Referenced by load_expression(), main(), 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 25124 of file exprtk.hpp.

25125 {
25126 return error_list_.size();
25127 }

◆ error_node()

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

Definition at line 25846 of file exprtk.hpp.

25847 {
25848 return reinterpret_cast<expression_node_ptr>(0);
25849 }

Referenced by exprtk::parser< T >::expression_generator< Type >::assert_call(), exprtk::parser< T >::expression_generator< Type >::cardinal_pow_optimisation_impl(), exprtk::parser< Type >::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< Type >::parse_assert_statement(), exprtk::parser< Type >::parse_base_operation(), exprtk::parser< Type >::parse_branch(), exprtk::parser< Type >::parse_break_statement(), exprtk::parser< Type >::parse_conditional_statement(), exprtk::parser< Type >::parse_conditional_statement_01(), exprtk::parser< Type >::parse_conditional_statement_02(), exprtk::parser< Type >::parse_const_string(), exprtk::parser< Type >::parse_continue_statement(), exprtk::parser< Type >::parse_corpus(), exprtk::parser< Type >::parse_define_constvar_statement(), exprtk::parser< Type >::parse_define_string_statement(), exprtk::parser< Type >::parse_define_var_statement(), exprtk::parser< Type >::parse_define_vector_statement(), exprtk::parser< Type >::parse_expression(), exprtk::parser< Type >::parse_for_loop(), exprtk::parser< Type >::parse_function_call(), exprtk::parser< Type >::parse_function_call_0(), exprtk::parser< Type >::parse_function_invocation(), exprtk::parser< Type >::parse_generic_function_call(), exprtk::parser< Type >::parse_multi_sequence(), exprtk::parser< Type >::parse_multi_switch_statement(), exprtk::parser< Type >::parse_not_statement(), exprtk::parser< Type >::parse_overload_function_call(), exprtk::parser< Type >::parse_pending_vector_index_operator(), exprtk::parser< Type >::parse_repeat_until_loop(), exprtk::parser< Type >::parse_return_statement(), exprtk::parser< Type >::parse_special_function(), exprtk::parser< Type >::parse_string(), exprtk::parser< Type >::parse_string_function_call(), exprtk::parser< Type >::parse_string_range_statement(), exprtk::parser< Type >::parse_swap_statement(), exprtk::parser< Type >::parse_switch_statement(), exprtk::parser< Type >::parse_symbol(), exprtk::parser< Type >::parse_symtab_symbol(), exprtk::parser< Type >::parse_ternary_conditional_statement(), exprtk::parser< Type >::parse_uninitialised_var_statement(), exprtk::parser< Type >::parse_vararg_function(), exprtk::parser< Type >::parse_vararg_function_call(), exprtk::parser< Type >::parse_vector(), exprtk::parser< Type >::parse_vector_index(), exprtk::parser< Type >::parse_while_loop(), exprtk::parser< T >::expression_generator< Type >::synthesize_binary_ext_expression::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_boc_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_coboc_expression::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_cocob_expression::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_cocov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_cocov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_cov_expression::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_covocov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covocov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covocov_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covocov_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covocov_expression4::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_covovoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovoc_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovoc_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovoc_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovoc_expression4::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovov_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovov_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovov_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 >::expression_generator< Type >::synthesize_vob_expression::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_voc_expression::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococ_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococ_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococov_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococov_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococov_expression4::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_vocovoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovoc_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovoc_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovoc_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovoc_expression4::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovov_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovov_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovov_expression4::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vov_expression::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_vovocov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovocov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovocov_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovocov_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovocov_expression4::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_vovovoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovoc_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovoc_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovoc_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovoc_expression4::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovov_expression1::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovov_expression2::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovov_expression3::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vovovov_expression4::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< Type >::simplify(), exprtk::parser< Type >::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< Type >::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 25104 of file exprtk.hpp.

25105 {
25106 if (index < error_list_.size())
25107 {
25108 return error_list_[index];
25109 }
25110
25111 throw std::invalid_argument("parser::get_error() - Invalid error index specified");
25112 }

◆ halt_compilation_check()

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

Definition at line 25459 of file exprtk.hpp.

25460 {
25462
25463 if (compilation_check_ptr_ && !compilation_check_ptr_->continue_compilation(context))
25464 {
25466 !context.error_message.empty() ? " Details: " + context.error_message : "";
25467
25470 token_t(),
25471 "ERR011 - Internal compilation check failed." + error_message,
25473
25474 return true;
25475 }
25476
25477 return false;
25478 }
lexer::token token_t
Definition exprtk.hpp:22601

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

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

26882 {
26883 assert(!brkcnt_list_.empty());
26884 brkcnt_list_.pop_front();
26885 }

Referenced by exprtk::parser< Type >::parse_for_loop(), exprtk::parser< Type >::parse_repeat_until_loop(), and exprtk::parser< Type >::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 24762 of file exprtk.hpp.

24763 {
24764 dec_.collect_variables() =
24765 settings_.collect_variables_enabled();
24766
24767 dec_.collect_functions() =
24768 settings_.collect_functions_enabled();
24769
24770 dec_.collect_assignments() =
24771 settings_.collect_assignments_enabled();
24772
24773 if (settings_.replacer_enabled())
24774 {
24775 symbol_replacer_.clear();
24776 symbol_replacer_.add_replace("true" , "1", lexer::token::e_number);
24777 symbol_replacer_.add_replace("false", "0", lexer::token::e_number);
24778 helper_assembly_.token_modifier_list.clear();
24779 helper_assembly_.register_modifier(&symbol_replacer_);
24780 }
24781
24782 if (settings_.commutative_check_enabled())
24783 {
24785 {
24787 }
24788
24789 helper_assembly_.token_inserter_list.clear();
24790 helper_assembly_.register_inserter(&commutative_inserter_);
24791 }
24792
24793 if (settings_.joiner_enabled())
24794 {
24795 helper_assembly_.token_joiner_list.clear();
24796 helper_assembly_.register_joiner(&operator_joiner_2_);
24797 helper_assembly_.register_joiner(&operator_joiner_3_);
24798 }
24799
24800 if (
24801 settings_.numeric_check_enabled () ||
24802 settings_.bracket_check_enabled () ||
24803 settings_.sequence_check_enabled()
24804 )
24805 {
24806 helper_assembly_.token_scanner_list.clear();
24807
24808 if (settings_.numeric_check_enabled())
24809 {
24810 helper_assembly_.register_scanner(&numeric_checker_);
24811 }
24812
24813 if (settings_.bracket_check_enabled())
24814 {
24815 helper_assembly_.register_scanner(&bracket_checker_);
24816 }
24817
24818 if (settings_.sequence_check_enabled())
24819 {
24820 helper_assembly_.register_scanner(&sequence_validator_ );
24822 }
24823 }
24824 }
lexer::helper::bracket_checker bracket_checker_
Definition exprtk.hpp:42268
lexer::helper::symbol_replacer symbol_replacer_
Definition exprtk.hpp:42267
lexer::helper::sequence_validator sequence_validator_
Definition exprtk.hpp:42270
lexer::helper::commutative_inserter commutative_inserter_
Definition exprtk.hpp:42264
lexer::helper::sequence_validator_3tokens sequence_validator_3tkns_
Definition exprtk.hpp:42271
lexer::helper::numeric_checker< T > numeric_checker_
Definition exprtk.hpp:42269
lexer::helper::helper_assembly helper_assembly_
Definition exprtk.hpp:42262

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

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

25269 {
25270 return settings_.arithmetic_disabled(operation);
25271 }

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

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

25274 {
25275 return settings_.assignment_disabled(operation);
25276 }

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

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

25279 {
25280 return settings_.inequality_disabled(operation);
25281 }

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

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

25264 {
25265 return settings_.logic_disabled(operation);
25266 }

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

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

Referenced by exprtk::parser< Type >::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 42099 of file exprtk.hpp.

Referenced by exprtk::parser< Type >::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 42127 of file exprtk.hpp.

42128 {
42130
42131 #define register_sf3(Op) \
42132 sf3_map[details::sf##Op##_op<T>::id()] = pair_t(details::sf##Op##_op<T>::process,details::e_sf##Op); \
42133
42142 #undef register_sf3
42143
42144 #define register_sf3_extid(Id, Op) \
42145 sf3_map[Id] = pair_t(details::sf##Op##_op<T>::process,details::e_sf##Op); \
42146
42147 register_sf3_extid("(t-t)-t",23) // (t-t)-t --> t-(t+t)
42148 #undef register_sf3_extid
42149 }
#define register_sf3_extid(Id, Op)
#define register_sf3(Op)

Referenced by exprtk::parser< Type >::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 42151 of file exprtk.hpp.

42152 {
42154
42155 #define register_sf4(Op) \
42156 sf4_map[details::sf##Op##_op<T>::id()] = pair_t(details::sf##Op##_op<T>::process,details::e_sf##Op); \
42157
42167 #undef register_sf4
42168
42169 #define register_sf4ext(Op) \
42170 sf4_map[details::sfext##Op##_op<T>::id()] = pair_t(details::sfext##Op##_op<T>::process,details::e_sf4ext##Op); \
42171
42188 #undef register_sf4ext
42189 }
#define register_sf4(Op)
#define register_sf4ext(Op)

Referenced by exprtk::parser< Type >::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 42023 of file exprtk.hpp.

42024 {
42025 #define register_unary_op(Op, UnaryFunctor) \
42026 m.insert(std::make_pair(Op,UnaryFunctor<T>::process)); \
42027
42068 #undef register_unary_op
42069 }
#define register_unary_op(Op, UnaryFunctor)

Referenced by exprtk::parser< Type >::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 30025 of file exprtk.hpp.

30026 {
30027 const scope_element& se = sem_.get_element(symbol);
30028 return (se.name == symbol) && se.active;
30029 }

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

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

31176 {
31177 immutable_memory_map_.add_interval(interval);
31179 }

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

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

◆ make_memory_range() [1/3]

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

Definition at line 31158 of file exprtk.hpp.

31159 {
31160 const T* begin = reinterpret_cast<const T*>(&t);
31161 const T* end = begin + 1;
31162 return interval_t(begin, end);
31163 }
interval_container_t< constvoid * >::interval_t interval_t
Definition exprtk.hpp:31154

Referenced by exprtk::parser< Type >::parse_string(), exprtk::parser< Type >::parse_symtab_symbol(), and exprtk::parser< Type >::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 31165 of file exprtk.hpp.

31166 {
31167 return interval_t(begin, begin + size);
31168 }

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

31171 {
31172 return interval_t(begin, begin + size);
31173 }

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

30887 {
30889
30890 if (state_.parsing_assert_stmt)
30891 {
30894 current_token(),
30895 "ERR219 - Assert statement within an assert statement is not allowed",
30897
30898 return error_node();
30899 }
30900
30901 scoped_bool_negator sbn(state_.parsing_assert_stmt);
30902
30903 next_token();
30904
30907
30911
30913 {
30916 current_token(),
30917 "ERR220 - Expected '(' at start of assert statement",
30919
30920 return error_node();
30921 }
30922
30924
30925 // Parse the assert condition
30926 if (0 == (assert_condition = parse_expression()))
30927 {
30930 current_token(),
30931 "ERR221 - Failed to parse condition for assert statement",
30933
30934 return error_node();
30935 }
30936
30938
30940 {
30942 {
30945 current_token(),
30946 "ERR222 - Expected ',' between condition and message for assert statement",
30948
30949 return error_node();
30950 }
30951 // Parse the assert message
30952 else if (
30953 (0 == (assert_message = parse_expression())) ||
30955 )
30956 {
30959 current_token(),
30960 "ERR223 - " +
30962 std::string("Expected string for assert message") :
30963 std::string("Failed to parse message for assert statement")),
30965
30966 return error_node();
30967 }
30968 else if (!token_is(token_t::e_rbracket))
30969 {
30971 {
30974 current_token(),
30975 "ERR224 - Expected ',' between message and ID for assert statement",
30977
30978 return error_node();
30979 }
30980 // Parse assert ID
30981 else if (
30982 (0 == (assert_id = parse_expression())) ||
30984 )
30985 {
30988 current_token(),
30989 "ERR225 - " +
30990 (assert_id ?
30991 std::string("Expected literal string for assert ID") :
30992 std::string("Failed to parse string for assert ID")),
30994
30995 return error_node();
30996 }
30997 else if (!token_is(token_t::e_rbracket))
30998 {
31001 current_token(),
31002 "ERR226 - Expected ')' at start of assert statement",
31004
31005 return error_node();
31006 }
31007 }
31008 }
31009
31011 context.condition = lexer().substr(start_token.position, end_token.position);
31012 context.offet = start_token.position;
31013
31014 if (0 == assert_check_)
31015 {
31016 exprtk_debug(("parse_assert_statement() - assert functionality is disabled. assert condition: %s\n",
31017 context.condition.c_str()));
31018
31019 return new details::null_node<T>();
31020 }
31021
31022 #ifndef exprtk_disable_string_capabilities
31024 {
31025 context.message = dynamic_cast<details::string_base_node<T>*>(assert_message)->str();
31026 }
31027
31029 {
31030 context.id = dynamic_cast<details::string_base_node<T>*>(assert_id)->str();
31031
31032 if (assert_ids_.end() != assert_ids_.find(context.id))
31033 {
31036 current_token(),
31037 "ERR227 - Duplicate assert ID: " + context.id,
31039
31040 return error_node();
31041 }
31042
31043 assert_ids_.insert(context.id);
31045 }
31046 #endif
31047
31049 expression_generator_.assert_call(
31052 context);
31053
31054 exprtk_debug(("parse_assert_statement() - assert condition: [%s]\n", context.condition.c_str() ));
31055 exprtk_debug(("parse_assert_statement() - assert message: [%s]\n", context.message .c_str() ));
31056 exprtk_debug(("parse_assert_statement() - assert id: [%s]\n", context.id .c_str() ));
31057 exprtk_debug(("parse_assert_statement() - assert offset: [%d]\n", static_cast<int>(context.offet)));
31058
31059 if (0 == result_node)
31060 {
31063 current_token(),
31064 "ERR228 - Failed to synthesize assert",
31066
31067 return error_node();
31068 }
31069
31070 svd.delete_ptr = false;
31071 return result_node;
31072 }
bool token_is(const token_t::token_type &ttype, const token_advance_mode mode=e_advance)
Definition exprtk.hpp:4482
expression_node_ptr parse_expression(precedence_level precedence=e_level00)
Definition exprtk.hpp:25480

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

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

26202 {
26204
26206
26207 next_token();
26208
26210 {
26213 current_token(),
26214 "ERR029 - Expected a '(' at start of function call to '" + function_name +
26215 "', instead got: '" + current_token().value + "'",
26217
26218 return 0;
26219 }
26220
26222 {
26225 current_token(),
26226 "ERR030 - Expected at least one input parameter for function call '" + function_name + "'",
26228
26229 return 0;
26230 }
26231
26233
26235 {
26237
26238 if (0 == param_list[param_index])
26239 return 0;
26240 else if (token_is(token_t::e_rbracket))
26241 {
26242 sd.delete_ptr = false;
26243 break;
26244 }
26245 else if (token_is(token_t::e_comma))
26246 continue;
26247 else
26248 {
26251 current_token(),
26252 "ERR031 - Expected a ',' between function input parameters, instead got: '" + current_token().value + "'",
26254
26255 return 0;
26256 }
26257 }
26258
26259 if (sd.delete_ptr)
26260 {
26263 current_token(),
26264 "ERR032 - Invalid number of input parameters passed to function '" + function_name + "'",
26266
26267 return 0;
26268 }
26269
26270 return (param_index + 1);
26271 }

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

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

26274 {
26276
26279
26281
26282 if (0 == std::distance(itr_range.first,itr_range.second))
26283 {
26287 "ERR033 - No entry found for base operation: " + operation_name,
26289
26290 return error_node();
26291 }
26292
26293 static const std::size_t MaxNumberofParameters = 4;
26295
26297
26299 {
26300 for (base_ops_map_t::iterator itr = itr_range.first; itr != itr_range.second; ++itr)
26301 {
26302 const details::base_operation_t& operation = itr->second;
26303
26304 if (operation.num_params == parameter_count)
26305 {
26306 switch (parameter_count)
26307 {
26308 #define base_opr_case(N) \
26309 case N : { \
26310 expression_node_ptr pl##N[N] = {0}; \
26311 std::copy(param_list, param_list + N, pl##N); \
26312 lodge_symbol(operation_name, e_st_function); \
26313 return expression_generator_(operation.type, pl##N); \
26314 } \
26315
26316 base_opr_case(1)
26317 base_opr_case(2)
26318 base_opr_case(3)
26319 base_opr_case(4)
26320 #undef base_opr_case
26321 }
26322 }
26323 }
26324 }
26325
26326 for (std::size_t i = 0; i < MaxNumberofParameters; ++i)
26327 {
26329 }
26330
26334 "ERR034 - Invalid number of input parameters for call to function: '" + operation_name + "'",
26336
26337 return error_node();
26338 }
std::size_t parse_base_function_call(expression_node_ptr(&param_list)[MaxNumberofParameters], const std::string &function_name="")
Definition exprtk.hpp:26201
#define base_opr_case(N)

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

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

31670 {
31671 stack_limit_handler slh(*this);
31672
31673 if (!slh)
31674 {
31675 return error_node();
31676 }
31677
31679
31681 {
31682 T numeric_value = T(0);
31683
31685 {
31687
31688 if (0 == literal_exp)
31689 {
31692 current_token(),
31693 "ERR242 - Failed generate node for scalar: '" + current_token().value + "'",
31695
31696 return error_node();
31697 }
31698
31699 next_token();
31701 }
31702 else
31703 {
31706 current_token(),
31707 "ERR243 - Failed to convert '" + current_token().value + "' to a number",
31709
31710 return error_node();
31711 }
31712 }
31713 else if (token_t::e_symbol == current_token().type)
31714 {
31715 branch = parse_symbol();
31716 }
31717 #ifndef exprtk_disable_string_capabilities
31718 else if (token_t::e_string == current_token().type)
31719 {
31721 }
31722 #endif
31724 {
31725 next_token();
31726
31727 if (0 == (branch = parse_expression()))
31728 {
31729 return error_node();
31730 }
31731
31733
31735 {
31738 current_token(),
31739 "ERR244 - Expected ')' instead of: '" + current_token().value + "'",
31741
31743
31744 return error_node();
31745 }
31747 {
31749
31750 return error_node();
31751 }
31752
31754 }
31756 {
31757 next_token();
31758
31759 if (0 == (branch = parse_expression()))
31760 return error_node();
31762 {
31765 current_token(),
31766 "ERR245 - Expected ']' instead of: '" + current_token().value + "'",
31768
31770
31771 return error_node();
31772 }
31774 {
31776
31777 return error_node();
31778 }
31779 }
31781 {
31782 next_token();
31783
31784 if (0 == (branch = parse_expression()))
31785 return error_node();
31787 {
31790 current_token(),
31791 "ERR246 - Expected '}' instead of: '" + current_token().value + "'",
31793
31795
31796 return error_node();
31797 }
31799 {
31801
31802 return error_node();
31803 }
31804 }
31805 else if (token_t::e_sub == current_token().type)
31806 {
31807 next_token();
31809
31810 if (
31811 branch &&
31812 !(
31815 )
31816 )
31817 {
31819
31820 if (0 == result)
31821 {
31823
31824 return error_node();
31825 }
31826 else
31827 branch = result;
31828 }
31829 }
31830 else if (token_t::e_add == current_token().type)
31831 {
31832 next_token();
31834 }
31835 else if (token_t::e_eof == current_token().type)
31836 {
31839 current_token(),
31840 "ERR247 - Premature end of expression[1]",
31842
31843 return error_node();
31844 }
31845 else
31846 {
31849 current_token(),
31850 "ERR248 - Premature end of expression[2]",
31852
31853 return error_node();
31854 }
31855
31856 if (
31857 branch &&
31858 (e_level00 == precedence) &&
31860 )
31861 {
31863 }
31864
31866
31867 return branch;
31868 }
expression_node_ptr parse_const_string()
Definition exprtk.hpp:28377
void parse_pending_vector_index_operator(expression_node_ptr &expression)
Definition exprtk.hpp:27860
bool post_bracket_process(const typename token_t::token_type &token, expression_node_ptr &branch)
Definition exprtk.hpp:31099
bool simplify_unary_negation_branch(expression_node_ptr &node)
Definition exprtk.hpp:25791
expression_node_ptr parse_ternary_conditional_statement(expression_node_ptr condition)
Definition exprtk.hpp:26745
expression_node_ptr parse_symbol()
Definition exprtk.hpp:31543
bool parse_pending_string_rangesize(expression_node_ptr &expression)
Definition exprtk.hpp:27838
void free_node(NodeAllocator &, expression_node< T > *&node)
Definition exprtk.hpp:6173

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

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

29367 {
29368 if (state_.parsing_break_stmt)
29369 {
29372 current_token(),
29373 "ERR151 - Invoking 'break' within a break call is not allowed",
29375
29376 return error_node();
29377 }
29378 else if (0 == state_.parsing_loop_stmt_count)
29379 {
29382 current_token(),
29383 "ERR152 - Invalid use of 'break', allowed only in the scope of a loop",
29385
29386 return error_node();
29387 }
29388
29389 scoped_bool_negator sbn(state_.parsing_break_stmt);
29390
29391 if (!brkcnt_list_.empty())
29392 {
29393 next_token();
29394
29395 brkcnt_list_.front() = true;
29396
29398
29400 {
29401 if (0 == (return_expr = parse_expression()))
29402 {
29405 current_token(),
29406 "ERR153 - Failed to parse return expression for 'break' statement",
29408
29409 return error_node();
29410 }
29412 {
29415 current_token(),
29416 "ERR154 - Expected ']' at the completion of break's return expression",
29418
29420
29421 return error_node();
29422 }
29423 }
29424
29425 state_.activate_side_effect("parse_break_statement()");
29426
29428 }
29429 else
29430 {
29433 current_token(),
29434 "ERR155 - Invalid use of 'break', allowed only in the scope of a loop",
29436 }
29437
29438 return error_node();
29439 }

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

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

26683 {
26685
26686 next_token();
26687
26689 {
26692 current_token(),
26693 "ERR053 - Expected '(' at start of if-statement, instead got: '" + current_token().value + "'",
26695
26696 return error_node();
26697 }
26698 else if (0 == (condition = parse_expression()))
26699 {
26702 current_token(),
26703 "ERR054 - Failed to parse condition for if-statement",
26705
26706 return error_node();
26707 }
26709 {
26710 // if (x,y,z)
26712 }
26713 else if (token_is(token_t::e_rbracket))
26714 {
26715 /*
26716 00. if (x) y;
26717 01. if (x) y; else z;
26718 02. if (x) y; else {z0; ... zn;}
26719 03. if (x) y; else if (z) w;
26720 04. if (x) y; else if (z) w; else u;
26721 05. if (x) y; else if (z) w; else {u0; ... un;}
26722 06. if (x) y; else if (z) {w0; ... wn;}
26723 07. if (x) {y0; ... yn;}
26724 08. if (x) {y0; ... yn;} else z;
26725 09. if (x) {y0; ... yn;} else {z0; ... zn;};
26726 10. if (x) {y0; ... yn;} else if (z) w;
26727 11. if (x) {y0; ... yn;} else if (z) w; else u;
26728 12. if (x) {y0; ... nex;} else if (z) w; else {u0 ... un;}
26729 13. if (x) {y0; ... yn;} else if (z) {w0; ... wn;}
26730 */
26732 }
26733
26736 current_token(),
26737 "ERR055 - Invalid if-statement",
26739
26741
26742 return error_node();
26743 }
expression_node_ptr parse_conditional_statement_01(expression_node_ptr condition)
Definition exprtk.hpp:26340
expression_node_ptr parse_conditional_statement_02(expression_node_ptr condition)
Definition exprtk.hpp:26476

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

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

26341 {
26342 // Parse: [if][(][condition][,][consequent][,][alternative][)]
26343
26346
26347 bool result = true;
26348
26350 {
26353 current_token(),
26354 "ERR035 - Expected ',' between if-statement condition and consequent",
26356
26357 result = false;
26358 }
26359 else if (0 == (consequent = parse_expression()))
26360 {
26363 current_token(),
26364 "ERR036 - Failed to parse consequent for if-statement",
26366
26367 result = false;
26368 }
26369 else if (!token_is(token_t::e_comma))
26370 {
26373 current_token(),
26374 "ERR037 - Expected ',' between if-statement consequent and alternative",
26376
26377 result = false;
26378 }
26379 else if (0 == (alternative = parse_expression()))
26380 {
26383 current_token(),
26384 "ERR038 - Failed to parse alternative for if-statement",
26386
26387 result = false;
26388 }
26389 else if (!token_is(token_t::e_rbracket))
26390 {
26393 current_token(),
26394 "ERR039 - Expected ')' at the end of if-statement",
26396
26397 result = false;
26398 }
26399
26400 #ifndef exprtk_disable_string_capabilities
26401 if (result)
26402 {
26405
26407 {
26409 {
26412 .conditional_string(condition, consequent, alternative);
26413
26414 if (result_node && result_node->valid())
26415 {
26416 return result_node;
26417 }
26418
26421 current_token(),
26422 "ERR040 - Failed to synthesize node: conditional_string",
26424
26426 return error_node();
26427 }
26428
26431 current_token(),
26432 "ERR041 - Return types of if-statement differ: string/non-string",
26434
26435 result = false;
26436 }
26437 }
26438 #endif
26439
26440 if (result)
26441 {
26444
26446 {
26448 {
26450 .conditional_vector(condition, consequent, alternative);
26451 }
26452
26455 current_token(),
26456 "ERR042 - Return types of if-statement differ: vector/non-vector",
26458
26459 result = false;
26460 }
26461 }
26462
26463 if (!result)
26464 {
26468
26469 return error_node();
26470 }
26471 else
26473 .conditional(condition, consequent, alternative);
26474 }

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

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

26477 {
26480
26481 bool result = true;
26482
26484 {
26485 if (0 == (consequent = parse_multi_sequence("if-statement-01")))
26486 {
26489 current_token(),
26490 "ERR043 - Failed to parse body of consequent for if-statement",
26492
26493 result = false;
26494 }
26495 else if
26496 (
26497 !settings_.commutative_check_enabled() &&
26498 !token_is("else",prsrhlpr_t::e_hold) &&
26505 )
26506 {
26509 current_token(),
26510 "ERR044 - Expected ';' at the end of the consequent for if-statement (1)",
26512
26513 result = false;
26514 }
26515 }
26516 else
26517 {
26518 if (
26519 settings_.commutative_check_enabled() &&
26521 )
26522 {
26523 next_token();
26524 }
26525
26526 if (0 != (consequent = parse_expression()))
26527 {
26529 {
26532 current_token(),
26533 "ERR045 - Expected ';' at the end of the consequent for if-statement (2)",
26535
26536 result = false;
26537 }
26538 }
26539 else
26540 {
26543 current_token(),
26544 "ERR046 - Failed to parse body of consequent for if-statement",
26546
26547 result = false;
26548 }
26549 }
26550
26551 if (result)
26552 {
26553 if (
26556 )
26557 {
26558 next_token();
26559
26560 if (details::imatch(current_token().value,"else"))
26561 {
26562 next_token();
26563 }
26564
26566 {
26567 if (0 == (alternative = parse_multi_sequence("else-statement-01")))
26568 {
26571 current_token(),
26572 "ERR047 - Failed to parse body of the 'else' for if-statement",
26574
26575 result = false;
26576 }
26577 }
26578 else if (details::imatch(current_token().value,"if"))
26579 {
26581 {
26584 current_token(),
26585 "ERR048 - Failed to parse body of if-else statement",
26587
26588 result = false;
26589 }
26590 }
26591 else if (0 != (alternative = parse_expression()))
26592 {
26593 if (
26597 )
26598 {
26601 current_token(),
26602 "ERR049 - Expected ';' at the end of the 'else-if' for the if-statement",
26604
26605 result = false;
26606 }
26607 }
26608 else
26609 {
26612 current_token(),
26613 "ERR050 - Failed to parse body of the 'else' for if-statement",
26615
26616 result = false;
26617 }
26618 }
26619 }
26620
26621 #ifndef exprtk_disable_string_capabilities
26622 if (result)
26623 {
26626
26628 {
26630 {
26632 .conditional_string(condition, consequent, alternative);
26633 }
26634
26637 current_token(),
26638 "ERR051 - Return types of if-statement differ: string/non-string",
26640
26641 result = false;
26642 }
26643 }
26644 #endif
26645
26646 if (result)
26647 {
26650
26652 {
26654 {
26656 .conditional_vector(condition, consequent, alternative);
26657 }
26658
26661 current_token(),
26662 "ERR052 - Return types of if-statement differ: vector/non-vector",
26664
26665 result = false;
26666 }
26667 }
26668
26669 if (!result)
26670 {
26674
26675 return error_node();
26676 }
26677 else
26679 .conditional(condition, consequent, alternative);
26680 }
bool token_is_loop(const token_advance_mode mode=e_advance)
Definition exprtk.hpp:4608
bool token_is_arithmetic_opr(const token_advance_mode mode=e_advance)
Definition exprtk.hpp:4524
bool token_is_right_bracket(const token_advance_mode mode=e_advance)
Definition exprtk.hpp:4575
bool token_is_ineq_opr(const token_advance_mode mode=e_advance)
Definition exprtk.hpp:4542
bool peek_token_is(const token_t::token_type &ttype)
Definition exprtk.hpp:4615
expression_node_ptr parse_conditional_statement()
Definition exprtk.hpp:26682
expression_node_ptr parse_multi_sequence(const std::string &source="", const bool enforce_crlbrackets=false)
Definition exprtk.hpp:27999

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

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

28378 {
28379 const std::string const_str = current_token().value;
28381
28383 {
28384 next_token();
28385
28387 {
28388 next_token();
28389 next_token();
28390
28392
28393 return expression_generator_(T(const_str.size()));
28394 }
28395
28396 range_t rp;
28397
28398 if (!parse_range(rp))
28399 {
28401 rp.free();
28402
28403 return error_node();
28404 }
28405
28407
28408 if (rp.n1_c.first && (rp.n1_c.second == std::numeric_limits<std::size_t>::max()))
28409 {
28410 rp.n1_c.second = const_str.size();
28411 rp.cache.second = rp.n1_c.second;
28412 }
28413
28414 if (
28415 (rp.n0_c.first && (rp.n0_c.second >= const_str.size())) ||
28416 (rp.n1_c.first && (rp.n1_c.second > const_str.size()))
28417 )
28418 {
28421 current_token(),
28422 "ERR122 - Overflow in range for string: '" + const_str + "'[" +
28423 (rp.n0_c.first ? details::to_str(static_cast<int>(rp.n0_c.second)) : "?") + ":" +
28424 (rp.n1_c.first ? details::to_str(static_cast<int>(rp.n1_c.second)) : "?") + "]",
28426
28427 rp.free();
28428
28429 return error_node();
28430 }
28431
28433
28434 if (result)
28435 rp.clear();
28436 }
28437 else
28438 next_token();
28439
28440 return result;
28441 }
bool parse_range(range_t &rp, const bool skip_lsqr=false)
Definition exprtk.hpp:28080
details::range_pack< T > range_t
Definition exprtk.hpp:22577

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

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

29442 {
29443 if (0 == state_.parsing_loop_stmt_count)
29444 {
29447 current_token(),
29448 "ERR156 - Invalid use of 'continue', allowed only in the scope of a loop",
29450
29451 return error_node();
29452 }
29453 else
29454 {
29455 next_token();
29456
29457 brkcnt_list_.front() = true;
29458 state_.activate_side_effect("parse_continue_statement()");
29459
29460 return node_allocator_.allocate<details::continue_node<T> >();
29461 }
29462 }

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

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

25302 {
25305
25307
25310
25311 for ( ; ; )
25312 {
25313 state_.side_effect_present = false;
25314
25316
25318
25319 if (0 == arg)
25320 {
25321 if (error_list_.empty())
25322 {
25325 current_token(),
25326 "ERR009 - Invalid expression encountered",
25328 }
25329
25330 return error_node();
25331 }
25332 else
25333 {
25334 arg_list.push_back(arg);
25335
25336 side_effect_list.push_back(state_.side_effect_present);
25337
25339
25341
25342 exprtk_debug(("parse_corpus(%02d) Subexpr: %s\n",
25343 static_cast<int>(arg_list.size() - 1),
25344 sub_expr.c_str()));
25345
25346 exprtk_debug(("parse_corpus(%02d) - Side effect present: %s\n",
25347 static_cast<int>(arg_list.size() - 1),
25348 state_.side_effect_present ? "true" : "false"));
25349
25350 exprtk_debug(("-------------------------------------------------\n"));
25351 }
25352
25354 {
25355 if (lexer().finished())
25356 break;
25357 else
25358 next_token();
25359 }
25360 else if (
25361 !settings_.commutative_check_enabled() &&
25362 (
25367 )
25368 )
25369 {
25372 current_token(),
25373 "ERR010 - Invalid syntax '" + current_token().value + "' possible missing operator or context",
25375
25376 return error_node();
25377 }
25378 }
25379
25380 if (
25381 !arg_list.empty() &&
25382 is_return_node(arg_list.back())
25383 )
25384 {
25385 dec_.final_stmt_return_ = true;
25386 }
25387
25389
25390 svd.delete_ptr = (0 == result);
25391
25392 return result;
25393 }
bool token_is_bracket(const token_advance_mode mode=e_advance)
Definition exprtk.hpp:4590
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:27916
std::string construct_subexpr(lexer::token &begin_token, lexer::token &end_token, const bool cleanup_whitespace=true)
Definition exprtk.hpp:25395

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

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

30234 {
30235 if (settings_.vardef_disabled())
30236 {
30239 current_token(),
30240 "ERR187 - Illegal const variable definition",
30242
30243 return error_node();
30244 }
30245 else if (!token_is("const"))
30246 {
30249 current_token(),
30250 "ERR188 - Expected 'const' keyword for const-variable definition",
30252
30253 return error_node();
30254 }
30255 else if (!token_is("var"))
30256 {
30259 current_token(),
30260 "ERR189 - Expected 'var' keyword for const-variable definition",
30262
30263 return error_node();
30264 }
30265
30266 const std::string var_name = current_token().value;
30267
30269
30271 {
30274 current_token(),
30275 "ERR190 - Expected a symbol for const-variable definition",
30277
30278 return error_node();
30279 }
30281 {
30284 current_token(),
30285 "ERR191 - Illegal redefinition of reserved keyword: '" + var_name + "'",
30287
30288 return error_node();
30289 }
30290 else if (symtab_store_.symbol_exists(var_name))
30291 {
30294 current_token(),
30295 "ERR192 - Illegal redefinition of variable '" + var_name + "'",
30297
30298 return error_node();
30299 }
30301 {
30304 current_token(),
30305 "ERR193 - Illegal redefinition of local variable: '" + var_name + "'",
30307
30308 return error_node();
30309 }
30310 else if (!token_is(token_t::e_assign))
30311 {
30314 current_token(),
30315 "ERR194 - Expected assignment operator after const-variable: '" + var_name + "' definition",
30317
30318 return error_node();
30319 }
30320 else if (0 == (initialisation_expression = parse_expression()))
30321 {
30324 current_token(),
30325 "ERR195 - Failed to parse initialisation expression for const-variable: '" + var_name + "'",
30327
30328 return error_node();
30329 }
30330
30332 {
30335 current_token(),
30336 "ERR196 - initialisation expression for const-variable: '" + var_name + "' must be a constant/literal",
30338
30340
30341 return error_node();
30342 }
30343
30345
30346 const T init_value = initialisation_expression->value();
30347
30349
30350 expression_node_ptr var_node = reinterpret_cast<expression_node_ptr>(0);
30351
30352 scope_element& se = sem_.get_element(var_name);
30353
30354 if (se.name == var_name)
30355 {
30356 if (se.active)
30357 {
30360 current_token(),
30361 "ERR197 - Illegal redefinition of local variable: '" + var_name + "'",
30363
30364 return error_node();
30365 }
30366 else if (scope_element::e_literal == se.type)
30367 {
30368 var_node = se.var_node;
30369 se.active = true;
30370 se.depth = state_.scope_depth;
30371 se.ref_count++;
30372 }
30373 }
30374
30375 if (0 == var_node)
30376 {
30377 const std::size_t predicted_total_lclsymb_size = sizeof(T) + sem_.total_local_symb_size_bytes();
30378
30380 {
30383 current_token(),
30384 "ERR198 - Adding variable '" + var_name + "' "
30385 "will exceed max total local symbol size of: " + details::to_str(settings().max_total_local_symbol_size_bytes()) + " bytes, "
30386 "current total size: " + details::to_str(sem_.total_local_symb_size_bytes()) + " bytes",
30388
30389 return error_node();
30390 }
30391
30393 nse.name = var_name;
30394 nse.active = true;
30395 nse.ref_count = 1;
30397 nse.depth = state_.scope_depth;
30398 nse.data = 0;
30399 nse.var_node = node_allocator_.allocate<literal_node_t>(init_value);
30400
30401 if (!sem_.add_element(nse))
30402 {
30405 current_token(),
30406 "ERR199 - Failed to add new local const-variable '" + var_name + "' to SEM",
30408
30409 sem_.free_element(nse);
30410
30411 return error_node();
30412 }
30413
30414 assert(sem_.total_local_symb_size_bytes() <= settings().max_total_local_symbol_size_bytes());
30415
30416 var_node = nse.var_node;
30417
30418 exprtk_debug(("parse_define_constvar_statement() - INFO - Added new local const-variable: %s\n", nse.name.c_str()));
30419 }
30420
30421 state_.activate_side_effect("parse_define_constvar_statement()");
30422
30424
30425 return expression_generator_(var_node->value());
30426 }
void lodge_symbol(const std::string &symbol, const symbol_type st)
Definition exprtk.hpp:28264
details::literal_node< T > literal_node_t
Definition exprtk.hpp:22544
bool local_variable_is_shadowed(const std::string &symbol)
Definition exprtk.hpp:30025

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

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

29946 {
29947 stringvar_node_t* str_node = reinterpret_cast<stringvar_node_t*>(0);
29948
29949 scope_element& se = sem_.get_element(str_name);
29950
29951 if (se.name == str_name)
29952 {
29953 if (se.active)
29954 {
29957 current_token(),
29958 "ERR175 - Illegal redefinition of local variable: '" + str_name + "'",
29960
29962
29963 return error_node();
29964 }
29965 else if (scope_element::e_string == se.type)
29966 {
29967 str_node = se.str_node;
29968 se.active = true;
29969 se.depth = state_.scope_depth;
29970 se.ref_count++;
29971 }
29972 }
29973
29974 if (0 == str_node)
29975 {
29977 nse.name = str_name;
29978 nse.active = true;
29979 nse.ref_count = 1;
29981 nse.depth = state_.scope_depth;
29982 nse.data = new std::string;
29983 nse.str_node = new stringvar_node_t(*reinterpret_cast<std::string*>(nse.data));
29984
29985 if (!sem_.add_element(nse))
29986 {
29989 current_token(),
29990 "ERR176 - Failed to add new local string variable '" + str_name + "' to SEM",
29992
29994
29995 sem_.free_element(nse);
29996
29997 return error_node();
29998 }
29999
30000 assert(sem_.total_local_symb_size_bytes() <= settings().max_total_local_symbol_size_bytes());
30001
30002 str_node = nse.str_node;
30003
30004 exprtk_debug(("parse_define_string_statement() - INFO - Added new local string variable: %s\n", nse.name.c_str()));
30005 }
30006
30008
30009 state_.activate_side_effect("parse_define_string_statement()");
30010
30011 expression_node_ptr branch[2] = {0};
30012
30013 branch[0] = str_node;
30015
30017 }
details::stringvar_node< T > stringvar_node_t
Definition exprtk.hpp:22579

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

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

30032 {
30033 if (settings_.vardef_disabled())
30034 {
30037 current_token(),
30038 "ERR177 - Illegal variable definition",
30040
30041 return error_node();
30042 }
30043 else if (!details::imatch(current_token().value,"var"))
30044 {
30045 return error_node();
30046 }
30047 else
30048 next_token();
30049
30050 const std::string var_name = current_token().value;
30051
30053
30055 {
30058 current_token(),
30059 "ERR178 - Expected a symbol for variable definition",
30061
30062 return error_node();
30063 }
30065 {
30068 current_token(),
30069 "ERR179 - Illegal redefinition of reserved keyword: '" + var_name + "'",
30071
30072 return error_node();
30073 }
30074 else if (symtab_store_.symbol_exists(var_name))
30075 {
30078 current_token(),
30079 "ERR180 - Illegal redefinition of variable '" + var_name + "'",
30081
30082 return error_node();
30083 }
30085 {
30088 current_token(),
30089 "ERR181 - Illegal redefinition of local variable: '" + var_name + "'",
30091
30092 return error_node();
30093 }
30095 {
30097 }
30099 {
30101 }
30102 else if (token_is(token_t::e_assign))
30103 {
30105 {
30108 current_token(),
30109 "ERR182 - Failed to parse initialisation expression for variable '" + var_name + "'",
30111
30112 return error_node();
30113 }
30114 }
30115
30116 if (
30120 )
30121 {
30123 {
30126 current_token(),
30127 "ERR183 - Expected ';' after variable '" + var_name + "' definition",
30129
30131
30132 return error_node();
30133 }
30134 }
30135
30136 if (
30139 )
30140 {
30142 }
30143
30144 expression_node_ptr var_node = reinterpret_cast<expression_node_ptr>(0);
30145
30146 scope_element& se = sem_.get_element(var_name);
30147
30148 if (se.name == var_name)
30149 {
30150 if (se.active)
30151 {
30154 current_token(),
30155 "ERR184 - Illegal redefinition of local variable: '" + var_name + "'",
30157
30159
30160 return error_node();
30161 }
30162 else if (scope_element::e_variable == se.type)
30163 {
30164 var_node = se.var_node;
30165 se.active = true;
30166 se.depth = state_.scope_depth;
30167 se.ref_count++;
30168 }
30169 }
30170
30171 if (0 == var_node)
30172 {
30173 const std::size_t predicted_total_lclsymb_size = sizeof(T) + sem_.total_local_symb_size_bytes();
30174
30176 {
30179 current_token(),
30180 "ERR185 - Adding variable '" + var_name + "' "
30181 "will exceed max total local symbol size of: " + details::to_str(settings().max_total_local_symbol_size_bytes()) + " bytes, "
30182 "current total size: " + details::to_str(sem_.total_local_symb_size_bytes()) + " bytes",
30184
30186
30187 return error_node();
30188 }
30189
30191 nse.name = var_name;
30192 nse.active = true;
30193 nse.ref_count = 1;
30195 nse.depth = state_.scope_depth;
30196 nse.data = new T(T(0));
30197 nse.var_node = node_allocator_.allocate<variable_node_t>(*reinterpret_cast<T*>(nse.data));
30198
30199 if (!sem_.add_element(nse))
30200 {
30203 current_token(),
30204 "ERR186 - Failed to add new local variable '" + var_name + "' to SEM",
30206
30208
30209 sem_.free_element(nse);
30210
30211 return error_node();
30212 }
30213
30214 assert(sem_.total_local_symb_size_bytes() <= settings().max_total_local_symbol_size_bytes());
30215
30216 var_node = nse.var_node;
30217
30218 exprtk_debug(("parse_define_var_statement() - INFO - Added new local variable: %s\n", nse.name.c_str()));
30219 }
30220
30221 state_.activate_side_effect("parse_define_var_statement()");
30222
30224
30225 expression_node_ptr branch[2] = {0};
30226
30227 branch[0] = var_node;
30229
30231 }
details::variable_node< T > variable_node_t
Definition exprtk.hpp:22566
expression_node_ptr parse_define_vector_statement(const std::string &vec_name)
Definition exprtk.hpp:29465
expression_node_ptr parse_define_string_statement(const std::string &str_name, expression_node_ptr initialisation_expression)
Definition exprtk.hpp:29945
expression_node_ptr parse_uninitialised_var_statement(const std::string &var_name)
Definition exprtk.hpp:30428

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

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

29466 {
29468
29470 {
29473 current_token(),
29474 "ERR157 - Expected '[' as part of vector size definition",
29476
29477 return error_node();
29478 }
29479 else if (0 == (size_expression_node = parse_expression()))
29480 {
29483 current_token(),
29484 "ERR158 - Failed to determine size of vector '" + vec_name + "'",
29486
29487 return error_node();
29488 }
29490 {
29491 const bool is_rebaseble_vector =
29493 static_cast<details::vector_size_node<T>*>(size_expression_node)->vec_holder()->rebaseable();
29494
29496
29498 std::string("Rebasable/Resizable vector cannot be used to define the size of vector") :
29499 std::string("Expected a constant literal number as size of vector");
29502 current_token(),
29503 "ERR159 - " + error_msg + " '" + vec_name + "'",
29505
29506 return error_node();
29507 }
29508
29509 const T vector_size = size_expression_node->value();
29510
29512
29513 const std::size_t max_vector_size = settings_.max_local_vector_size();
29514
29515 if (
29516 (vector_size <= T(0)) ||
29519 (static_cast<std::size_t>(vector_size) > max_vector_size)
29520 )
29521 {
29524 current_token(),
29525 "ERR160 - Invalid vector size. Must be an integer in the "
29526 "range [0," + details::to_str(static_cast<std::size_t>(max_vector_size)) + "], size: " +
29529
29530 return error_node();
29531 }
29532
29534
29536 const std::size_t predicted_total_lclsymb_size = sizeof(T) * vec_size + sem_.total_local_symb_size_bytes();
29537
29539 {
29542 current_token(),
29543 "ERR161 - Adding vector '" + vec_name + "' of size " + details::to_str(vec_size) + " bytes "
29544 "will exceed max total local symbol size of: " + details::to_str(settings().max_total_local_symbol_size_bytes()) + " bytes, "
29545 "current total size: " + details::to_str(sem_.total_local_symb_size_bytes()) + " bytes",
29547
29548 return error_node();
29549 }
29550
29551 scope_element& se = sem_.get_element(vec_name);
29552
29553 if (se.name == vec_name)
29554 {
29555 if (se.active)
29556 {
29559 current_token(),
29560 "ERR162 - Illegal redefinition of local vector: '" + vec_name + "'",
29562
29563 return error_node();
29564 }
29565 else if (
29566 (se.size == vec_size) &&
29567 (scope_element::e_vector == se.type)
29568 )
29569 {
29570 vec_holder = se.vec_node;
29571 se.active = true;
29572 se.depth = state_.scope_depth;
29573 se.ref_count++;
29574 }
29575 }
29576
29577 if (0 == vec_holder)
29578 {
29580 nse.name = vec_name;
29581 nse.active = true;
29582 nse.ref_count = 1;
29584 nse.depth = state_.scope_depth;
29585 nse.size = vec_size;
29586 nse.data = new T[vec_size];
29587 nse.vec_node = new typename scope_element::vector_holder_t(reinterpret_cast<T*>(nse.data),nse.size);
29588
29589 details::set_zero_value(reinterpret_cast<T*>(nse.data),vec_size);
29590
29591 if (!sem_.add_element(nse))
29592 {
29595 current_token(),
29596 "ERR163 - Failed to add new local vector '" + vec_name + "' to SEM",
29598
29599 sem_.free_element(nse);
29600
29601 return error_node();
29602 }
29603
29604 assert(sem_.total_local_symb_size_bytes() <= settings().max_total_local_symbol_size_bytes());
29605
29606 vec_holder = nse.vec_node;
29607
29608 exprtk_debug(("parse_define_vector_statement() - INFO - Added new local vector: %s[%d]\n",
29609 nse.name.c_str(),
29610 static_cast<int>(nse.size)));
29611 }
29612
29613 state_.activate_side_effect("parse_define_vector_statement()");
29614
29616
29618
29620
29621 bool single_value_initialiser = false;
29622 bool range_value_initialiser = false;
29623 bool vec_to_vec_initialiser = false;
29624 bool null_initialisation = false;
29625
29627 {
29630 current_token(),
29631 "ERR164 - Expected ']' as part of vector size definition",
29633
29634 return error_node();
29635 }
29637 {
29639 {
29642 current_token(),
29643 "ERR165 - Expected ':=' as part of vector definition",
29645
29646 return error_node();
29647 }
29649 {
29651
29652 if (0 == initialiser_component)
29653 {
29656 current_token(),
29657 "ERR166 - Failed to parse first component of vector initialiser for vector: " + vec_name,
29659
29660 return error_node();
29661 }
29662
29664
29666 {
29668
29669 if (0 == initialiser_component)
29670 {
29673 current_token(),
29674 "ERR167 - Failed to parse second component of vector initialiser for vector: " + vec_name,
29676
29677 return error_node();
29678 }
29679
29681 }
29682
29684 {
29687 current_token(),
29688 "ERR168 - Expected ']' to close single value vector initialiser",
29690
29691 return error_node();
29692 }
29693
29694 switch (vec_initilizer_list.size())
29695 {
29696 case 1 : single_value_initialiser = true; break;
29697 case 2 : range_value_initialiser = true; break;
29698 }
29699 }
29701 {
29703
29704 // Is this a vector to vector assignment and initialisation?
29706 {
29707 // Is it a locally defined vector?
29708 const scope_element& lcl_se = sem_.get_active_element(current_token().value);
29709
29710 if (scope_element::e_vector == lcl_se.type)
29711 {
29712 if (0 != (initialiser = parse_expression()))
29714 else
29715 return error_node();
29716 }
29717 // Are we dealing with a user defined vector?
29718 else if (symtab_store_.is_vector(current_token().value))
29719 {
29721
29722 if (0 != (initialiser = parse_expression()))
29724 else
29725 return error_node();
29726 }
29727 // Are we dealing with a null initialisation vector definition?
29728 else if (token_is(token_t::e_symbol,"null"))
29729 null_initialisation = true;
29730 }
29731
29733 {
29734 if (0 == initialiser)
29735 {
29738 current_token(),
29739 "ERR169 - Expected '{' as part of vector initialiser list",
29741
29742 return error_node();
29743 }
29744 else
29746 }
29747 }
29749 {
29750 for ( ; ; )
29751 {
29753
29754 if (0 == initialiser)
29755 {
29758 current_token(),
29759 "ERR170 - Expected '{' as part of vector initialiser list",
29761
29762 return error_node();
29763 }
29764 else
29766
29768 break;
29769
29771
29773 {
29776 current_token(),
29777 "ERR171 - Expected ',' between vector initialisers",
29779
29780 return error_node();
29781 }
29782
29784 break;
29785 }
29786 }
29787
29788 if (
29792 )
29793 {
29795 {
29798 current_token(),
29799 "ERR172 - Expected ';' at end of vector definition",
29801
29802 return error_node();
29803 }
29804 }
29805
29806 if (
29810 )
29811 {
29814 current_token(),
29815 "ERR173 - Initialiser list larger than the number of elements in the vector: '" + vec_name + "'",
29817
29818 return error_node();
29819 }
29820 }
29821
29823
29824 if (
29825 (vec_initilizer_list.size() == 1) &&
29827 )
29828 {
29830 {
29831 // vector_init_zero_value_node var v[10] := [0]
29832 if (T(0) == vec_initilizer_list[0]->value())
29833 {
29836 (*vec_holder)[0],
29837 vec_size,
29839 }
29840 else
29841 {
29842 // vector_init_single_constvalue_node var v[10] := [123]
29845 (*vec_holder)[0],
29846 vec_size,
29848 }
29849 }
29850 else
29851 {
29852 // vector_init_single_value_node var v[10] := [123 + (x / y)]
29855 (*vec_holder)[0],
29856 vec_size,
29858 }
29859 }
29860 else if (
29861 (vec_initilizer_list.size() == 2) &&
29863 )
29864 {
29867
29868 if (base_const && inc_const)
29869 {
29870 // vector_init_single_value_node var v[10] := [1 : 3.5]
29873 (*vec_holder)[0],
29874 vec_size,
29876 }
29877 else if (base_const && !inc_const)
29878 {
29879 // vector_init_single_value_node var v[10] := [1 : x + y]
29882 (*vec_holder)[0],
29883 vec_size,
29885 }
29886 else if (!base_const && inc_const)
29887 {
29888 // vector_init_single_value_node var v[10] := [x + y : 3]
29891 (*vec_holder)[0],
29892 vec_size,
29894 }
29895 else if (!base_const && !inc_const)
29896 {
29897 // vector_init_single_value_node var v[10] := [x + y : z / w]
29900 (*vec_holder)[0],
29901 vec_size,
29903 }
29904 }
29905 else if (null_initialisation)
29907 else if (vec_to_vec_initialiser)
29908 {
29910
29913 vec_node,
29915 }
29916 else
29917 {
29920 (*vec_holder)[0],
29921 vec_size,
29924 }
29925
29926 svd.delete_ptr = false;
29927
29928 if (result && result->valid())
29929 {
29930 return result;
29931 }
29932
29934
29937 current_token(),
29938 "ERR174 - Failed to generate initialisation node for vector: " + vec_name,
29940
29941 return error_node();
29942 }
details::vector_node< T > vector_node_t
Definition exprtk.hpp:22575
vector_holder_t * vector_holder_ptr
Definition exprtk.hpp:21023
int to_int32(const T v)
Definition exprtk.hpp:1505
bool is_constant_node(const expression_node< T > *node)
Definition exprtk.hpp:5947
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:22667

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

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

25481 {
25483 {
25484 exprtk_debug(("halt_compilation_check() - parse_expression checkpoint 2\n"));
25485 return error_node();
25486 }
25487
25488 stack_limit_handler slh(*this);
25489
25490 if (!slh)
25491 {
25492 return error_node();
25493 }
25494
25496
25497 if (0 == expression)
25498 {
25499 return error_node();
25500 }
25501
25503 {
25504 return expression;
25505 }
25506
25507 bool break_loop = false;
25508
25510
25511 for ( ; ; )
25512 {
25513 current_state.reset();
25514
25515 switch (current_token().type)
25516 {
25536 default :
25538 {
25539 static const std::string s_and = "and" ;
25540 static const std::string s_nand = "nand" ;
25541 static const std::string s_or = "or" ;
25542 static const std::string s_nor = "nor" ;
25543 static const std::string s_xor = "xor" ;
25544 static const std::string s_xnor = "xnor" ;
25545 static const std::string s_in = "in" ;
25546 static const std::string s_like = "like" ;
25547 static const std::string s_ilike = "ilike";
25548 static const std::string s_and1 = "&" ;
25549 static const std::string s_or1 = "|" ;
25550 static const std::string s_not = "not" ;
25551
25553 {
25555 break;
25556 }
25558 {
25559 #ifndef exprtk_disable_sc_andor
25561 #else
25563 #endif
25564 break;
25565 }
25567 {
25569 break;
25570 }
25572 {
25574 break;
25575 }
25577 {
25578 #ifndef exprtk_disable_sc_andor
25580 #else
25582 #endif
25583 break;
25584 }
25586 {
25588 break;
25589 }
25591 {
25593 break;
25594 }
25596 {
25598 break;
25599 }
25601 {
25603 break;
25604 }
25606 {
25608 break;
25609 }
25611 {
25613 break;
25614 }
25616 {
25617 break;
25618 }
25619 }
25620
25621 break_loop = true;
25622 }
25623
25624 if (break_loop)
25625 {
25627 break;
25628 }
25629 else if (current_state.left < precedence)
25630 break;
25631
25633
25634 next_token();
25635
25638
25640 {
25642
25645 prev_token,
25646 "ERR012 - Invalid or disabled logic operation '" + details::to_str(current_state.operation) + "'",
25648
25649 return error_node();
25650 }
25652 {
25654
25657 prev_token,
25658 "ERR013 - Invalid or disabled arithmetic operation '" + details::to_str(current_state.operation) + "'",
25660
25661 return error_node();
25662 }
25664 {
25666
25669 prev_token,
25670 "ERR014 - Invalid inequality operation '" + details::to_str(current_state.operation) + "'",
25672
25673 return error_node();
25674 }
25676 {
25678
25681 prev_token,
25682 "ERR015 - Invalid or disabled assignment operation '" + details::to_str(current_state.operation) + "'",
25684
25685 return error_node();
25686 }
25687
25688 if (0 != (right_branch = parse_expression(current_state.right)))
25689 {
25690 if (
25693 )
25694 {
25697
25700 prev_token,
25701 "ERR016 - Return statements cannot be part of sub-expressions",
25703
25704 return error_node();
25705 }
25706
25708
25710 (
25711 current_state.operation,
25712 expression,
25714 );
25715
25717 }
25718
25719 if (0 == new_expression)
25720 {
25721 if (error_list_.empty())
25722 {
25725 prev_token,
25726 !synthesis_error_.empty() ?
25728 "ERR017 - General parsing error at token: '" + prev_token.value + "'",
25730 }
25731
25734
25735 return error_node();
25736 }
25737 else
25738 {
25739 if (
25742 )
25743 {
25745 }
25746 else
25748
25750 }
25751 }
25752
25753 if ((0 != expression) && (expression->node_depth() > settings_.max_node_depth_))
25754 {
25757 current_token(),
25758 "ERR018 - Expression depth of " + details::to_str(static_cast<int>(expression->node_depth())) +
25759 " exceeds maximum allowed expression depth of " + details::to_str(static_cast<int>(settings_.max_node_depth_)),
25761
25763
25764 return error_node();
25765 }
25766 else if (
25767 !settings_.commutative_check_enabled() &&
25769 (current_state.operation == details::e_default) &&
25770 (
25774 )
25775 )
25776 {
25779 current_token(),
25780 "ERR019 - Invalid syntax '" + current_token().value + "' possible missing operator or context",
25782
25784
25785 return error_node();
25786 }
25787
25788 return expression;
25789 }
bool is_invalid_inequality_operation(const details::operator_type operation) const
Definition exprtk.hpp:25278
bool is_invalid_assignment_operation(const details::operator_type operation) const
Definition exprtk.hpp:25273
bool is_invalid_logic_operation(const details::operator_type operation) const
Definition exprtk.hpp:25263
bool is_invalid_arithmetic_operation(const details::operator_type operation) const
Definition exprtk.hpp:25268
void pop_current_state()
Definition exprtk.hpp:25444
void push_current_state(const state_t current_state)
Definition exprtk.hpp:25439
expression_node_ptr parse_branch(precedence_level precedence=e_level00)
Definition exprtk.hpp:31669
state_t current_state() const
Definition exprtk.hpp:25452

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

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

27145 {
27150
27151 scope_element* se = 0;
27152 bool result = true;
27153
27154 next_token();
27155
27156 scope_handler sh(*this);
27157
27159 {
27162 current_token(),
27163 "ERR077 - Expected '(' at start of for-loop",
27165
27166 return error_node();
27167 }
27168
27170 {
27171 if (
27174 )
27175 {
27176 next_token();
27177
27179 {
27182 current_token(),
27183 "ERR078 - Expected a variable at the start of initialiser section of for-loop",
27185
27186 return error_node();
27187 }
27189 {
27192 current_token(),
27193 "ERR079 - Expected variable assignment of initialiser section of for-loop",
27195
27196 return error_node();
27197 }
27198
27200
27201 se = &sem_.get_element(loop_counter_symbol);
27202
27203 if ((se->name == loop_counter_symbol) && se->active)
27204 {
27207 current_token(),
27208 "ERR080 - For-loop variable '" + loop_counter_symbol+ "' is being shadowed by a previous declaration",
27210
27211 return error_node();
27212 }
27213 else if (!symtab_store_.is_variable(loop_counter_symbol))
27214 {
27215 if (
27216 !se->active &&
27217 (se->name == loop_counter_symbol) &&
27218 (se->type == scope_element::e_variable)
27219 )
27220 {
27221 se->active = true;
27222 se->ref_count++;
27223 }
27224 else
27225 {
27227 nse.name = loop_counter_symbol;
27228 nse.active = true;
27229 nse.ref_count = 1;
27231 nse.depth = state_.scope_depth;
27232 nse.data = new T(T(0));
27233 nse.var_node = node_allocator_.allocate<variable_node_t>(*reinterpret_cast<T*>(nse.data));
27234
27235 if (!sem_.add_element(nse))
27236 {
27239 current_token(),
27240 "ERR081 - Failed to add new local variable '" + loop_counter_symbol + "' to SEM",
27242
27243 sem_.free_element(nse);
27244
27245 result = false;
27246 }
27247 else
27248 {
27249 exprtk_debug(("parse_for_loop() - INFO - Added new local variable: %s\n", nse.name.c_str()));
27250
27251 state_.activate_side_effect("parse_for_loop()");
27252 }
27253 }
27254 }
27255 }
27256
27257 if (0 == (initialiser = parse_expression()))
27258 {
27261 current_token(),
27262 "ERR082 - Failed to parse initialiser of for-loop",
27264
27265 result = false;
27266 }
27267 else if (!token_is(token_t::e_eof))
27268 {
27271 current_token(),
27272 "ERR083 - Expected ';' after initialiser of for-loop",
27274
27275 result = false;
27276 }
27277 }
27278
27280 {
27281 if (0 == (condition = parse_expression()))
27282 {
27285 current_token(),
27286 "ERR084 - Failed to parse condition of for-loop",
27288
27289 result = false;
27290 }
27291 else if (!token_is(token_t::e_eof))
27292 {
27295 current_token(),
27296 "ERR085 - Expected ';' after condition section of for-loop",
27298
27299 result = false;
27300 }
27301 }
27302
27304 {
27305 if (0 == (incrementor = parse_expression()))
27306 {
27309 current_token(),
27310 "ERR086 - Failed to parse incrementor of for-loop",
27312
27313 result = false;
27314 }
27315 else if (!token_is(token_t::e_rbracket))
27316 {
27319 current_token(),
27320 "ERR087 - Expected ')' after incrementor section of for-loop",
27322
27323 result = false;
27324 }
27325 }
27326
27327 if (result)
27328 {
27329 brkcnt_list_.push_front(false);
27330
27331 scoped_inc_dec sid(state_.parsing_loop_stmt_count);
27332
27333 if (0 == (loop_body = parse_multi_sequence("for-loop", true)))
27334 {
27337 current_token(),
27338 "ERR088 - Failed to parse body of for-loop",
27340
27341 result = false;
27342 }
27343 }
27344
27345 if (!result)
27346 {
27347 if (se)
27348 {
27349 se->ref_count--;
27350 }
27351
27356 return error_node();
27357 }
27358
27361 condition,
27363 loop_body,
27364 brkcnt_list_.front());
27366
27367 if (result_node && result_node->valid())
27368 {
27369 return result_node;
27370 }
27371
27374 current_token(),
27375 "ERR089 - Failed to synthesize 'valid' for-loop",
27377
27379
27380 return error_node();
27381 }
void handle_brkcnt_scope_exit()
Definition exprtk.hpp:26881

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

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

26087 {
26088 #ifdef _MSC_VER
26089 #pragma warning(push)
26090 #pragma warning(disable: 4127)
26091 #endif
26092 if (0 == NumberofParameters)
26093 {
26096 current_token(),
26097 "ERR023 - Expecting ifunction '" + function_name + "' to have non-zero parameter count",
26099
26100 return error_node();
26101 }
26102 #ifdef _MSC_VER
26103 #pragma warning(pop)
26104 #endif
26105
26108
26110
26112
26113 next_token();
26114
26116 {
26119 current_token(),
26120 "ERR024 - Expecting argument list for function: '" + function_name + "'",
26122
26123 return error_node();
26124 }
26125
26126 for (int i = 0; i < static_cast<int>(NumberofParameters); ++i)
26127 {
26129
26130 if (0 == branch[i])
26131 {
26134 current_token(),
26135 "ERR025 - Failed to parse argument " + details::to_str(i) + " for function: '" + function_name + "'",
26137
26138 return error_node();
26139 }
26140 else if (i < static_cast<int>(NumberofParameters - 1))
26141 {
26143 {
26146 current_token(),
26147 "ERR026 - Invalid number of arguments for function: '" + function_name + "'",
26149
26150 return error_node();
26151 }
26152 }
26153 }
26154
26156 {
26159 current_token(),
26160 "ERR027 - Invalid number of arguments for function: '" + function_name + "'",
26162
26163 return error_node();
26164 }
26165 else
26167
26168 sd.delete_ptr = (0 == result);
26169
26170 return result;
26171 }

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

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

26174 {
26176
26177 state_.side_effect_present = function->has_side_effects();
26178
26179 next_token();
26180
26181 if (
26184 )
26185 {
26188 current_token(),
26189 "ERR028 - Expecting '()' to proceed call to function: '" + function_name + "'",
26191
26193
26194 return error_node();
26195 }
26196 else
26197 return result;
26198 }

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

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

26034 {
26035 expression_node_ptr func_node = reinterpret_cast<expression_node_ptr>(0);
26036
26037 switch (function->param_count)
26038 {
26060 default : {
26063 current_token(),
26064 "ERR021 - Invalid number of parameters for function: '" + function_name + "'",
26066
26067 return error_node();
26068 }
26069 }
26070
26071 if (func_node)
26072 return func_node;
26073 else
26074 {
26077 current_token(),
26078 "ERR022 - Failed to generate call to function: '" + function_name + "'",
26080
26081 return error_node();
26082 }
26083 }
expression_node_ptr parse_function_call(ifunction< T > *function, const std::string &function_name)
Definition exprtk.hpp:26086
expression_node_ptr parse_function_call_0(ifunction< T > *function, const std::string &function_name)
Definition exprtk.hpp:26173

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

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

28938 {
28940
28942
28943 next_token();
28944
28946
28948 (*this),
28950 function->parameter_sequence,
28952
28953 if (tc.invalid())
28954 {
28957 current_token(),
28958 "ERR136 - Type checker instantiation failure for generic function: " + function_name,
28960
28961 return error_node();
28962 }
28963
28965 {
28967 {
28968 if (
28969 !function->allow_zero_parameters() &&
28970 !tc .allow_zero_parameters()
28971 )
28972 {
28975 current_token(),
28976 "ERR137 - Zero parameter call to generic function: "
28977 + function_name + " not allowed",
28979
28980 return error_node();
28981 }
28982 }
28983 else
28984 {
28985 for ( ; ; )
28986 {
28988
28989 if (0 == arg)
28990 return error_node();
28991
28992 if (is_ivector_node(arg))
28993 param_type_list += 'V';
28994 else if (is_generally_string_node(arg))
28995 param_type_list += 'S';
28996 else // Everything else is assumed to be a scalar returning expression
28997 param_type_list += 'T';
28998
28999 arg_list.push_back(arg);
29000
29002 break;
29003 else if (!token_is(token_t::e_comma))
29004 {
29007 current_token(),
29008 "ERR138 - Expected ',' for call to generic function: " + function_name,
29010
29011 return error_node();
29012 }
29013 }
29014 }
29015 }
29016 else if (
29017 !function->parameter_sequence.empty() &&
29018 function->allow_zero_parameters () &&
29019 !tc .allow_zero_parameters ()
29020 )
29021 {
29024 current_token(),
29025 "ERR139 - Zero parameter call to generic function: "
29026 + function_name + " not allowed",
29028
29029 return error_node();
29030 }
29031
29033
29034 if (
29035 state_.type_check_enabled &&
29037 )
29038 {
29041 current_token(),
29042 "ERR140 - Invalid input parameter sequence for call to generic function: " + function_name,
29044
29045 return error_node();
29046 }
29047
29049 (tc.paramseq_count() <= 1) ?
29051 .generic_function_call(function, arg_list) :
29053 .generic_function_call(function, arg_list, param_seq_index);
29054
29055 svd.delete_ptr = (0 == result);
29056
29057 return result;
29058 }

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

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

29065 {
29067 {
29069 {
29070 if (
29071 !function->allow_zero_parameters() &&
29072 !tc .allow_zero_parameters()
29073 )
29074 {
29077 current_token(),
29078 "ERR141 - Zero parameter call to generic function: "
29079 + function_name + " not allowed",
29081
29082 return false;
29083 }
29084 }
29085 else
29086 {
29087 for ( ; ; )
29088 {
29090
29091 if (0 == arg)
29092 return false;
29093
29094 if (is_ivector_node(arg))
29095 param_type_list += 'V';
29096 else if (is_generally_string_node(arg))
29097 param_type_list += 'S';
29098 else // Everything else is a scalar returning expression
29099 param_type_list += 'T';
29100
29101 arg_list.push_back(arg);
29102
29104 break;
29105 else if (!token_is(token_t::e_comma))
29106 {
29109 current_token(),
29110 "ERR142 - Expected ',' for call to string function: " + function_name,
29112
29113 return false;
29114 }
29115 }
29116 }
29117
29118 return true;
29119 }
29120 else
29121 return false;
29122 }

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

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

28001 {
28005
28006 if (!token_is(open_bracket))
28007 {
28009 {
28013 }
28014 else
28015 {
28018 current_token(),
28019 "ERR111 - Expected '" + token_t::to_str(open_bracket) + "' for call to multi-sequence" +
28020 ((!source.empty()) ? std::string(" section of " + source): ""),
28022
28023 return error_node();
28024 }
28025 }
28026 else if (token_is(close_bracket))
28027 {
28028 return node_allocator_.allocate<details::null_node<T> >();
28029 }
28030
28033
28035
28036 scope_handler sh(*this);
28037
28038 scoped_bool_or_restorer sbr(state_.side_effect_present);
28039
28040 for ( ; ; )
28041 {
28042 state_.side_effect_present = false;
28043
28045
28046 if (0 == arg)
28047 return error_node();
28048 else
28049 {
28050 arg_list.push_back(arg);
28051 side_effect_list.push_back(state_.side_effect_present);
28052 }
28053
28055 break;
28056
28058
28060 {
28063 current_token(),
28064 "ERR112 - Expected '" + lexer::token::seperator_to_str(separator) + "' for call to multi-sequence section of " + source,
28066
28067 return error_node();
28068 }
28069
28071 break;
28072 }
28073
28075
28076 svd.delete_ptr = (0 == result);
28077 return result;
28078 }
static std::string to_str(const token_type t)
Definition exprtk.hpp:2381

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

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

27556 {
27558
27559 if (!details::imatch(current_token().value,"[*]"))
27560 {
27563 current_token(),
27564 "ERR098 - Expected token '[*]'",
27566
27567 return error_node();
27568 }
27569
27571
27572 next_token();
27573
27575 {
27578 current_token(),
27579 "ERR099 - Expected '{' for call to [*] statement",
27581
27582 return error_node();
27583 }
27584
27585 for ( ; ; )
27586 {
27587 if (!details::imatch("case",current_token().value))
27588 {
27591 current_token(),
27592 "ERR100 - Expected a 'case' statement for multi-switch",
27594
27595 return error_node();
27596 }
27597
27598 next_token();
27599
27601
27602 if (0 == condition)
27603 return error_node();
27604
27606 {
27609 current_token(),
27610 "ERR101 - Expected ':' for case of [*] statement",
27612
27614
27615 return error_node();
27616 }
27617
27620 parse_multi_sequence("multi-switch-consequent") :
27622
27623 if (0 == consequent)
27624 {
27626 return error_node();
27627 }
27628
27630 {
27633 current_token(),
27634 "ERR102 - Expected ';' at end of case for [*] statement",
27636
27639
27640 return error_node();
27641 }
27642
27643 // Can we optimise away the case statement?
27645 {
27648 }
27649 else
27650 {
27651 arg_list.push_back(condition );
27652 arg_list.push_back(consequent);
27653 }
27654
27656 {
27657 break;
27658 }
27659 }
27660
27662 {
27665 current_token(),
27666 "ERR103 - Expected '}' at end of [*] statement",
27668
27669 return error_node();
27670 }
27671
27672 const expression_node_ptr result = expression_generator_.multi_switch_statement(arg_list);
27673
27674 svd.delete_ptr = (0 == result);
27675
27676 return result;
27677 }

Referenced by exprtk::parser< Type >::parse_vararg_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 26865 of file exprtk.hpp.

26866 {
26867 if (settings_.logic_disabled("not"))
26868 {
26871 current_token(),
26872 "ERR063 - Invalid or disabled logic operation 'not'",
26874
26875 return error_node();
26876 }
26877
26878 return parse_base_operation();
26879 }
expression_node_ptr parse_base_operation()
Definition exprtk.hpp:26273

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

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

29360 {
29361 next_token();
29362 return node_allocator_.allocate<details::null_node<T> >();
29363 }

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

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

29176 {
29177 // Move pass the function name
29178 next_token();
29179
29181
29182 type_checker tc((*this), function_name, function->parameter_sequence, type_checker::e_overload);
29183
29184 if (
29185 (!function->parameter_sequence.empty()) &&
29186 (0 == tc.paramseq_count())
29187 )
29188 {
29189 return error_node();
29190 }
29191
29194
29196 {
29197 return error_node();
29198 }
29199
29201
29202 if (!tc.verify(param_type_list, param_seq_index))
29203 {
29206 current_token(),
29207 "ERR144 - Invalid input parameter sequence for call to overloaded function: " + function_name,
29209
29210 return error_node();
29211 }
29212
29214
29215 if (type_checker::e_numeric == tc.return_type(param_seq_index))
29216 {
29217 if (tc.paramseq_count() <= 1)
29219 .generic_function_call(function, arg_list);
29220 else
29222 .generic_function_call(function, arg_list, param_seq_index);
29223 }
29224 else if (type_checker::e_string == tc.return_type(param_seq_index))
29225 {
29226 if (tc.paramseq_count() <= 1)
29228 .string_function_call(function, arg_list);
29229 else
29231 .string_function_call(function, arg_list, param_seq_index);
29232 }
29233 else
29234 {
29237 current_token(),
29238 "ERR145 - Invalid return type for call to overloaded function: " + function_name,
29240 }
29241
29242 svd.delete_ptr = (0 == result);
29243 return result;
29244 }
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:29060

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

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

27839 {
27840 // Allow no more than 100 range calls, eg: s[][][]...[][]
27842
27843 std::size_t i = 0;
27844
27845 while
27846 (
27847 (0 != expression) &&
27848 (i++ < max_rangesize_parses) &&
27849 error_list_.empty() &&
27852 )
27853 {
27855 }
27856
27857 return (i > 1);
27858 }
expression_node_ptr parse_string_range_statement(expression_node_ptr &expression)
Definition exprtk.hpp:27772

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

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

27861 {
27862 if
27863 (
27864 (0 != expression) &&
27865 error_list_.empty() &&
27867 )
27868 {
27869 if (
27870 settings_.commutative_check_enabled() &&
27873 )
27874 {
27877 }
27879 {
27881 }
27882 else if (
27885 )
27886 {
27889 }
27890 else
27891 return;
27892
27894
27895 if (vi)
27896 {
27897 details::vector_holder<T>& vec = vi->vec()->vec_holder();
27898 const std::string vector_name = sem_.get_vector_name(vec.data());
27900
27901 if (index)
27902 {
27904 return;
27905 }
27906 }
27907
27910 }
27911 }
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:28551
expression_node_ptr parse_vector_index(const std::string &vector_name="")
Definition exprtk.hpp:28449

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

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

28081 {
28082 // Examples of valid ranges:
28083 // 1. [1:5] -> [1,5)
28084 // 2. [ :5] -> [0,5)
28085 // 3. [1: ] -> [1,end)
28086 // 4. [x:y] -> [x,y) where x <= y
28087 // 5. [x+1:y/2] -> [x+1,y/2) where x+1 <= y/2
28088 // 6. [ :y] -> [0,y) where 0 <= y
28089 // 7. [x: ] -> [x,end) where x <= end
28090
28091 rp.clear();
28092
28094 {
28097 current_token(),
28098 "ERR113 - Expected '[' for start of range",
28100
28101 return false;
28102 }
28103
28105 {
28106 rp.n0_c.first = true;
28107 rp.n0_c.second = 0;
28108 rp.cache.first = 0;
28109 }
28110 else
28111 {
28113
28114 if (0 == r0)
28115 {
28118 current_token(),
28119 "ERR114 - Failed parse begin section of range",
28121
28122 return false;
28123 }
28124 else if (is_constant_node(r0))
28125 {
28126 const T r0_value = r0->value();
28127
28128 if (r0_value >= T(0))
28129 {
28130 rp.n0_c.first = true;
28131 rp.n0_c.second = static_cast<std::size_t>(details::numeric::to_int64(r0_value));
28132 rp.cache.first = rp.n0_c.second;
28133 }
28134
28136
28137 if (r0_value < T(0))
28138 {
28141 current_token(),
28142 "ERR115 - Range lower bound less than zero! Constraint: r0 >= 0",
28144
28145 return false;
28146 }
28147 }
28148 else
28149 {
28150 rp.n0_e.first = true;
28151 rp.n0_e.second = r0;
28152 }
28153
28155 {
28158 current_token(),
28159 "ERR116 - Expected ':' for break in range",
28161
28162 rp.free();
28163
28164 return false;
28165 }
28166 }
28167
28169 {
28170 rp.n1_c.first = true;
28172 }
28173 else
28174 {
28176
28177 if (0 == r1)
28178 {
28181 current_token(),
28182 "ERR117 - Failed parse end section of range",
28184
28185 rp.free();
28186
28187 return false;
28188 }
28189 else if (is_constant_node(r1))
28190 {
28191 const T r1_value = r1->value();
28192
28193 if (r1_value >= T(0))
28194 {
28195 rp.n1_c.first = true;
28196 rp.n1_c.second = static_cast<std::size_t>(details::numeric::to_int64(r1_value));
28197 rp.cache.second = rp.n1_c.second;
28198 }
28199
28201
28202 if (r1_value < T(0))
28203 {
28206 current_token(),
28207 "ERR118 - Range upper bound less than zero! Constraint: r1 >= 0",
28209
28210 rp.free();
28211
28212 return false;
28213 }
28214 }
28215 else
28216 {
28217 rp.n1_e.first = true;
28218 rp.n1_e.second = r1;
28219 }
28220
28222 {
28225 current_token(),
28226 "ERR119 - Expected ']' for start of range",
28228
28229 rp.free();
28230
28231 return false;
28232 }
28233 }
28234
28235 if (rp.const_range())
28236 {
28237 std::size_t r0 = 0;
28238 std::size_t r1 = 0;
28239
28240 bool rp_result = false;
28241
28242 try
28243 {
28244 rp_result = rp(r0, r1, typename range_t::size_holder_t());
28245 }
28246 catch (std::runtime_error&)
28247 {}
28248
28249 if (!rp_result || (r0 > r1))
28250 {
28253 current_token(),
28254 "ERR120 - Invalid range, Constraint: r0 <= r1",
28256
28257 return false;
28258 }
28259 }
28260
28261 return true;
28262 }
_int64_t to_int64(const T v)
Definition exprtk.hpp:1512

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

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

26985 {
26986 // Parse: [repeat][{][expression][}][until][(][test expr][)]
26989 next_token();
26990
26993
26995
26996 brkcnt_list_.push_front(false);
26997
26998 if (details::imatch(current_token().value,"until"))
26999 {
27000 next_token();
27002 }
27003 else
27004 {
27006
27007 scope_handler sh(*this);
27008
27009 scoped_bool_or_restorer sbr(state_.side_effect_present);
27010
27011 scoped_inc_dec sid(state_.parsing_loop_stmt_count);
27012
27013 for ( ; ; )
27014 {
27015 state_.side_effect_present = false;
27016
27018
27019 if (0 == arg)
27020 return error_node();
27021 else
27022 {
27023 arg_list.push_back(arg);
27024 side_effect_list.push_back(state_.side_effect_present);
27025 }
27026
27027 if (details::imatch(current_token().value,"until"))
27028 {
27029 next_token();
27030 break;
27031 }
27032
27034 peek_token_is("until");
27035
27037 {
27040 current_token(),
27041 "ERR070 - Expected '" + token_t::to_str(separator) + "' in body of repeat until loop",
27043
27044 return error_node();
27045 }
27046
27047 if (details::imatch(current_token().value,"until"))
27048 {
27049 next_token();
27050 break;
27051 }
27052 }
27053
27055
27056 svd.delete_ptr = (0 == branch);
27057
27058 if (svd.delete_ptr)
27059 {
27062 current_token(),
27063 "ERR071 - Failed to parse body of repeat until loop",
27065
27066 return error_node();
27067 }
27068 }
27069
27071 {
27074 current_token(),
27075 "ERR072 - Expected '(' before condition statement of repeat until loop",
27077
27079 return error_node();
27080 }
27081 else if (0 == (condition = parse_expression()))
27082 {
27085 current_token(),
27086 "ERR073 - Failed to parse condition for repeat until loop",
27088
27090 return error_node();
27091 }
27092 else if (!token_is(token_t::e_rbracket))
27093 {
27096 current_token(),
27097 "ERR074 - Expected ')' after condition of repeat until loop",
27099
27102
27103 return error_node();
27104 }
27105
27108 .repeat_until_loop(
27109 condition,
27110 branch,
27111 brkcnt_list_.front());
27112
27113 if (0 == result_node)
27114 {
27117 current_token(),
27118 "ERR075 - Failed to synthesize repeat until loop",
27120
27122
27123 return error_node();
27124 }
27125
27127
27128 if (result_node && result_node->valid())
27129 {
27130 return result_node;
27131 }
27132
27135 current_token(),
27136 "ERR076 - Failed to synthesize 'valid' repeat until loop",
27138
27140
27141 return error_node();
27142 }

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

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

30766 {
30767 if (state_.parsing_return_stmt)
30768 {
30771 current_token(),
30772 "ERR214 - Return call within a return call is not allowed",
30774
30775 return error_node();
30776 }
30777
30778 scoped_bool_negator sbn(state_.parsing_return_stmt);
30779
30781
30783
30784 if (!details::imatch(current_token().value,"return"))
30785 {
30786 return error_node();
30787 }
30788 else
30789 next_token();
30790
30792 {
30795 current_token(),
30796 "ERR215 - Expected '[' at start of return statement",
30798
30799 return error_node();
30800 }
30802 {
30803 for ( ; ; )
30804 {
30806
30807 if (0 == arg)
30808 return error_node();
30809
30810 arg_list.push_back(arg);
30811
30813 break;
30814 else if (!token_is(token_t::e_comma))
30815 {
30818 current_token(),
30819 "ERR216 - Expected ',' between values during call to return",
30821
30822 return error_node();
30823 }
30824 }
30825 }
30826 else if (settings_.zero_return_disabled())
30827 {
30830 current_token(),
30831 "ERR217 - Zero parameter return statement not allowed",
30833
30834 return error_node();
30835 }
30836
30838
30840 {
30841 if (!arg_list.empty())
30842 {
30845 prev_token,
30846 "ERR218 - Invalid ']' found during return call",
30848
30849 return error_node();
30850 }
30851 }
30852
30854
30855 for (std::size_t i = 0; i < arg_list.size(); ++i)
30856 {
30857 if (0 == arg_list[i])
30858 return error_node();
30859 else if (is_ivector_node(arg_list[i]))
30860 ret_param_type_list += 'V';
30862 ret_param_type_list += 'S';
30863 else
30864 ret_param_type_list += 'T';
30865 }
30866
30867 dec_.retparam_list_.push_back(ret_param_type_list);
30868
30870
30871 svd.delete_ptr = (0 == result);
30872
30873 state_.return_stmt_present = true;
30874
30875 state_.activate_side_effect("parse_return_statement()");
30876
30877 return result;
30878 }

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

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

29315 {
29316 const std::string sf_name = current_token().value;
29317
29318 // Expect: $fDD(expr0,expr1,expr2) or $fDD(expr0,expr1,expr2,expr3)
29319 if (
29322 )
29323 {
29326 current_token(),
29327 "ERR149 - Invalid special function[1]: " + sf_name,
29329
29330 return error_node();
29331 }
29332
29333 const int id = (sf_name[2] - '0') * 10 +
29334 (sf_name[3] - '0');
29335
29336 if (id >= details::e_sffinal)
29337 {
29340 current_token(),
29341 "ERR150 - Invalid special function[2]: " + sf_name,
29343
29344 return error_node();
29345 }
29346
29347 const int sf_3_to_4 = details::e_sf48;
29349 const std::size_t NumberOfParameters = (id < (sf_3_to_4 - 1000)) ? 3U : 4U;
29350
29351 switch (NumberOfParameters)
29352 {
29355 default : return error_node();
29356 }
29357 }
static expression_node_ptr process(parser< Type > &p, const details::operator_type opt_type, const std::string &sf_name)
Definition exprtk.hpp:29250

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

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

28272 {
28273 const std::string symbol = current_token().value;
28274
28276
28278 strvar_node_t const_str_node = static_cast<strvar_node_t>(0);
28279
28280 scope_element& se = sem_.get_active_element(symbol);
28281
28282 if (scope_element::e_string == se.type)
28283 {
28284 se.active = true;
28285 result = se.str_node;
28287 }
28288 else
28289 {
28291 str_ctxt_t str_ctx = symtab_store_.get_string_context(symbol);
28292
28293 if ((0 == str_ctx.str_var) || !symtab_store_.is_conststr_stringvar(symbol))
28294 {
28297 current_token(),
28298 "ERR121 - Unknown string symbol",
28300
28301 return error_node();
28302 }
28303
28304 assert(str_ctx.str_var != 0);
28305 assert(str_ctx.symbol_table != 0);
28306
28307 result = str_ctx.str_var;
28308
28309 if (symtab_store_.is_constant_string(symbol))
28310 {
28311 const_str_node = static_cast<strvar_node_t>(result);
28313 }
28314 else if (symbol_table_t::e_immutable == str_ctx.symbol_table->mutability())
28315 {
28317 current_token(),
28318 make_memory_range(str_ctx.str_var->base(), str_ctx.str_var->size()));
28319 }
28320
28322 }
28323
28325 {
28326 next_token();
28327
28329 {
28330 next_token();
28331 next_token();
28332
28333 if (const_str_node)
28334 {
28336
28337 return expression_generator_(T(const_str_node->size()));
28338 }
28339 else
28341 (static_cast<details::stringvar_node<T>*>(result)->ref());
28342 }
28343
28344 range_t rp;
28345
28346 if (!parse_range(rp))
28347 {
28349
28350 return error_node();
28351 }
28352 else if (const_str_node)
28353 {
28356 }
28357 else
28359 (result)->ref(), rp);
28360
28361 if (result)
28362 rp.clear();
28363 }
28364 else
28365 next_token();
28366
28367 return result;
28368 }
void lodge_immutable_symbol(const lexer::token &token, const interval_t interval)
Definition exprtk.hpp:31175
interval_t make_memory_range(const T &t)
Definition exprtk.hpp:31158

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

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

29126 {
29127 // Move pass the function name
29128 next_token();
29129
29131
29132 type_checker tc((*this), function_name, function->parameter_sequence, type_checker::e_string);
29133
29134 if (
29135 (!function->parameter_sequence.empty()) &&
29136 (0 == tc.paramseq_count())
29137 )
29138 {
29139 return error_node();
29140 }
29141
29144
29146 {
29147 return error_node();
29148 }
29149
29151
29152 if (!tc.verify(param_type_list, param_seq_index))
29153 {
29156 current_token(),
29157 "ERR143 - Invalid input parameter sequence for call to string function: " + function_name,
29159
29160 return error_node();
29161 }
29162
29164 (tc.paramseq_count() <= 1) ?
29166 .string_function_call(function, arg_list) :
29168 .string_function_call(function, arg_list, param_seq_index);
29169
29170 svd.delete_ptr = (0 == result);
29171
29172 return result;
29173 }

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

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

27773 {
27775 {
27778 current_token(),
27779 "ERR108 - Expected '[' as start of string range definition",
27781
27783
27784 return error_node();
27785 }
27787 {
27789 }
27790
27791 range_t rp;
27792
27793 if (!parse_range(rp,true))
27794 {
27796
27797 return error_node();
27798 }
27799
27801
27802 if (0 == result)
27803 {
27806 current_token(),
27807 "ERR109 - Failed to generate string range node",
27809
27811 rp.free();
27812 }
27813
27814 rp.clear();
27815
27816 if (result && result->valid())
27817 {
27818 return result;
27819 }
27820
27823 current_token(),
27824 "ERR110 - Failed to synthesize node: string_range_node",
27826
27828 rp.free();
27829 return error_node();
27830 }

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

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

30532 {
30533 if (!details::imatch(current_token().value,"swap"))
30534 {
30535 return error_node();
30536 }
30537 else
30538 next_token();
30539
30541 {
30544 current_token(),
30545 "ERR205 - Expected '(' at start of swap statement",
30547
30548 return error_node();
30549 }
30550
30553
30554 bool variable0_generated = false;
30555 bool variable1_generated = false;
30556
30557 const std::string var0_name = current_token().value;
30558
30560 {
30563 current_token(),
30564 "ERR206 - Expected a symbol for variable or vector element definition",
30566
30567 return error_node();
30568 }
30570 {
30571 if (0 == (variable0 = parse_vector()))
30572 {
30575 current_token(),
30576 "ERR207 - First parameter to swap is an invalid vector element: '" + var0_name + "'",
30578
30579 return error_node();
30580 }
30581
30582 variable0_generated = true;
30583 }
30584 else
30585 {
30586 if (symtab_store_.is_variable(var0_name))
30587 {
30588 variable0 = symtab_store_.get_variable(var0_name);
30589 }
30590
30591 const scope_element& se = sem_.get_element(var0_name);
30592
30593 if (
30594 (se.active) &&
30595 (se.name == var0_name) &&
30597 )
30598 {
30599 variable0 = se.var_node;
30600 }
30601
30603
30604 if (0 == variable0)
30605 {
30608 current_token(),
30609 "ERR208 - First parameter to swap is an invalid variable: '" + var0_name + "'",
30611
30612 return error_node();
30613 }
30614 else
30615 next_token();
30616 }
30617
30619 {
30622 current_token(),
30623 "ERR209 - Expected ',' between parameters to swap",
30625
30627 {
30629 }
30630
30631 return error_node();
30632 }
30633
30634 const std::string var1_name = current_token().value;
30635
30637 {
30640 current_token(),
30641 "ERR210 - Expected a symbol for variable or vector element definition",
30643
30645 {
30647 }
30648
30649 return error_node();
30650 }
30652 {
30653 if (0 == (variable1 = parse_vector()))
30654 {
30657 current_token(),
30658 "ERR211 - Second parameter to swap is an invalid vector element: '" + var1_name + "'",
30660
30662 {
30664 }
30665
30666 return error_node();
30667 }
30668
30669 variable1_generated = true;
30670 }
30671 else
30672 {
30673 if (symtab_store_.is_variable(var1_name))
30674 {
30675 variable1 = symtab_store_.get_variable(var1_name);
30676 }
30677
30678 const scope_element& se = sem_.get_element(var1_name);
30679
30680 if (
30681 (se.active) &&
30682 (se.name == var1_name) &&
30684 )
30685 {
30686 variable1 = se.var_node;
30687 }
30688
30690
30691 if (0 == variable1)
30692 {
30695 current_token(),
30696 "ERR212 - Second parameter to swap is an invalid variable: '" + var1_name + "'",
30698
30700 {
30702 }
30703
30704 return error_node();
30705 }
30706 else
30707 next_token();
30708 }
30709
30711 {
30714 current_token(),
30715 "ERR213 - Expected ')' at end of swap statement",
30717
30719 {
30721 }
30722
30724 {
30726 }
30727
30728 return error_node();
30729 }
30730
30732
30735
30737
30738 if (
30739 (0 != (v0 = dynamic_cast<variable_node_ptr>(variable0))) &&
30740 (0 != (v1 = dynamic_cast<variable_node_ptr>(variable1)))
30741 )
30742 {
30744
30746 {
30748 }
30749
30751 {
30753 }
30754 }
30755 else
30758
30759 state_.activate_side_effect("parse_swap_statement()");
30760
30761 return result;
30762 }
expression_node_ptr parse_vector()
Definition exprtk.hpp:28479

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

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

27384 {
27386
27387 if (!details::imatch(current_token().value,"switch"))
27388 {
27391 current_token(),
27392 "ERR090 - Expected keyword 'switch'",
27394
27395 return error_node();
27396 }
27397
27399
27400 next_token();
27401
27403 {
27406 current_token(),
27407 "ERR091 - Expected '{' for call to switch statement",
27409
27410 return error_node();
27411 }
27412
27414
27416
27417 for ( ; ; )
27418 {
27419 if (details::imatch("case",current_token().value))
27420 {
27421 next_token();
27422
27424
27425 if (0 == condition)
27426 return error_node();
27427 else if (!token_is(token_t::e_colon))
27428 {
27431 current_token(),
27432 "ERR092 - Expected ':' for case of switch statement",
27434
27436
27437 return error_node();
27438 }
27439
27442 parse_multi_sequence("switch-consequent") :
27444
27445 if (0 == consequent)
27446 {
27448
27449 return error_node();
27450 }
27451 else if (!token_is(token_t::e_eof))
27452 {
27455 current_token(),
27456 "ERR093 - Expected ';' at end of case for switch statement",
27458
27461
27462 return error_node();
27463 }
27464
27465 // Can we optimise away the case statement?
27467 {
27470 }
27471 else
27472 {
27473 arg_list.push_back(condition );
27474 arg_list.push_back(consequent);
27475 }
27476
27477 }
27478 else if (details::imatch("default",current_token().value))
27479 {
27480 if (0 != default_statement)
27481 {
27484 current_token(),
27485 "ERR094 - Multiple default cases for switch statement",
27487
27488 return error_node();
27489 }
27490
27491 next_token();
27492
27494 {
27497 current_token(),
27498 "ERR095 - Expected ':' for default of switch statement",
27500
27501 return error_node();
27502 }
27503
27506 parse_multi_sequence("switch-default"):
27508
27509 if (0 == default_statement)
27510 return error_node();
27511 else if (!token_is(token_t::e_eof))
27512 {
27515 current_token(),
27516 "ERR096 - Expected ';' at end of default for switch statement",
27518
27519 return error_node();
27520 }
27521 }
27523 break;
27524 else
27525 {
27528 current_token(),
27529 "ERR097 - Expected '}' at end of switch statement",
27531
27532 return error_node();
27533 }
27534 }
27535
27536 const bool default_statement_present = (0 != default_statement);
27537
27539 {
27540 arg_list.push_back(default_statement);
27541 }
27542 else
27543 {
27545 }
27546
27548
27549 svd.delete_ptr = (0 == result);
27550 defstmt_delete.delete_ptr = (0 == result);
27551
27552 return result;
27553 }

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

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

31544 {
31545 static const std::string symbol_if = "if" ;
31546 static const std::string symbol_while = "while" ;
31547 static const std::string symbol_repeat = "repeat" ;
31548 static const std::string symbol_for = "for" ;
31549 static const std::string symbol_switch = "switch" ;
31550 static const std::string symbol_null = "null" ;
31551 static const std::string symbol_break = "break" ;
31552 static const std::string symbol_continue = "continue";
31553 static const std::string symbol_var = "var" ;
31554 static const std::string symbol_const = "const" ;
31555 static const std::string symbol_swap = "swap" ;
31556 static const std::string symbol_return = "return" ;
31557 static const std::string symbol_not = "not" ;
31558 static const std::string symbol_assert = "assert" ;
31559
31560 const std::string symbol = current_token().value;
31561
31563 {
31564 return parse_vararg_function();
31565 }
31567 {
31568 return parse_not_statement();
31569 }
31570 else if (valid_base_operation(symbol))
31571 {
31572 return parse_base_operation();
31573 }
31574 else if (
31576 settings_.control_struct_enabled(symbol)
31577 )
31578 {
31580 }
31581 else if (
31583 settings_.control_struct_enabled(symbol)
31584 )
31585 {
31587 }
31588 else if (
31590 settings_.control_struct_enabled(symbol)
31591 )
31592 {
31594 }
31595 else if (
31597 settings_.control_struct_enabled(symbol)
31598 )
31599 {
31601 }
31602 else if (
31604 settings_.control_struct_enabled(symbol)
31605 )
31606 {
31608 }
31610 {
31611 return parse_special_function();
31612 }
31614 {
31615 return parse_null_statement();
31616 }
31617 #ifndef exprtk_disable_break_continue
31619 {
31620 return parse_break_statement();
31621 }
31623 {
31624 return parse_continue_statement();
31625 }
31626 #endif
31628 {
31630 }
31632 {
31634 }
31636 {
31637 return parse_swap_statement();
31638 }
31639 #ifndef exprtk_disable_return_statement
31640 else if (
31642 settings_.control_struct_enabled(symbol)
31643 )
31644 {
31646 }
31647 #endif
31649 {
31650 return parse_assert_statement();
31651 }
31652 else if (symtab_store_.valid() || !sem_.empty())
31653 {
31654 return parse_symtab_symbol();
31655 }
31656 else
31657 {
31660 current_token(),
31661 "ERR241 - Unknown variable or function encountered. Symbol table(s) "
31662 "is either invalid or does not contain symbol: '" + symbol + "'",
31664
31665 return error_node();
31666 }
31667 }
expression_node_ptr parse_swap_statement()
Definition exprtk.hpp:30531
expression_node_ptr parse_for_loop()
Definition exprtk.hpp:27144
expression_node_ptr parse_special_function()
Definition exprtk.hpp:29314
bool valid_vararg_operation(const std::string &symbol) const
Definition exprtk.hpp:25236
bool valid_base_operation(const std::string &symbol) const
Definition exprtk.hpp:25222
expression_node_ptr parse_continue_statement()
Definition exprtk.hpp:29441
expression_node_ptr parse_switch_statement()
Definition exprtk.hpp:27383
expression_node_ptr check_block_statement_closure(expression_node_ptr expression)
Definition exprtk.hpp:31519
expression_node_ptr parse_while_loop()
Definition exprtk.hpp:26887
expression_node_ptr parse_define_var_statement()
Definition exprtk.hpp:30031
expression_node_ptr parse_vararg_function()
Definition exprtk.hpp:27679
expression_node_ptr parse_break_statement()
Definition exprtk.hpp:29366
expression_node_ptr parse_not_statement()
Definition exprtk.hpp:26865
expression_node_ptr parse_assert_statement()
Definition exprtk.hpp:30886
expression_node_ptr parse_null_statement()
Definition exprtk.hpp:29359
expression_node_ptr parse_return_statement()
Definition exprtk.hpp:30765
expression_node_ptr parse_symtab_symbol()
Definition exprtk.hpp:31181
expression_node_ptr parse_repeat_until_loop()
Definition exprtk.hpp:26984
expression_node_ptr parse_define_constvar_statement()
Definition exprtk.hpp:30233

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

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

31182 {
31183 const std::string symbol = current_token().value;
31184
31185 // Are we dealing with a variable or a special constant?
31187 var_ctxt_t var_ctx = symtab_store_.get_variable_context(symbol);
31188
31189 if (var_ctx.variable)
31190 {
31191 assert(var_ctx.symbol_table);
31192
31194
31195 if (symtab_store_.is_constant_node(symbol))
31196 {
31197 result_variable = expression_generator_(var_ctx.variable->value());
31198 }
31199 else if (symbol_table_t::e_immutable == var_ctx.symbol_table->mutability())
31200 {
31202 result_variable = var_ctx.variable;
31203 }
31204
31206 {
31208
31209 return error_node();
31210 }
31211
31213
31214 next_token();
31215
31216 return result_variable;
31217 }
31218
31219 // Are we dealing with a locally defined variable, vector or string?
31220 if (!sem_.empty())
31221 {
31222 scope_element& se = sem_.get_active_element(symbol);
31223
31224 if (se.active && details::imatch(se.name, symbol))
31225 {
31226 if (
31227 (scope_element::e_variable == se.type) ||
31229 )
31230 {
31231 se.active = true;
31233
31235 return error_node();
31236
31237 next_token();
31238
31239 return (scope_element::e_variable == se.type) ?
31240 se.var_node :
31241 expression_generator_(se.var_node->value());
31242 }
31243 else if (scope_element::e_vector == se.type)
31244 {
31245 return parse_vector();
31246 }
31247 #ifndef exprtk_disable_string_capabilities
31248 else if (scope_element::e_string == se.type)
31249 {
31250 return parse_string();
31251 }
31252 #endif
31253 }
31254 }
31255
31256 #ifndef exprtk_disable_string_capabilities
31257 // Are we dealing with a string variable?
31258 if (symtab_store_.is_stringvar(symbol))
31259 {
31260 return parse_string();
31261 }
31262 #endif
31263
31264 {
31265 // Are we dealing with a function?
31266 ifunction<T>* function = symtab_store_.get_function(symbol);
31267
31268 if (function)
31269 {
31271
31274
31275 if (func_node)
31276 return func_node;
31277 else
31278 {
31281 current_token(),
31282 "ERR231 - Failed to generate node for function: '" + symbol + "'",
31284
31285 return error_node();
31286 }
31287 }
31288 }
31289
31290 {
31291 // Are we dealing with a vararg function?
31293
31294 if (vararg_function)
31295 {
31297
31300
31301 if (vararg_func_node)
31302 return vararg_func_node;
31303 else
31304 {
31307 current_token(),
31308 "ERR232 - Failed to generate node for vararg function: '" + symbol + "'",
31310
31311 return error_node();
31312 }
31313 }
31314 }
31315
31316 {
31317 // Are we dealing with a vararg generic function?
31319
31320 if (generic_function)
31321 {
31323
31326
31327 if (genericfunc_node)
31328 return genericfunc_node;
31329 else
31330 {
31333 current_token(),
31334 "ERR233 - Failed to generate node for generic function: '" + symbol + "'",
31336
31337 return error_node();
31338 }
31339 }
31340 }
31341
31342 #ifndef exprtk_disable_string_capabilities
31343 {
31344 // Are we dealing with a vararg string returning function?
31346
31347 if (string_function)
31348 {
31350
31353
31354 if (stringfunc_node)
31355 return stringfunc_node;
31356 else
31357 {
31360 current_token(),
31361 "ERR234 - Failed to generate node for string function: '" + symbol + "'",
31363
31364 return error_node();
31365 }
31366 }
31367 }
31368
31369 {
31370 // Are we dealing with a vararg overloaded scalar/string returning function?
31372
31374 {
31376
31379
31381 return overloadfunc_node;
31382 else
31383 {
31386 current_token(),
31387 "ERR235 - Failed to generate node for overload function: '" + symbol + "'",
31389
31390 return error_node();
31391 }
31392 }
31393 }
31394 #endif
31395
31396 // Are we dealing with a vector?
31397 if (symtab_store_.is_vector(symbol))
31398 {
31400 return parse_vector();
31401 }
31402
31404 {
31405 if (
31406 settings_.function_enabled(symbol) ||
31408 )
31409 {
31412 current_token(),
31413 "ERR236 - Invalid use of reserved symbol '" + symbol + "'",
31415
31416 return error_node();
31417 }
31418 }
31419
31420 // Should we handle unknown symbols?
31422 {
31423 if (!(settings_.rsrvd_sym_usr_disabled() && details::is_reserved_symbol(symbol)))
31424 {
31425 symbol_table_t& symtab = symtab_store_.get_symbol_table();
31426
31428
31430 {
31431 T default_value = T(0);
31432
31434
31436 {
31437 bool create_result = false;
31438
31439 switch (usr_symbol_type)
31440 {
31442 create_result = symtab.create_variable(symbol, default_value);
31443 break;
31444
31446 create_result = symtab.add_constant(symbol, default_value);
31447 break;
31448
31449 default : create_result = false;
31450 }
31451
31452 if (create_result)
31453 {
31455
31456 if (var)
31457 {
31458 if (symtab_store_.is_constant_node(symbol))
31459 {
31460 var = expression_generator_(var->value());
31461 }
31462
31464
31466 {
31468 return error_node();
31469 }
31470
31471 next_token();
31472
31473 return var;
31474 }
31475 }
31476 }
31477
31480 current_token(),
31481 "ERR237 - Failed to create variable: '" + symbol + "'" +
31482 (error_message.empty() ? "" : " - " + error_message),
31484
31485 }
31487 {
31489 {
31491
31492 if (result)
31493 {
31494 return result;
31495 }
31496 }
31497
31500 current_token(),
31501 "ERR238 - Failed to resolve symbol: '" + symbol + "'" +
31502 (error_message.empty() ? "" : " - " + error_message),
31504 }
31505
31506 return error_node();
31507 }
31508 }
31509
31512 current_token(),
31513 "ERR239 - Undefined symbol: '" + symbol + "'",
31515
31516 return error_node();
31517 }
expression_node_ptr parse_string_function_call(igeneric_function< T > *function, const std::string &function_name)
Definition exprtk.hpp:29125
expression_node_ptr parse_function_invocation(ifunction< T > *function, const std::string &function_name)
Definition exprtk.hpp:26033
expression_node_ptr parse_generic_function_call(igeneric_function< T > *function, const std::string &function_name)
Definition exprtk.hpp:28937
expression_node_ptr parse_vararg_function_call(ivararg_function< T > *vararg_function, const std::string &vararg_function_name)
Definition exprtk.hpp:28581
expression_node_ptr parse_overload_function_call(igeneric_function< T > *function, const std::string &function_name)
Definition exprtk.hpp:29175
bool post_variable_process(const std::string &symbol)
Definition exprtk.hpp:31074
expression_node_ptr parse_string()
Definition exprtk.hpp:28271
symbol_table< T > symbol_table_t
Definition exprtk.hpp:22604

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

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

26746 {
26747 // Parse: [condition][?][consequent][:][alternative]
26750
26751 bool result = true;
26752
26753 if (0 == condition)
26754 {
26757 current_token(),
26758 "ERR056 - Encountered invalid condition branch for ternary if-statement",
26760
26761 return error_node();
26762 }
26763 else if (!token_is(token_t::e_ternary))
26764 {
26767 current_token(),
26768 "ERR057 - Expected '?' after condition of ternary if-statement",
26770
26771 result = false;
26772 }
26773 else if (0 == (consequent = parse_expression()))
26774 {
26777 current_token(),
26778 "ERR058 - Failed to parse consequent for ternary if-statement",
26780
26781 result = false;
26782 }
26783 else if (!token_is(token_t::e_colon))
26784 {
26787 current_token(),
26788 "ERR059 - Expected ':' between ternary if-statement consequent and alternative",
26790
26791 result = false;
26792 }
26793 else if (0 == (alternative = parse_expression()))
26794 {
26797 current_token(),
26798 "ERR060 - Failed to parse alternative for ternary if-statement",
26800
26801 result = false;
26802 }
26803
26804 #ifndef exprtk_disable_string_capabilities
26805 if (result)
26806 {
26809
26811 {
26813 {
26815 .conditional_string(condition, consequent, alternative);
26816 }
26817
26820 current_token(),
26821 "ERR061 - Return types of ternary differ: string/non-string",
26823
26824 result = false;
26825 }
26826 }
26827 #endif
26828
26829 if (result)
26830 {
26833
26835 {
26837 {
26839 .conditional_vector(condition, consequent, alternative);
26840 }
26841
26844 current_token(),
26845 "ERR062 - Return types of ternary differ: vector/non-vector",
26847
26848 result = false;
26849 }
26850 }
26851
26852 if (!result)
26853 {
26857
26858 return error_node();
26859 }
26860 else
26862 .conditional(condition, consequent, alternative);
26863 }

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

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

30429 {
30430 if (
30433 )
30434 {
30437 current_token(),
30438 "ERR200 - Expected a '{}' for uninitialised var definition",
30440
30441 return error_node();
30442 }
30444 {
30447 current_token(),
30448 "ERR201 - Expected ';' after uninitialised variable definition",
30450
30451 return error_node();
30452 }
30453
30454 expression_node_ptr var_node = reinterpret_cast<expression_node_ptr>(0);
30455
30456 scope_element& se = sem_.get_element(var_name);
30457
30458 if (se.name == var_name)
30459 {
30460 if (se.active)
30461 {
30464 current_token(),
30465 "ERR202 - Illegal redefinition of local variable: '" + var_name + "'",
30467
30468 return error_node();
30469 }
30470 else if (scope_element::e_variable == se.type)
30471 {
30472 var_node = se.var_node;
30473 se.active = true;
30474 se.ref_count++;
30475 }
30476 }
30477
30478 if (0 == var_node)
30479 {
30480 const std::size_t predicted_total_lclsymb_size = sizeof(T) + sem_.total_local_symb_size_bytes();
30481
30483 {
30486 current_token(),
30487 "ERR203 - Adding variable '" + var_name + "' "
30488 "will exceed max total local symbol size of: " + details::to_str(settings().max_total_local_symbol_size_bytes()) + " bytes, "
30489 "current total size: " + details::to_str(sem_.total_local_symb_size_bytes()) + " bytes",
30491
30492 return error_node();
30493 }
30494
30496 nse.name = var_name;
30497 nse.active = true;
30498 nse.ref_count = 1;
30500 nse.depth = state_.scope_depth;
30501 nse.ip_index = sem_.next_ip_index();
30502 nse.data = new T(T(0));
30503 nse.var_node = node_allocator_.allocate<variable_node_t>(*reinterpret_cast<T*>(nse.data));
30504
30505 if (!sem_.add_element(nse))
30506 {
30509 current_token(),
30510 "ERR204 - Failed to add new local variable '" + var_name + "' to SEM",
30512
30513 sem_.free_element(nse);
30514
30515 return error_node();
30516 }
30517
30518 assert(sem_.total_local_symb_size_bytes() <= settings().max_total_local_symbol_size_bytes());
30519
30520 exprtk_debug(("parse_uninitialised_var_statement() - INFO - Added new local variable: %s\n",
30521 nse.name.c_str()));
30522 }
30523
30525
30526 state_.activate_side_effect("parse_uninitialised_var_statement()");
30527
30528 return expression_generator_(T(0));
30529 }

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

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

27680 {
27682
27684 const std::string symbol = current_token().value;
27685
27686 if (details::imatch(symbol,"~"))
27687 {
27688 next_token();
27690 }
27691 else if (details::imatch(symbol,"[*]"))
27692 {
27694 }
27695 else if (details::imatch(symbol, "avg" )) opt_type = details::e_avg ;
27696 else if (details::imatch(symbol, "mand")) opt_type = details::e_mand;
27697 else if (details::imatch(symbol, "max" )) opt_type = details::e_max ;
27698 else if (details::imatch(symbol, "min" )) opt_type = details::e_min ;
27699 else if (details::imatch(symbol, "mor" )) opt_type = details::e_mor ;
27700 else if (details::imatch(symbol, "mul" )) opt_type = details::e_prod;
27701 else if (details::imatch(symbol, "sum" )) opt_type = details::e_sum ;
27702 else
27703 {
27706 current_token(),
27707 "ERR104 - Unsupported built-in vararg function: " + symbol,
27709
27710 return error_node();
27711 }
27712
27714
27716
27717 next_token();
27718
27720 {
27723 current_token(),
27724 "ERR105 - Expected '(' for call to vararg function: " + symbol,
27726
27727 return error_node();
27728 }
27729
27731 {
27734 current_token(),
27735 "ERR106 - vararg function: " + symbol +
27736 " requires at least one input parameter",
27738
27739 return error_node();
27740 }
27741
27742 for ( ; ; )
27743 {
27745
27746 if (0 == arg)
27747 return error_node();
27748 else
27749 arg_list.push_back(arg);
27750
27752 break;
27753 else if (!token_is(token_t::e_comma))
27754 {
27757 current_token(),
27758 "ERR107 - Expected ',' for call to vararg function: " + symbol,
27760
27761 return error_node();
27762 }
27763 }
27764
27766
27767 svd.delete_ptr = (0 == result);
27768 return result;
27769 }
expression_node_ptr parse_multi_switch_statement()
Definition exprtk.hpp:27555

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

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

28582 {
28584
28586
28587 next_token();
28588
28590 {
28592 {
28593 if (!vararg_function->allow_zero_parameters())
28594 {
28597 current_token(),
28598 "ERR127 - Zero parameter call to vararg function: "
28599 + vararg_function_name + " not allowed",
28601
28602 return error_node();
28603 }
28604 }
28605 else
28606 {
28607 for ( ; ; )
28608 {
28610
28611 if (0 == arg)
28612 return error_node();
28613 else
28614 arg_list.push_back(arg);
28615
28617 break;
28618 else if (!token_is(token_t::e_comma))
28619 {
28622 current_token(),
28623 "ERR128 - Expected ',' for call to vararg function: "
28626
28627 return error_node();
28628 }
28629 }
28630 }
28631 }
28632 else if (!vararg_function->allow_zero_parameters())
28633 {
28636 current_token(),
28637 "ERR129 - Zero parameter call to vararg function: "
28638 + vararg_function_name + " not allowed",
28640
28641 return error_node();
28642 }
28643
28644 if (arg_list.size() < vararg_function->min_num_args())
28645 {
28648 current_token(),
28649 "ERR130 - Invalid number of parameters to call to vararg function: "
28650 + vararg_function_name + ", require at least "
28651 + details::to_str(static_cast<int>(vararg_function->min_num_args())) + " parameters",
28653
28654 return error_node();
28655 }
28656 else if (arg_list.size() > vararg_function->max_num_args())
28657 {
28660 current_token(),
28661 "ERR131 - Invalid number of parameters to call to vararg function: "
28662 + vararg_function_name + ", require no more than "
28663 + details::to_str(static_cast<int>(vararg_function->max_num_args())) + " parameters",
28665
28666 return error_node();
28667 }
28668
28670
28671 svd.delete_ptr = (0 == result);
28672
28673 return result;
28674 }

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

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

28480 {
28481 const std::string vector_name = current_token().value;
28482
28484
28485 const scope_element& se = sem_.get_active_element(vector_name);
28486
28487 if (
28488 !details::imatch(se.name, vector_name) ||
28489 (se.depth > state_.scope_depth) ||
28490 (scope_element::e_vector != se.type)
28491 )
28492 {
28494 vec_ctxt_t vec_ctx = symtab_store_.get_vector_context(vector_name);
28495
28496 if (0 == vec_ctx.vector_holder)
28497 {
28500 current_token(),
28501 "ERR125 - Symbol '" + vector_name + " not a vector",
28503
28504 return error_node();
28505 }
28506
28507 assert(0 != vec_ctx.vector_holder);
28508 assert(0 != vec_ctx.symbol_table );
28509
28510 vec = vec_ctx.vector_holder;
28511
28512 if (symbol_table_t::e_immutable == vec_ctx.symbol_table->mutability())
28513 {
28515 current_token(),
28516 make_memory_range(vec->data(), vec->size()));
28517 }
28518 }
28519 else
28520 {
28521 vec = se.vec_node;
28522 }
28523
28524 assert(0 != vec);
28525
28526 next_token();
28527
28529 {
28530 return node_allocator_.allocate<vector_node_t>(vec);
28531 }
28533 {
28534 return (vec->rebaseable()) ?
28537 }
28538
28540
28541 if (index_expr)
28542 {
28544
28546 }
28547
28548 return error_node();
28549 }
details::vector_size_node< T > vector_size_node_t
Definition exprtk.hpp:22576
vector_holder_t * vector_holder_ptr
Definition exprtk.hpp:22607

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

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

28450 {
28452
28453 if (0 == (index_expr = parse_expression()))
28454 {
28457 current_token(),
28458 "ERR123 - Failed to parse index for vector: '" + vector_name + "'",
28460
28461 return error_node();
28462 }
28464 {
28467 current_token(),
28468 "ERR124 - Expected ']' for index of vector: '" + vector_name + "'",
28470
28472
28473 return error_node();
28474 }
28475
28476 return index_expr;
28477 }

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

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

26888 {
26889 // Parse: [while][(][test expr][)][{][expression][}]
26893
26894 bool result = true;
26895
26896 next_token();
26897
26899 {
26902 current_token(),
26903 "ERR064 - Expected '(' at start of while-loop condition statement",
26905
26906 return error_node();
26907 }
26908 else if (0 == (condition = parse_expression()))
26909 {
26912 current_token(),
26913 "ERR065 - Failed to parse condition for while-loop",
26915
26916 return error_node();
26917 }
26918 else if (!token_is(token_t::e_rbracket))
26919 {
26922 current_token(),
26923 "ERR066 - Expected ')' at end of while-loop condition statement",
26925
26926 result = false;
26927 }
26928
26929 brkcnt_list_.push_front(false);
26930
26931 if (result)
26932 {
26933 scoped_inc_dec sid(state_.parsing_loop_stmt_count);
26934
26935 if (0 == (branch = parse_multi_sequence("while-loop", true)))
26936 {
26939 current_token(),
26940 "ERR067 - Failed to parse body of while-loop"));
26941 result = false;
26942 }
26943 else if (0 == (result_node = expression_generator_.while_loop(condition,
26944 branch,
26945 brkcnt_list_.front())))
26946 {
26949 current_token(),
26950 "ERR068 - Failed to synthesize while-loop",
26952
26953 result = false;
26954 }
26955 }
26956
26958
26959 if (!result)
26960 {
26964
26965 return error_node();
26966 }
26967
26968 if (result_node && result_node->valid())
26969 {
26970 return result_node;
26971 }
26972
26975 current_token(),
26976 "ERR069 - Failed to synthesize 'valid' while-loop",
26978
26980
26981 return error_node();
26982 }

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

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

25445 {
25446 if (!current_state_stack_.empty())
25447 {
25448 current_state_stack_.pop_back();
25449 }
25450 }

Referenced by exprtk::parser< Type >::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 31099 of file exprtk.hpp.

31100 {
31101 bool implied_mul = false;
31102
31104 return true;
31105
31107 return true;
31108
31110
31111 switch (token)
31112 {
31116 break;
31117
31121 break;
31122
31126 break;
31127
31128 default : return true;
31129 }
31130
31131 if (implied_mul)
31132 {
31133 if (!settings_.commutative_check_enabled())
31134 {
31137 current_token(),
31138 "ERR230 - Invalid sequence of brackets",
31140
31141 return false;
31142 }
31143 else if (token_t::e_eof != current_token().type)
31144 {
31145 lexer().insert_front(current_token().type);
31146 lexer().insert_front(token_t::e_mul);
31147 next_token();
31148 }
31149 }
31150
31151 return true;
31152 }

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

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

31075 {
31076 if (
31080 )
31081 {
31082 if (!settings_.commutative_check_enabled())
31083 {
31086 current_token(),
31087 "ERR229 - Invalid sequence of variable '" + symbol + "' and bracket",
31089
31090 return false;
31091 }
31092
31093 lexer().insert_front(token_t::e_mul);
31094 }
31095
31096 return true;
31097 }

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

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

24956 {
24957 for (std::size_t i = 0; i < lexer().size(); ++i)
24958 {
24959 if (lexer()[i].is_error())
24960 {
24961 std::string diagnostic = "ERR004 - ";
24962
24963 switch (lexer()[i].type)
24964 {
24965 case lexer::token::e_error : diagnostic += "General token error";
24966 break;
24967
24968 case lexer::token::e_err_symbol : diagnostic += "Symbol error";
24969 break;
24970
24971 case lexer::token::e_err_number : diagnostic += "Invalid numeric token";
24972 break;
24973
24974 case lexer::token::e_err_string : diagnostic += "Invalid string token";
24975 break;
24976
24977 case lexer::token::e_err_sfunc : diagnostic += "Invalid special function token";
24978 break;
24979
24980 default : diagnostic += "Unknown compiler error";
24981 }
24982
24985 lexer()[i],
24986 diagnostic + ": " + lexer()[i].value,
24988 }
24989 }
24990 }

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

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

25440 {
25442 }

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

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

25196 {
25198 }

◆ register_compilation_timeout_check()

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

Definition at line 25190 of file exprtk.hpp.

25191 {
25193 }

◆ register_local_vars()

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

Definition at line 41955 of file exprtk.hpp.

41956 {
41957 for (std::size_t i = 0; i < sem_.size(); ++i)
41958 {
41959 scope_element& se = sem_.get_element(i);
41960
41961 exprtk_debug(("register_local_vars() - se[%s]\n", se.name.c_str()));
41962
41963 if (
41964 (scope_element::e_variable == se.type) ||
41965 (scope_element::e_literal == se.type) ||
41967 )
41968 {
41969 if (se.var_node)
41970 {
41971 e.register_local_var(se.var_node);
41972 }
41973
41974 if (se.data)
41975 {
41976 e.register_local_data(se.data, 1, 0);
41977 }
41978 }
41979 else if (scope_element::e_vector == se.type)
41980 {
41981 if (se.vec_node)
41982 {
41983 e.register_local_var(se.vec_node);
41984 }
41985
41986 if (se.data)
41987 {
41988 e.register_local_data(se.data, se.size, 1);
41989 }
41990 }
41991 #ifndef exprtk_disable_string_capabilities
41992 else if (scope_element::e_string == se.type)
41993 {
41994 if (se.str_node)
41995 {
41996 e.register_local_var(se.str_node);
41997 }
41998
41999 if (se.data)
42000 {
42001 e.register_local_data(se.data, se.size, 2);
42002 }
42003 }
42004 #endif
42005
42006 se.var_node = 0;
42007 se.vec_node = 0;
42008 #ifndef exprtk_disable_string_capabilities
42009 se.str_node = 0;
42010 #endif
42011 se.data = 0;
42012 se.ref_count = 0;
42013 se.active = false;
42014 }
42015 }

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

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

25181 {
25183 }

◆ register_return_results()

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

Definition at line 42017 of file exprtk.hpp.

42018 {
42020 results_context_ = 0;
42021 }

Referenced by exprtk::parser< Type >::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 25185 of file exprtk.hpp.

25186 {
25188 }

◆ remove_last_error()

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

Definition at line 41939 of file exprtk.hpp.

41940 {
41941 if (!error_list_.empty())
41942 {
41943 error_list_.pop_back();
41944 }
41945 }

◆ remove_replace_symbol()

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

Definition at line 25149 of file exprtk.hpp.

25150 {
25151 if (!settings_.replacer_enabled())
25152 return false;
25154 return false;
25155 else
25156 return symbol_replacer_.remove(symbol);
25157 }

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

25140 {
25141 if (!settings_.replacer_enabled())
25142 return false;
25144 return false;
25145 else
25147 }

◆ results_ctx()

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

Definition at line 42191 of file exprtk.hpp.

42192 {
42193 if (0 == results_context_)
42194 {
42196 }
42197
42198 return (*results_context_);
42199 }
results_context< T > results_context_t
Definition exprtk.hpp:22651

◆ return_cleanup()

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

Definition at line 42201 of file exprtk.hpp.

42202 {
42203 #ifndef exprtk_disable_return_statement
42204 if (results_context_)
42205 {
42206 delete results_context_;
42207 results_context_ = 0;
42208 }
42209
42210 state_.return_stmt_present = false;
42211 #endif
42212 }

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

Here is the caller graph for this function:

◆ run_assemblies()

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

Definition at line 24992 of file exprtk.hpp.

24993 {
24994 if (settings_.commutative_check_enabled())
24995 {
24996 helper_assembly_.run_inserters(lexer());
24997 }
24998
24999 if (settings_.joiner_enabled())
25000 {
25001 helper_assembly_.run_joiners(lexer());
25002 }
25003
25004 if (settings_.replacer_enabled())
25005 {
25006 helper_assembly_.run_modifiers(lexer());
25007 }
25008
25009 if (
25010 settings_.numeric_check_enabled () ||
25011 settings_.bracket_check_enabled () ||
25012 settings_.sequence_check_enabled()
25013 )
25014 {
25015 if (!helper_assembly_.run_scanners(lexer()))
25016 {
25017 if (helper_assembly_.error_token_scanner)
25018 {
25023
25024 if (0 != (bracket_checker_ptr = dynamic_cast<lexer::helper::bracket_checker*>(helper_assembly_.error_token_scanner)))
25025 {
25028 bracket_checker_ptr->error_token(),
25029 "ERR005 - Mismatched brackets: '" + bracket_checker_ptr->error_token().value + "'",
25031 }
25032 else if (0 != (numeric_checker_ptr = dynamic_cast<lexer::helper::numeric_checker<T>*>(helper_assembly_.error_token_scanner)))
25033 {
25034 for (std::size_t i = 0; i < numeric_checker_ptr->error_count(); ++i)
25035 {
25037
25041 "ERR006 - Invalid numeric token: '" + error_token.value + "'",
25043 }
25044
25046 {
25047 numeric_checker_ptr->clear_errors();
25048 }
25049 }
25050 else if (0 != (sequence_validator_ptr = dynamic_cast<lexer::helper::sequence_validator*>(helper_assembly_.error_token_scanner)))
25051 {
25053 {
25055
25058 error_token.first,
25059 "ERR007 - Invalid token sequence: '" +
25060 error_token.first.value + "' and '" +
25061 error_token.second.value + "'",
25063 }
25064
25066 {
25067 sequence_validator_ptr->clear_errors();
25068 }
25069 }
25070 else if (0 != (sequence_validator3_ptr = dynamic_cast<lexer::helper::sequence_validator_3tokens*>(helper_assembly_.error_token_scanner)))
25071 {
25073 {
25075
25078 error_token.first,
25079 "ERR008 - Invalid token sequence: '" +
25080 error_token.first.value + "' and '" +
25081 error_token.second.value + "'",
25083 }
25084
25086 {
25087 sequence_validator3_ptr->clear_errors();
25088 }
25089 }
25090 }
25091
25092 return false;
25093 }
25094 }
25095
25096 return true;
25097 }
std::string error() const
Definition exprtk.hpp:25114
std::size_t error_count() const
Definition exprtk.hpp:25124

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

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

41935 {
41936 error_list_.push_back(error_type);
41937 }

Referenced by exprtk::parser< Type >::check_block_statement_closure(), exprtk::parser< Type >::compile(), exprtk::parser< Type >::halt_compilation_check(), exprtk::parser< Type >::parse_assert_statement(), exprtk::parser< Type >::parse_base_function_call(), exprtk::parser< Type >::parse_base_operation(), exprtk::parser< Type >::parse_branch(), exprtk::parser< Type >::parse_break_statement(), exprtk::parser< Type >::parse_conditional_statement(), exprtk::parser< Type >::parse_conditional_statement_01(), exprtk::parser< Type >::parse_conditional_statement_02(), exprtk::parser< Type >::parse_const_string(), exprtk::parser< Type >::parse_continue_statement(), exprtk::parser< Type >::parse_corpus(), exprtk::parser< Type >::parse_define_constvar_statement(), exprtk::parser< Type >::parse_define_string_statement(), exprtk::parser< Type >::parse_define_var_statement(), exprtk::parser< Type >::parse_define_vector_statement(), exprtk::parser< Type >::parse_expression(), exprtk::parser< Type >::parse_for_loop(), exprtk::parser< Type >::parse_function_call(), exprtk::parser< Type >::parse_function_call_0(), exprtk::parser< Type >::parse_function_invocation(), exprtk::parser< Type >::parse_generic_function_call(), exprtk::parser< Type >::parse_igeneric_function_params(), exprtk::parser< Type >::parse_multi_sequence(), exprtk::parser< Type >::parse_multi_switch_statement(), exprtk::parser< Type >::parse_not_statement(), exprtk::parser< Type >::parse_overload_function_call(), exprtk::parser< Type >::parse_range(), exprtk::parser< Type >::parse_repeat_until_loop(), exprtk::parser< Type >::parse_return_statement(), exprtk::parser< Type >::parse_special_function(), exprtk::parser< Type >::parse_string(), exprtk::parser< Type >::parse_string_function_call(), exprtk::parser< Type >::parse_string_range_statement(), exprtk::parser< Type >::parse_swap_statement(), exprtk::parser< Type >::parse_switch_statement(), exprtk::parser< Type >::parse_symbol(), exprtk::parser< Type >::parse_symtab_symbol(), exprtk::parser< Type >::parse_ternary_conditional_statement(), exprtk::parser< Type >::parse_uninitialised_var_statement(), exprtk::parser< Type >::parse_vararg_function(), exprtk::parser< Type >::parse_vararg_function_call(), exprtk::parser< Type >::parse_vector(), exprtk::parser< Type >::parse_vector_index(), exprtk::parser< Type >::parse_while_loop(), exprtk::parser< Type >::post_bracket_process(), exprtk::parser< Type >::post_variable_process(), exprtk::parser< T >::parse_special_function_impl< Type, NumberOfParameters >::process(), exprtk::parser< Type >::process_lexer_errors(), exprtk::parser< Type >::run_assemblies(), exprtk::parser< Type >::simplify_unary_negation_branch(), exprtk::parser< Type >::synthesize_vector_element(), and exprtk::parser< Type >::valid_settings().

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

Definition at line 41947 of file exprtk.hpp.

41948 {
41949 if (synthesis_error_.empty())
41950 {
41952 }
41953 }

◆ settings()

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

Definition at line 25099 of file exprtk.hpp.

25100 {
25101 return settings_;
25102 }

Referenced by exprtk::parser< Type >::parse_define_constvar_statement(), exprtk::parser< Type >::parse_define_var_statement(), exprtk::parser< Type >::parse_define_vector_statement(), and exprtk::parser< Type >::parse_uninitialised_var_statement().

Here is the caller graph for this function:

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

27919 {
27920 if (expression_list.empty())
27921 return error_node();
27922 else if (1 == expression_list.size())
27923 return expression_list[0];
27924
27926
27927 exprtk_debug(("simplify() - expression_list.size: %d side_effect_list.size(): %d\n",
27928 static_cast<int>(expression_list .size()),
27929 static_cast<int>(side_effect_list.size())));
27930
27931 bool return_node_present = false;
27932
27933 for (std::size_t i = 0; i < (expression_list.size() - 1); ++i)
27934 {
27936 continue;
27937 else if (
27941 )
27942 {
27944
27945 // Remove all subexpressions after first short-circuit
27946 // node has been encountered.
27947
27948 for (std::size_t j = i + 1; j < expression_list.size(); ++j)
27949 {
27951 }
27952
27953 return_node_present = true;
27954
27955 break;
27956 }
27957 else if (
27961 )
27962 {
27964 continue;
27965 }
27966 else
27968 }
27969
27971 {
27972 tmp_expression_list.push_back(expression_list.back());
27973 }
27974
27976
27977 if (tmp_expression_list.size() > expression_list.size())
27978 {
27979 exprtk_debug(("simplify() - Reduced subexpressions from %d to %d\n",
27980 static_cast<int>(tmp_expression_list.size()),
27981 static_cast<int>(expression_list .size())));
27982 }
27983
27984 if (
27986 side_effect_list.back() ||
27987 (expression_list.size() > 1)
27988 )
27989 state_.activate_side_effect("simplify()");
27990
27991 if (1 == expression_list.size())
27992 return expression_list[0];
27995 else
27997 }

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

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

25792 {
25793 {
25795 ubn_t* n = dynamic_cast<ubn_t*>(node);
25796
25797 if (n)
25798 {
25799 expression_node_ptr un_r = n->branch(0);
25800 n->release();
25802 node = un_r;
25803
25804 return true;
25805 }
25806 }
25807
25808 {
25810
25811 uvn_t* n = dynamic_cast<uvn_t*>(node);
25812
25813 if (n)
25814 {
25815 const T& v = n->v();
25817
25818 if (
25819 (0 != (return_node = symtab_store_.get_variable(v))) ||
25820 (0 != (return_node = sem_ .get_variable(v)))
25821 )
25822 {
25824 node = return_node;
25825
25826 return true;
25827 }
25828 else
25829 {
25832 current_token(),
25833 "ERR020 - Failed to find variable node in symbol table",
25835
25837
25838 return false;
25839 }
25840 }
25841 }
25842
25843 return false;
25844 }

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

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

28555 {
28556 // Perform compile-time range check
28558 {
28559 const std::size_t index = static_cast<std::size_t>(details::numeric::to_int32(index_expr->value()));
28560 const std::size_t vec_size = vec->size();
28561
28562 if (index >= vec_size)
28563 {
28566 current_token(),
28567 "ERR126 - Index of " + details::to_str(index) + " out of range for "
28568 "vector '" + vector_name + "' of size " + details::to_str(vec_size),
28570
28573
28574 return error_node();
28575 }
28576 }
28577
28578 return expression_generator_.vector_element(vector_name, vec, vec_node, index_expr);
28579 }

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

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

25135 {
25136 return sem_.total_local_symb_size_bytes();
25137 }

◆ valid_base_operation()

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

Definition at line 25222 of file exprtk.hpp.

25223 {
25224 const std::size_t length = symbol.size();
25225
25226 if (
25227 (length < 3) || // Shortest base op symbol length
25228 (length > 9) // Longest base op symbol length
25229 )
25230 return false;
25231 else
25232 return settings_.function_enabled(symbol) &&
25233 (base_ops_map_.end() != base_ops_map_.find(symbol));
25234 }

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

Here is the caller graph for this function:

◆ valid_settings()

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

Definition at line 42214 of file exprtk.hpp.

42215 {
42216 const std::size_t max_local_vector_size_bytes = sizeof(T) * settings_.max_local_vector_size();
42217
42218 if (max_local_vector_size_bytes > settings_.max_total_local_symbol_size_bytes())
42219 {
42222 "ERR284 - Max local vector size of " + details::to_str(max_local_vector_size_bytes) + " bytes "
42223 "is larger than max total local symbol size of " + details::to_str(settings_.max_total_local_symbol_size_bytes()) + " bytes",
42225
42226 return false;
42227 }
42228
42229 return true;
42230 }

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

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

25237 {
25238 static const std::string s_sum = "sum" ;
25239 static const std::string s_mul = "mul" ;
25240 static const std::string s_avg = "avg" ;
25241 static const std::string s_min = "min" ;
25242 static const std::string s_max = "max" ;
25243 static const std::string s_mand = "mand";
25244 static const std::string s_mor = "mor" ;
25245 static const std::string s_multi = "~" ;
25246 static const std::string s_mswitch = "[*]" ;
25247
25248 return
25249 (
25259 ) &&
25260 settings_.function_enabled(symbol);
25261 }

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

Here is the caller graph for this function:

◆ 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

Definition at line 42276 of file exprtk.hpp.

◆ assert_ids_

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

Definition at line 42277 of file exprtk.hpp.

◆ base_ops_map_

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

Definition at line 42249 of file exprtk.hpp.

◆ binary_op_map_

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

Definition at line 42251 of file exprtk.hpp.

◆ bracket_checker_

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

Definition at line 42268 of file exprtk.hpp.

◆ brkcnt_list_

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

Definition at line 42243 of file exprtk.hpp.

◆ commutative_inserter_

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

Definition at line 42264 of file exprtk.hpp.

◆ compilation_check_ptr_

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

Definition at line 42275 of file exprtk.hpp.

◆ current_state_stack_

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

Definition at line 42257 of file exprtk.hpp.

◆ dec_

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

Definition at line 42241 of file exprtk.hpp.

◆ default_precedence

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

Definition at line 25411 of file exprtk.hpp.

◆ default_usr_

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

Definition at line 42248 of file exprtk.hpp.

◆ error_list_

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

Definition at line 42242 of file exprtk.hpp.

◆ expression_generator_

◆ helper_assembly_

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

Definition at line 42262 of file exprtk.hpp.

◆ immutable_memory_map_

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

Definition at line 42259 of file exprtk.hpp.

◆ immutable_symtok_map_

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

Definition at line 42260 of file exprtk.hpp.

◆ inv_binary_op_map_

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

Definition at line 42252 of file exprtk.hpp.

◆ loop_runtime_check_

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

Definition at line 42273 of file exprtk.hpp.

◆ node_allocator_

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

Definition at line 42239 of file exprtk.hpp.

◆ numeric_checker_

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

Definition at line 42269 of file exprtk.hpp.

◆ operator_joiner_2_

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

Definition at line 42265 of file exprtk.hpp.

◆ operator_joiner_3_

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

Definition at line 42266 of file exprtk.hpp.

◆ resolve_unknown_symbol_

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

Definition at line 42245 of file exprtk.hpp.

◆ results_context_

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

Definition at line 42246 of file exprtk.hpp.

◆ sem_

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

Definition at line 42256 of file exprtk.hpp.

◆ sequence_validator_

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

Definition at line 42270 of file exprtk.hpp.

◆ sequence_validator_3tkns_

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

Definition at line 42271 of file exprtk.hpp.

◆ settings_

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

Definition at line 42237 of file exprtk.hpp.

Referenced by exprtk::parser< T >::expression_generator< Type >::synthesize_cocov_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_covocov_expression0::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_covovoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_covovov_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococ_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vococov_expression0::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_vocovoc_expression0::process(), exprtk::parser< T >::expression_generator< Type >::synthesize_vocovov_expression0::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_vovocov_expression0::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_vovovoc_expression0::process(), and exprtk::parser< T >::expression_generator< Type >::synthesize_vovovov_expression0::process().

◆ sf3_map_

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

Definition at line 42253 of file exprtk.hpp.

◆ sf4_map_

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

Definition at line 42254 of file exprtk.hpp.

◆ state_

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

Definition at line 42244 of file exprtk.hpp.

◆ symbol_replacer_

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

Definition at line 42267 of file exprtk.hpp.

◆ symtab_store_

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

Definition at line 42240 of file exprtk.hpp.

◆ synthesis_error_

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

Definition at line 42255 of file exprtk.hpp.

◆ unary_op_map_

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

Definition at line 42250 of file exprtk.hpp.

◆ unknown_symbol_resolver_

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

Definition at line 42247 of file exprtk.hpp.

◆ vector_access_runtime_check_

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

Definition at line 42274 of file exprtk.hpp.


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