diff options
author | Wu Zhou <woodzltc@cn.ibm.com> | 2005-07-06 06:52:25 +0000 |
---|---|---|
committer | Wu Zhou <woodzltc@cn.ibm.com> | 2005-07-06 06:52:25 +0000 |
commit | bd49c137fee8212c7e64ce62cc07d398b1278b14 (patch) | |
tree | 1e41f9c36b171df9b614b3e443aaee1fbbe020ab | |
parent | a0c5fbcf0e1c6fdb3672d3bfc071b1a57a7b27bf (diff) | |
download | gdb-bd49c137fee8212c7e64ce62cc07d398b1278b14.zip gdb-bd49c137fee8212c7e64ce62cc07d398b1278b14.tar.gz gdb-bd49c137fee8212c7e64ce62cc07d398b1278b14.tar.bz2 |
* 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.
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/eval.c | 1 | ||||
-rw-r--r-- | gdb/f-exp.y | 20 | ||||
-rw-r--r-- | gdb/valarith.c | 31 |
4 files changed, 43 insertions, 17 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index aaa0420..8fda4dd 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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 @@ -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: diff --git a/gdb/f-exp.y b/gdb/f-exp.y index a066c5a..0deb816 100644 --- a/gdb/f-exp.y +++ b/gdb/f-exp.y @@ -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: diff --git a/gdb/valarith.c b/gdb/valarith.c index 54a7fc6..ef03fb9 100644 --- a/gdb/valarith.c +++ b/gdb/valarith.c @@ -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: |