26#if defined (HAVE_CONFIG_H)
50 : m_expr (e), m_args (0), m_type (), m_arg_nm (), m_dyn_field (), m_word_list_cmd (false)
52 append (open_delim, lst, close_delim, t);
56 : m_expr (e), m_args (0), m_type (), m_arg_nm (), m_dyn_field (), m_word_list_cmd (false)
58 append (dot_tok, struct_elt_tok);
62 : m_expr (e), m_args (0), m_type (), m_arg_nm (), m_dyn_field (), m_word_list_cmd (false)
64 append (dot_tok, open_paren, df, close_paren);
71 m_args.push_back (lst);
73 m_dot_tok.push_back (
token ());
78 error (
"invalid use of empty argument (~) in index expression");
88 m_dot_tok.push_back (dot_tok);
89 m_arg_nm.push_back (struct_elt_tok.
text ());
100 m_dot_tok.push_back (dot_tok);
101 m_arg_nm.push_back (
"");
103 m_dyn_field.push_back (df);
112 while (! m_args.empty ())
114 auto p = m_args.begin ();
119 while (! m_dyn_field.empty ())
121 auto p = m_dyn_field.begin ();
123 m_dyn_field.erase (p);
133 return m_expr->
name ();
139 int n = m_args.size ();
165 error (
"unexpected: dynamic field is nullptr in call to tree_index_expression::end_pos - please report this bug");
169 token dot_tok = m_dot_tok.back ();
184 error (
"unexpected: index not '(', '{', or '.' in tree_index_expression::end_pos - please report this bug");
191 int n = m_args.size ();
217 error (
"unexpected: dynamic field is nullptr in call to tree_index_expression::trailing_comments - please report this bug");
221 token dot_tok = m_dot_tok.back ();
232 error (
"unexpected: index not '(', '{', or '.' in tree_index_expression::trailing_comments - please report this bug");
239 std::list<string_vector>::const_iterator p_arg_nm,
240 std::list<tree_expression *>::const_iterator p_dyn_field)
const
242 std::string fn = (*p_arg_nm)(0);
252 fn = t.
xstring_value (
"dynamic structure field names must be strings");
255 error (
"unexpected: DF is nullptr in call to tree_index_expression::get_struct_index - please report this bug");
264 std::list<octave_value_list> idx;
266 int n = m_args.size ();
268 auto p_args = m_args.begin ();
269 auto p_arg_nm = m_arg_nm.begin ();
270 auto p_dyn_field = m_dyn_field.begin ();
276 const std::string& index_type,
277 const std::list<octave_value_list>& index_list)
286 for (
int i = 0; i < n; i++)
295 idx.push_back (tidx);
304 idx.push_back (tidx);
313 idx.push_back (tidx);
318 error (
"unexpected: index not '(', '{', or '.' in tree_index_expression::lvalue - please report this bug");
321 if (idx.back ().empty ())
322 error (
"invalid empty index list");
339 new_idx_expr->m_expr = (m_expr ? m_expr->
dup (scope) :
nullptr);
341 std::list<tree_argument_list *> new_args;
344 new_args.push_back (elt ? elt->dup (scope) :
nullptr);
346 new_idx_expr->m_args = new_args;
348 new_idx_expr->m_type = m_type;
350 new_idx_expr->m_arg_nm = m_arg_nm;
352 std::list<tree_expression *> new_dyn_field;
355 new_dyn_field.push_back (elt ? elt->dup (scope) :
nullptr);
357 new_idx_expr->m_dyn_field = new_dyn_field;
442 auto p_args = m_args.begin ();
443 auto p_arg_nm = m_arg_nm.begin ();
444 auto p_dyn_field = m_dyn_field.begin ();
446 int n = m_args.size ();
450 int nargout_saved = nargout;
462 std::string nm =
id->name ();
466 bool maybe_binary_op =
false;
467 if ((*p_args) && (*p_args)->size () > 0)
471 std::string ops =
"+-*/\\.^|&";
474 && (ops.find (arg_list(0)[1]) != std::string::npos))
475 maybe_binary_op =
true;
480 advice =
"\nCheck whitespace around potential binary operator.";
482 error (
"variable \"%s\" used as function in command style expression%s",
483 nm.c_str (), advice.c_str ());
492 if (al && al->size () > 0)
494 unwind_action act ([&tw] (
const std::list<octave_lvalue> *lvl)
523 retval = fcn->
call (tw, nargout, first_args);
540 if (retval.
length () == 0 || retval(0).is_undefined ())
541 error (
"indexing undefined value");
543 base_expr_val = retval(0);
562 base_expr_val = m_expr->
evaluate (tw);
574 std::list<octave_value_list> idx_list;
583 const std::string& index_type,
584 const std::list<octave_value_list>& index_list)
595 bool indexing_object = (base_expr_val.
isobject ()
596 || base_expr_val.
isjava ()
602 for (
int i = beg; i < n; i++)
606 if (! indexing_object)
615 = base_expr_val.
subsref (m_type.substr (beg, i-beg),
621 base_expr_val = partial_expr_val;
626 retval = partial_expr_val;
633 || partial_expr_val.
isjava ()
648 indexing_object =
true;
666 idx_list.push_back (tmp);
674 idx_list.push_back (tmp);
682 idx_list.push_back (tmp);
687 error (
"unexpected: index not '(', '{', or '.' in tree_index_expression::evaluate_n - please report this bug");
697 nargout = nargout_saved;
702 if (! idx_list.empty ())
710 retval = base_expr_val.
subsref (m_type.substr (beg, n-beg),
737 if (idx_list.size () != 1)
738 error (
"unexpected extra index at end of expression");
740 if (m_type[beg] !=
'(')
741 error (
"invalid index type '%c' for function call",
744 final_args = idx_list.front ();
749 retval = fcn->
call (tw, nargout, final_args);
773 if (! idx_list.empty ())
776 error (
"unexpected extra index at end of expression");
778 if (m_type[beg] !=
'(')
779 error (
"invalid index type '%c' for function call",
782 final_args = idx_list.front ();
785 retval = fcn->
call (tw, nargout, final_args);
800OCTAVE_END_NAMESPACE(octave)
void increment_column(int val=1)
symbol_table & get_symbol_table()
virtual octave_value_list call(octave::tree_evaluator &tw, int nargout=0, const octave_value_list &args=octave_value_list())
void set_index(const std::string &t, const std::list< octave_value_list > &i)
octave_value value() const
void stash_name_tags(const string_vector &nm)
octave_idx_type length() const
bool is_undefined() const
octave_value subsref(const std::string &type, const std::list< octave_value_list > &idx)
octave_function * function_value(bool silent=false) const
bool is_classdef_meta() const
std::string xstring_value(const char *fmt,...) const
octave_value find_function(const std::string &name, const symbol_scope &search_scope=symbol_scope::invalid())
comment_list trailing_comments() const
string_vector get_arg_names() const
bool has_magic_tilde() const
tree_argument_list * mark_in_delims(const token &open_delim, const token &close_delim)
comment_list trailing_comments() const
void set_indexed_object(const octave_value &obj=octave_value())
interpreter & get_interpreter()
void final_index_error(index_exception &ie, const tree_expression *expr)
const std::list< octave_lvalue > * lvalue_list() const
octave_value_list convert_to_const_vector(tree_argument_list *arg_list)
const std::list< octave_value_list > & index_list() const
octave_value indexed_object() const
octave_value_list make_value_list(tree_argument_list *args, const string_vector &arg_nm)
bool is_variable(const std::string &name) const
const std::string & index_type() const
void set_lvalue_list(const std::list< octave_lvalue > *lst)
void append_index_list(char type, const octave_value_list &idx)
void set_index_list(const std::string &index_type, const std::list< octave_value_list > &index_list)
virtual octave_value evaluate(tree_evaluator &tw, int nargout=1)=0
virtual bool is_identifier() const
tree_expression * mark_in_delims(const token &open_delim, const token &close_delim)
virtual void copy_base(const tree_expression &e)
virtual std::string name() const
virtual tree_expression * dup(symbol_scope &scope) const =0
virtual octave_lvalue lvalue(tree_evaluator &)
octave_value_list evaluate_n(tree_evaluator &tw, int nargout=1)
comment_list trailing_comments() const
tree_index_expression * dup(symbol_scope &scope) const
std::list< string_vector > arg_names()
bool is_word_list_cmd() const
tree_index_expression(tree_expression *e, const token &open_delim, tree_argument_list *lst, const token &close_delim, char t)
std::string get_struct_index(tree_evaluator &tw, std::list< string_vector >::const_iterator p_arg_nm, std::list< tree_expression * >::const_iterator p_dyn_field) const
octave_lvalue lvalue(tree_evaluator &tw)
tree_index_expression * append(const token &open_delim, tree_argument_list *lst, const token &close_delim, char t='(')
virtual filepos end_pos() const =0
virtual comment_list trailing_comments() const =0
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
void error(const char *fmt,...)
void err_indexed_cs_list()