summaryrefslogtreecommitdiff
path: root/gdb/f-exp.y
diff options
context:
space:
mode:
authorWu Zhou <woodzltc@cn.ibm.com>2005-07-06 06:52:25 +0000
committerWu Zhou <woodzltc@cn.ibm.com>2005-07-06 06:52:25 +0000
commit2c961d6cc67e2be4920cb748c69f73be98650173 (patch)
treeb5663f01a4d54ce582c970d11ffd0538f01e4371 /gdb/f-exp.y
parent480f62fa7bbf7146d1c11d4459206ef96de032b7 (diff)
downloadgdb-2c961d6cc67e2be4920cb748c69f73be98650173.tar.gz
* 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.
Diffstat (limited to 'gdb/f-exp.y')
-rw-r--r--gdb/f-exp.y20
1 files changed, 17 insertions, 3 deletions
diff --git a/gdb/f-exp.y b/gdb/f-exp.y
index a066c5ac57f..0deb81682c2 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: