changeset 4018:a8621d87fbf5

[project @ 2002-08-05 03:17:25 by jwe]
author jwe
date Mon, 05 Aug 2002 03:17:25 +0000
parents 0eb247b9cc9b
children c6d7ae9fcdb9
files src/ChangeLog src/lex.l src/ov.cc src/ov.h src/parse.y
diffstat 5 files changed, 47 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Sat Aug 03 04:07:15 2002 +0000
+++ b/src/ChangeLog	Mon Aug 05 03:17:25 2002 +0000
@@ -1,3 +1,15 @@
+2002-08-04  John W. Eaton  <jwe@bevo.che.wisc.edu>
+
+	* ov.h (octave_value::assign_op): New enum values, op_pow_eq and
+	op_el_pow_eq.
+	* ov.cc (octave_value::assign_op_as_string): Handle them here.
+	(ocatave_value::op_eq_to_binary_op): And here.
+	* parse.y (POW_EQ, EPOW_EQ): New tokens.
+	(assign_expr): Handle them here too.
+	(make_assign_op): And here.
+
+	* lex.l: Recognize {POW}= and {EPOW}=.
+
 2002-08-02  John W. Eaton  <jwe@bevo.che.wisc.edu>
 
 	* ov-base-scalar.h (octave_base_scalar::all): New int arg.
--- a/src/lex.l	Sat Aug 03 04:07:15 2002 +0000
+++ b/src/lex.l	Mon Aug 05 03:17:25 2002 +0000
@@ -707,6 +707,8 @@
 ".*="	{ BIN_OP_RETURN (EMUL_EQ, false); }
 "./="	{ BIN_OP_RETURN (EDIV_EQ, false); }
 ".\\="	{ BIN_OP_RETURN (ELEFTDIV_EQ, false); }
+{POW}=  { BIN_OP_RETURN (POW_EQ, false); }
+{EPOW}= { BIN_OP_RETURN (EPOW_EQ, false); }
 "&="	{ BIN_OP_RETURN (AND_EQ, false); }
 "|="	{ BIN_OP_RETURN (OR_EQ, false); }
 "<<="	{ BIN_OP_RETURN (LSHIFT_EQ, false); }
--- a/src/ov.cc	Sat Aug 03 04:07:15 2002 +0000
+++ b/src/ov.cc	Mon Aug 05 03:17:25 2002 +0000
@@ -293,6 +293,10 @@
       retval = "\\=";
       break;
 
+    case op_pow_eq:
+      retval = "^=";
+      break;
+
     case op_lshift_eq:
       retval = "<<=";
       break;
@@ -313,6 +317,10 @@
       retval = ".\\=";
       break;
 
+    case op_el_pow_eq:
+      retval = ".^=";
+      break;
+
     case op_el_and_eq:
       retval = "&=";
       break;
@@ -1454,6 +1462,10 @@
       binop = op_ldiv;
       break;
 
+    case op_pow_eq:
+      binop = op_pow;
+      break;
+
     case op_lshift_eq:
       binop = op_lshift;
       break;
@@ -1474,6 +1486,10 @@
       binop = op_el_ldiv;
       break;
 
+    case op_el_pow_eq:
+      binop = op_el_pow;
+      break;
+
     case op_el_and_eq:
       binop = op_el_and;
       break;
--- a/src/ov.h	Sat Aug 03 04:07:15 2002 +0000
+++ b/src/ov.h	Mon Aug 05 03:17:25 2002 +0000
@@ -132,11 +132,13 @@
     op_mul_eq,
     op_div_eq,
     op_ldiv_eq,
+    op_pow_eq,
     op_lshift_eq,
     op_rshift_eq,
     op_el_mul_eq,
     op_el_div_eq,
     op_el_ldiv_eq,
+    op_el_pow_eq,
     op_el_and_eq,
     op_el_or_eq,
     num_assign_ops,
--- a/src/parse.y	Sat Aug 03 04:07:15 2002 +0000
+++ b/src/parse.y	Mon Aug 05 03:17:25 2002 +0000
@@ -373,8 +373,8 @@
 
 // Tokens with line and column information.
 %token <tok_val> '=' ':' '-' '+' '*' '/'
-%token <tok_val> ADD_EQ SUB_EQ MUL_EQ DIV_EQ LEFTDIV_EQ 
-%token <tok_val> EMUL_EQ EDIV_EQ ELEFTDIV_EQ AND_EQ OR_EQ
+%token <tok_val> ADD_EQ SUB_EQ MUL_EQ DIV_EQ LEFTDIV_EQ POW_EQ
+%token <tok_val> EMUL_EQ EDIV_EQ ELEFTDIV_EQ EPOW_EQ AND_EQ OR_EQ
 %token <tok_val> LSHIFT_EQ RSHIFT_EQ LSHIFT RSHIFT
 %token <tok_val> EXPR_AND_AND EXPR_OR_OR
 %token <tok_val> EXPR_AND EXPR_OR EXPR_NOT
@@ -444,7 +444,7 @@
 
 // Precedence and associativity.
 %left ';' ',' '\n'
-%right '=' ADD_EQ SUB_EQ MUL_EQ DIV_EQ LEFTDIV_EQ EMUL_EQ EDIV_EQ ELEFTDIV_EQ OR_EQ AND_EQ LSHIFT_EQ RSHIFT_EQ
+%right '=' ADD_EQ SUB_EQ MUL_EQ DIV_EQ LEFTDIV_EQ POW_EQ EMUL_EQ EDIV_EQ ELEFTDIV_EQ EPOW_EQ OR_EQ AND_EQ LSHIFT_EQ RSHIFT_EQ
 %left EXPR_AND_AND EXPR_OR_OR
 %left EXPR_AND EXPR_OR
 %left EXPR_LT EXPR_LE EXPR_EQ EXPR_NE EXPR_GE EXPR_GT
@@ -823,6 +823,8 @@
 		  { $$ = make_assign_op (DIV_EQ, $1, $2, $3); }
 		| assign_lhs LEFTDIV_EQ expression
 		  { $$ = make_assign_op (LEFTDIV_EQ, $1, $2, $3); }
+		| assign_lhs POW_EQ expression
+		  { $$ = make_assign_op (POW_EQ, $1, $2, $3); }
 		| assign_lhs LSHIFT_EQ expression
 		  { $$ = make_assign_op (LSHIFT_EQ, $1, $2, $3); }
 		| assign_lhs RSHIFT_EQ expression
@@ -833,6 +835,8 @@
 		  { $$ = make_assign_op (EDIV_EQ, $1, $2, $3); }
 		| assign_lhs ELEFTDIV_EQ expression
 		  { $$ = make_assign_op (ELEFTDIV_EQ, $1, $2, $3); }
+		| assign_lhs EPOW_EQ expression
+		  { $$ = make_assign_op (EPOW_EQ, $1, $2, $3); }
 		| assign_lhs AND_EQ expression
 		  { $$ = make_assign_op (AND_EQ, $1, $2, $3); }
 		| assign_lhs OR_EQ expression
@@ -2384,6 +2388,10 @@
       t = octave_value::op_ldiv_eq;
       break;
 
+    case POW_EQ:
+      t = octave_value::op_pow_eq;
+      break;
+
     case LSHIFT_EQ:
       t = octave_value::op_lshift_eq;
       break;
@@ -2404,6 +2412,10 @@
       t = octave_value::op_el_ldiv_eq;
       break;
 
+    case EPOW_EQ:
+      t = octave_value::op_el_pow_eq;
+      break;
+
     case AND_EQ:
       t = octave_value::op_el_and_eq;
       break;