From 5dd1589284f45c9585b9304e3ee446bf91663e14 Mon Sep 17 00:00:00 2001 From: woodzltc Date: Wed, 6 Jul 2005 06:52:22 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 8 ++++++++ gdb/eval.c | 1 + gdb/f-exp.y | 20 +++++++++++++++++--- gdb/valarith.c | 31 +++++++++++++++++-------------- 4 files changed, 43 insertions(+), 17 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index aaa04204c5..8fda4dd4f6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2005-07-06 Wu Zhou + + * 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 * i386nbsd-nat.c (i386nbsd_supply_pcb): Cast to 'gdb_byte *' in diff --git a/gdb/eval.c b/gdb/eval.c index 29622ce152..58e77d3348 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -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 a066c5ac57..0deb81682c 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 54a7fc60df..ef03fb9839 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: -- 2.11.0