From 288644de2d6d22b92dbc22b4ff3d6a6369bb239a Mon Sep 17 00:00:00 2001 From: Arash Partow Date: Wed, 24 Aug 2016 03:30:08 +1000 Subject: [PATCH] C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html --- exprtk.hpp | 79 +++++++++++++++++++++++++++++++++++++----------------- readme.txt | 12 +++++++-- 2 files changed, 64 insertions(+), 27 deletions(-) diff --git a/exprtk.hpp b/exprtk.hpp index 94daddd..fc4b057 100644 --- a/exprtk.hpp +++ b/exprtk.hpp @@ -6470,7 +6470,7 @@ namespace exprtk inline T value() const { - return *(vector_base_ + static_cast(details::numeric::to_int64(index_->value()))); + return *(vector_base_ + static_cast(details::numeric::to_int64(index_->value()))); } inline T& ref() @@ -10505,17 +10505,6 @@ namespace exprtk ts.data = &var->ref(); ts.type = type_store_t::e_scalar; } - else if (is_vector_elem_node(arg_list_[i])) - { - vector_elem_node_ptr_t var = vector_elem_node_ptr_t(0); - - if (0 == (var = dynamic_cast(arg_list_[i]))) - return false; - - ts.size = 1; - ts.data = reinterpret_cast(&var->ref()); - ts.type = type_store_t::e_scalar; - } else { ts.size = 1; @@ -22276,6 +22265,7 @@ namespace exprtk scoped_vec_delete svd(*this,vec_initilizer_list); bool single_value_initialiser = false; + bool vec_to_vec_initialiser = false; if (!token_is(token_t::e_rsqrbracket)) { @@ -22327,12 +22317,44 @@ namespace exprtk } else if (!token_is(token_t::e_lcrlbracket)) { - set_error( - make_error(parser_error::e_syntax, - current_token(), - "ERR140 - Expected '{' as part of vector initialiser list")); + expression_node_ptr initialiser = error_node(); - return error_node(); + // Is this a vector to vector assignment and initialisation? + if (token_t::e_symbol == current_token().type) + { + // Is it a locally defined vector? + scope_element& se = sem_.get_active_element(current_token().value); + + if (scope_element::e_vector == se.type) + { + if ((initialiser = parse_expression())) + vec_initilizer_list.push_back(initialiser); + else + return error_node(); + } + // Are we dealing with a user defined vector? + else if (symtab_store_.is_vector(current_token().value)) + { + lodge_symbol(current_token().value,e_st_vector); + + if ((initialiser = parse_expression())) + vec_initilizer_list.push_back(initialiser); + else + return error_node(); + } + } + + if (0 == initialiser) + { + set_error( + make_error(parser_error::e_syntax, + current_token(), + "ERR140 - Expected '{' as part of vector initialiser list")); + + return error_node(); + } + else + vec_to_vec_initialiser = true; } else if (!token_is(token_t::e_rcrlbracket)) { @@ -22464,13 +22486,20 @@ namespace exprtk lodge_symbol(vec_name,e_st_local_vector); - expression_node_ptr result = - node_allocator_ - .allocate >( - (*vec_holder)[0], - vec_size, - vec_initilizer_list, - single_value_initialiser); + expression_node_ptr result = error_node(); + + if (vec_to_vec_initialiser) + result = expression_generator_( + details::e_assign, + node_allocator_.allocate(vec_holder), + vec_initilizer_list[0]); + else + result = node_allocator_ + .allocate >( + (*vec_holder)[0], + vec_size, + vec_initilizer_list, + single_value_initialiser); svd.delete_ptr = (0 == result); @@ -23386,7 +23415,7 @@ namespace exprtk } } - // Are we dealing with a vector element? + // Are we dealing with a vector? if (symtab_store_.is_vector(symbol)) { lodge_symbol(symbol,e_st_vector); diff --git a/readme.txt b/readme.txt index 4e3ba87..d5a9627 100644 --- a/readme.txt +++ b/readme.txt @@ -1166,10 +1166,18 @@ zero. The following are examples of vector definitions: (e) Initialise the first three (all) values var x[3] := { 1, 2, 3 }; - (f) Error as there are too many initialisers + (f) Initialise vector from a vector + var x[4] := { 1, 2, 3, 4 }; + var y[3] := x; + + (g) Initialise vector from a smaller vector + var x[3] := { 1, 2, 3 }; + var y[5] := x; // 1, 2, 3, ??, ?? + + (h) Error as there are too many initialisers var x[3] := { 1, 2, 3, 4 }; - (g) Error as a vector of size zero is not allowed. + (i) Error as a vector of size zero is not allowed. var x[0];