# HG changeset patch # User jwe # Date 1020480434 0 # Node ID cc8ae49d6e799b7845e0bb7a29a1e2f067b8b732 # Parent e8627dc4bdf2685f870c3abb06dfc41c23ed1168 [project @ 2002-05-04 02:47:14 by jwe] diff -r e8627dc4bdf2 -r cc8ae49d6e79 src/ChangeLog --- a/src/ChangeLog Fri May 03 19:56:02 2002 +0000 +++ b/src/ChangeLog Sat May 04 02:47:14 2002 +0000 @@ -1,5 +1,14 @@ 2002-05-03 John W. Eaton + * parse.y (ABORT_PARSE): Maybe restore symbol table context too. + + * pt-idx.h (tree_index_expression::type): New enum. + (tree_index_expression::etype): New data member. + * pt-idx.h (tree_index_expression::tree_index_expression): + New arg, t, to set type of index. + * parse.y (make_index_expression): Likewise. + Change all callers. + * ov-base.cc (cell_conv): New conversion function. (install_base_type_conversions): Install it. Install conversion for indexed assignment of octave_cells to diff -r e8627dc4bdf2 -r cc8ae49d6e79 src/oct-lvalue.cc --- a/src/oct-lvalue.cc Fri May 03 19:56:02 2002 +0000 +++ b/src/oct-lvalue.cc Sat May 04 02:47:14 2002 +0000 @@ -57,11 +57,13 @@ } void -octave_lvalue::set_index (const octave_value_list& i) +octave_lvalue::set_index (const octave_value_list& i, + tree_index_expression::type t) { if (! index_set) { idx = i; + itype = t; index_set = true; } else diff -r e8627dc4bdf2 -r cc8ae49d6e79 src/oct-lvalue.h --- a/src/oct-lvalue.h Fri May 03 19:56:02 2002 +0000 +++ b/src/oct-lvalue.h Sat May 04 02:47:14 2002 +0000 @@ -29,6 +29,7 @@ #include #include "oct-obj.h" +#include "pt-idx.h" #include "symtab.h" // XXX FIXME XXX -- eliminate the following kluge? @@ -50,7 +51,7 @@ : val (v), idx (), chg_fcn (f), struct_elt_name (nm), index_set (false) { } octave_lvalue (const octave_lvalue& vr) - : val (vr.val), idx (vr.idx), chg_fcn (vr.chg_fcn), + : val (vr.val), idx (vr.idx), itype (vr.itype), chg_fcn (vr.chg_fcn), struct_elt_name (vr.struct_elt_name), index_set (vr.index_set) { } octave_lvalue& operator = (const octave_lvalue& vr) @@ -59,6 +60,7 @@ { val = vr.val; idx = vr.idx; + itype = vr.itype; chg_fcn = vr.chg_fcn; struct_elt_name = vr.struct_elt_name; index_set = vr.index_set; @@ -85,7 +87,9 @@ return val->struct_elt_ref (nm); } - void set_index (const octave_value_list& i); + void set_index (const octave_value_list& i, + tree_index_expression::type t + = tree_index_expression::unknown); void clear_index (void) { idx = octave_value_list (); } @@ -108,6 +112,8 @@ octave_value_list idx; + tree_index_expression::type itype; + symbol_record::change_function chg_fcn; std::string struct_elt_name; diff -r e8627dc4bdf2 -r cc8ae49d6e79 src/parse.y --- a/src/parse.y Fri May 03 19:56:02 2002 +0000 +++ b/src/parse.y Sat May 04 02:47:14 2002 +0000 @@ -280,7 +280,8 @@ // Make an index expression. static tree_index_expression * -make_index_expression (tree_expression *expr, tree_argument_list *args); +make_index_expression (tree_expression *expr, tree_argument_list *args, + tree_index_expression::type); // Make an indirect reference expression. static tree_indirect_ref * @@ -311,6 +312,11 @@ { \ global_command = 0; \ yyerrok; \ + if (symtab_context) \ + { \ + curr_sym_tab = symtab_context; \ + symtab_context = 0; \ + } \ if (interactive || forced_interactive) \ YYACCEPT; \ else \ @@ -691,11 +697,25 @@ postfix_expr : primary_expr { $$ = $1; } | postfix_expr '(' ')' - { $$ = make_index_expression ($1, 0); } + { + $$ = make_index_expression ($1, 0, + tree_index_expression::paren); + } | postfix_expr '(' arg_list ')' - { $$ = make_index_expression ($1, $3); } + { + $$ = make_index_expression ($1, $3, + tree_index_expression::paren); + } + | postfix_expr '{' '}' + { + $$ = make_index_expression ($1, 0, + tree_index_expression::brace); + } | postfix_expr '{' arg_list '}' - { $$ = make_index_expression ($1, $3); } + { + $$ = make_index_expression ($1, $3, + tree_index_expression::brace); + } | postfix_expr PLUS_PLUS { $$ = make_postfix_op (PLUS_PLUS, $1, $2); } | postfix_expr MINUS_MINUS @@ -832,7 +852,10 @@ ; word_list_cmd : identifier word_list - { $$ = make_index_expression ($1, $2); } + { + $$ = make_index_expression ($1, $2, + tree_index_expression::paren); + } ; word_list : TEXT @@ -2567,7 +2590,8 @@ // Make an index expression. static tree_index_expression * -make_index_expression (tree_expression *expr, tree_argument_list *args) +make_index_expression (tree_expression *expr, tree_argument_list *args, + tree_index_expression::type t) { tree_index_expression *retval = 0; @@ -2576,7 +2600,7 @@ expr->mark_postfix_indexed (); - retval = new tree_index_expression (expr, args, l, c); + retval = new tree_index_expression (expr, args, l, c, t); return retval; } diff -r e8627dc4bdf2 -r cc8ae49d6e79 src/pt-idx.cc --- a/src/pt-idx.cc Fri May 03 19:56:02 2002 +0000 +++ b/src/pt-idx.cc Sat May 04 02:47:14 2002 +0000 @@ -40,9 +40,9 @@ tree_index_expression::tree_index_expression (tree_expression *e, tree_argument_list *lst, - int l, int c) + int l, int c, type t) : tree_expression (l, c), expr (e), list (lst), - arg_nm (lst ? lst->get_arg_names () : string_vector ()) { } + itype (t), arg_nm (lst ? lst->get_arg_names () : string_vector ()) { } tree_index_expression::~tree_index_expression (void) { diff -r e8627dc4bdf2 -r cc8ae49d6e79 src/pt-idx.h --- a/src/pt-idx.h Fri May 03 19:56:02 2002 +0000 +++ b/src/pt-idx.h Sat May 04 02:47:14 2002 +0000 @@ -46,8 +46,15 @@ { public: + enum type + { + unknown, + paren, + brace + }; + tree_index_expression (tree_expression *e = 0, tree_argument_list *lst = 0, - int l = -1, int c = -1); + int l = -1, int c = -1, type t = paren); ~tree_index_expression (void); @@ -84,6 +91,8 @@ tree_argument_list *list; + type itype; + string_vector arg_nm; // No copying!