* f-exp.y (yyparse): Add code to support exponentiation expression.
authorWu Zhou <woodzltc@cn.ibm.com>
Wed, 6 Jul 2005 06:52:25 +0000 (06:52 +0000)
committerWu Zhou <woodzltc@cn.ibm.com>
Wed, 6 Jul 2005 06:52:25 +0000 (06:52 +0000)
(yylex): Add code to scan exponentiation operator.
* eval.c (evaluate_subexp_standard): Add support for BINOP_EXP.
* valarith.c (value_binop): Reset errno to 0 before calling pow
to do exponentiation operation.

gdb/ChangeLog
gdb/eval.c
gdb/f-exp.y
gdb/valarith.c

index aaa04204c595da226ea75f7c058a71c5ab9c0651..8fda4dd4f683a39698e959b16ee8b9e7b665f79d 100644 (file)
@@ -1,3 +1,11 @@
+2005-07-06  Wu Zhou  <woodzltc@cn.ibm.com>
+
+       * f-exp.y (yyparse): Add code to support exponentiation expression.
+       (yylex): Add code to scan exponentiation operator.
+       * eval.c (evaluate_subexp_standard): Add support for BINOP_EXP.
+       * valarith.c (value_binop): Reset errno to 0 before calling pow
+       to do exponentiation operation.
+
 2005-07-04  Mark Kettenis  <kettenis@gnu.org>
 
        * i386nbsd-nat.c (i386nbsd_supply_pcb): Cast to 'gdb_byte *' in
index 29622ce152ec43c441de4e997fdf51dd790af1c5..58e77d3348df9f2fcc56183ef38636cce9c5808e 100644 (file)
@@ -1510,6 +1510,7 @@ evaluate_subexp_standard (struct type *expect_type,
       else
        return value_sub (arg1, arg2);
 
+    case BINOP_EXP:
     case BINOP_MUL:
     case BINOP_DIV:
     case BINOP_REM:
index a066c5ac57f9306a221a96ba422dcd90cbf490a6..0deb81682c286271dd4419d2c3d9d8517baf39fe 100644 (file)
@@ -1,6 +1,6 @@
 /* YACC parser for Fortran expressions, for GDB.
-   Copyright 1986, 1989, 1990, 1991, 1993, 1994, 1995, 1996, 2000, 2001
-   Free Software Foundation, Inc.
+   Copyright 1986, 1989, 1990, 1991, 1993, 1994, 1995, 1996, 2000, 2001,
+   2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
    Contributed by Motorola.  Adapted from the C parser by Farooq Butt
    (fmbutt@engage.sps.mot.com).
@@ -217,6 +217,7 @@ static int parse_number (char *, int, int, YYSTYPE *);
 %left '@'
 %left '+' '-'
 %left '*' '/' '%'
+%right STARSTAR
 %right UNARY 
 %right '('
 
@@ -315,6 +316,10 @@ exp        :       exp '@' exp
                        { write_exp_elt_opcode (BINOP_REPEAT); }
        ;
 
+exp    :       exp STARSTAR exp
+                       { write_exp_elt_opcode (BINOP_EXP); }
+       ;
+
 exp    :       exp '*' exp
                        { write_exp_elt_opcode (BINOP_MUL); }
        ;
@@ -941,7 +946,7 @@ yylex ()
        }
     }
   
-  /* See if it is a special .foo. operator */
+  /* See if it is a special .foo. operator */
   
   for (i = 0; dot_ops[i].operator != NULL; i++)
     if (strncmp (tokstart, dot_ops[i].operator, strlen (dot_ops[i].operator)) == 0)
@@ -951,6 +956,15 @@ yylex ()
        return dot_ops[i].token;
       }
   
+  /* See if it is an exponentiation operator.  */
+
+  if (strncmp (tokstart, "**", 2) == 0)
+    {
+      lexptr += 2;
+      yylval.opcode = BINOP_EXP;
+      return STARSTAR;
+    }
+
   switch (c = *tokstart)
     {
     case 0:
index 54a7fc60df6f356d4666f3d429814ca03da46d13..ef03fb9839cfc0afd3d3041f67abb1930238715e 100644 (file)
@@ -791,11 +791,12 @@ value_binop (struct value *arg1, struct value *arg2, enum exp_opcode op)
          v = v1 / v2;
          break;
 
-        case BINOP_EXP:
-          v = pow (v1, v2);
-          if (errno)
-            error (_("Cannot perform exponentiation: %s"), safe_strerror (errno));
-          break;
+       case BINOP_EXP:
+         errno = 0;
+         v = pow (v1, v2);
+         if (errno)
+           error (_("Cannot perform exponentiation: %s"), safe_strerror (errno));
+         break;
 
        default:
          error (_("Integer-only operation on floating point number."));
@@ -929,11 +930,12 @@ value_binop (struct value *arg1, struct value *arg2, enum exp_opcode op)
              v = v1 / v2;
              break;
 
-            case BINOP_EXP:
-              v = pow (v1, v2);
-              if (errno)
-                error (_("Cannot perform exponentiation: %s"), safe_strerror (errno));
-              break;
+           case BINOP_EXP:
+             errno = 0;
+             v = pow (v1, v2);
+             if (errno)
+               error (_("Cannot perform exponentiation: %s"), safe_strerror (errno));
+             break;
 
            case BINOP_REM:
              v = v1 % v2;
@@ -1050,10 +1052,11 @@ value_binop (struct value *arg1, struct value *arg2, enum exp_opcode op)
                error (_("Division by zero"));
               break;
 
-            case BINOP_EXP:
-              v = pow (v1, v2);
-              if (errno)
-                error (_("Cannot perform exponentiation: %s"), safe_strerror (errno));
+           case BINOP_EXP:
+             errno = 0;
+             v = pow (v1, v2);
+             if (errno)
+               error (_("Cannot perform exponentiation: %s"), safe_strerror (errno));
              break;
 
            case BINOP_REM: