changeset 3929:cc8ae49d6e79

[project @ 2002-05-04 02:47:14 by jwe]
author jwe
date Sat, 04 May 2002 02:47:14 +0000
parents e8627dc4bdf2
children 61d4427c016e
files src/ChangeLog src/oct-lvalue.cc src/oct-lvalue.h src/parse.y src/pt-idx.cc src/pt-idx.h
diffstat 6 files changed, 63 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- 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  <jwe@bevo.che.wisc.edu>
 
+	* 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
--- 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
--- 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 <string>
 
 #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;
--- 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;
 }
--- 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)
 {
--- 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!