*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / f-exp.y
index 857b742b531cddf1d9a43f355c06cafd238e7c63..7cbfd5ac8f2b4eba41010a82f87c86051b1c1a19 100644 (file)
@@ -1,6 +1,7 @@
 /* YACC parser for Fortran expressions, for GDB.
-   Copyright 1986, 1989, 1990, 1991, 1993, 1994
-             Free Software Foundation, Inc.
+   Copyright 1986, 1989, 1990, 1991, 1993, 1994, 1995, 1996, 2000, 2001
+   Free Software Foundation, Inc.
+
    Contributed by Motorola.  Adapted from the C parser by Farooq Butt
    (fmbutt@engage.sps.mot.com).
 
@@ -18,7 +19,7 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /* This was blantantly ripped off the C expression parser, please 
    be aware of that as you look at its basic structure -FMB */ 
@@ -43,7 +44,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 %{
 
 #include "defs.h"
-#include <string.h>
+#include "gdb_string.h"
 #include "expression.h"
 #include "value.h"
 #include "parser-defs.h"
@@ -52,6 +53,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "bfd.h" /* Required by objfiles.h.  */
 #include "symfile.h" /* Required by objfiles.h.  */
 #include "objfiles.h" /* For have_full_symbols and have_partial_symbols */
+#include <ctype.h>
 
 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
    as well as gratuitiously global symbol names, so we can have multiple
@@ -103,11 +105,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define        YYDEBUG 1               /* Default to no yydebug support */
 #endif
 
-int yyparse PARAMS ((void));
+int yyparse (void);
+
+static int yylex (void);
 
-static int yylex PARAMS ((void));
+void yyerror (char *);
 
-void yyerror PARAMS ((char *));
+static void growbuf_by_size (int);
+
+static int match_string_literal (void);
 
 %}
 
@@ -122,7 +128,7 @@ void yyerror PARAMS ((char *));
       LONGEST val;
       struct type *type;
     } typed_val;
-    double dval;
+    DOUBLEST dval;
     struct symbol *sym;
     struct type *tval;
     struct stoken sval;
@@ -139,7 +145,7 @@ void yyerror PARAMS ((char *));
 
 %{
 /* YYSTYPE gets defined by %union */
-static int parse_number PARAMS ((char *, int, int, YYSTYPE *));
+static int parse_number (char *, int, int, YYSTYPE *);
 %}
 
 %type <voidval> exp  type_exp start variable 
@@ -186,9 +192,9 @@ static int parse_number PARAMS ((char *, int, int, YYSTYPE *));
 %token LOGICAL_KEYWORD REAL_KEYWORD REAL_S8_KEYWORD REAL_S16_KEYWORD 
 %token COMPLEX_S8_KEYWORD COMPLEX_S16_KEYWORD COMPLEX_S32_KEYWORD 
 %token BOOL_AND BOOL_OR BOOL_NOT   
-%token <lval> LAST REGNAME CHARACTER 
+%token <lval> CHARACTER 
 
-%token <ivar> VARIABLE
+%token <voidval> VARIABLE
 
 %token <opcode> ASSIGN_MODIFY
 
@@ -412,27 +418,13 @@ exp       :       FLOAT
 exp    :       variable
        ;
 
-exp    :       LAST
-                       { write_exp_elt_opcode (OP_LAST);
-                         write_exp_elt_longcst ((LONGEST) $1);
-                         write_exp_elt_opcode (OP_LAST); }
-       ;
-
-exp    :       REGNAME
-                       { write_exp_elt_opcode (OP_REGISTER);
-                         write_exp_elt_longcst ((LONGEST) $1);
-                         write_exp_elt_opcode (OP_REGISTER); }
-       ;
-
 exp    :       VARIABLE
-                       { write_exp_elt_opcode (OP_INTERNALVAR);
-                         write_exp_elt_intern ($1);
-                         write_exp_elt_opcode (OP_INTERNALVAR); }
        ;
 
 exp    :       SIZEOF '(' type ')'     %prec UNARY
                        { write_exp_elt_opcode (OP_LONG);
                          write_exp_elt_type (builtin_type_f_integer);
+                         CHECK_TYPEDEF ($3);
                          write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3));
                          write_exp_elt_opcode (OP_LONG); }
        ;
@@ -648,12 +640,11 @@ parse_number (p, len, parsed_float, putithere)
 {
   register LONGEST n = 0;
   register LONGEST prevn = 0;
-  register int i;
   register int c;
   register int base = input_radix;
   int unsigned_p = 0;
   int long_p = 0;
-  unsigned LONGEST high_bit;
+  ULONGEST high_bit;
   struct type *signed_type;
   struct type *unsigned_type;
 
@@ -663,7 +654,7 @@ parse_number (p, len, parsed_float, putithere)
       /* [dD] is not understood as an exponent by atof, change it to 'e'.  */
       char *tmp, *tmp2;
 
-      tmp = strsave (p);
+      tmp = xstrdup (p);
       for (tmp2 = tmp; *tmp2; ++tmp2)
        if (*tmp2 == 'd' || *tmp2 == 'D')
          *tmp2 = 'e';
@@ -706,26 +697,26 @@ parse_number (p, len, parsed_float, putithere)
   while (len-- > 0)
     {
       c = *p++;
-      if (c >= 'A' && c <= 'Z')
-       c += 'a' - 'A';
-      if (c != 'l' && c != 'u')
-       n *= base;
-      if (c >= '0' && c <= '9')
-       n += i = c - '0';
+      if (isupper (c))
+       c = tolower (c);
+      if (len == 0 && c == 'l')
+       long_p = 1;
+      else if (len == 0 && c == 'u')
+       unsigned_p = 1;
       else
        {
-         if (base > 10 && c >= 'a' && c <= 'f')
-           n += i = c - 'a' + 10;
-         else if (len == 0 && c == 'l') 
-            long_p = 1;
-         else if (len == 0 && c == 'u')
-           unsigned_p = 1;
+         int i;
+         if (c >= '0' && c <= '9')
+           i = c - '0';
+         else if (c >= 'a' && c <= 'f')
+           i = c - 'a' + 10;
          else
            return ERROR;       /* Char not a digit */
+         if (i >= base)
+           return ERROR;               /* Invalid digit in this base */
+         n *= base;
+         n += i;
        }
-      if (i >= base)
-       return ERROR;           /* Invalid digit in this base */
-      
       /* Portably test for overflow (only works for nonzero values, so make
         a second check for zero).  */
       if ((prevn >= n) && n != 0)
@@ -755,13 +746,13 @@ parse_number (p, len, parsed_float, putithere)
        && ((n >> 2) >> (TARGET_INT_BIT-2)))   /* Avoid shift warning */
       || long_p)
     {
-      high_bit = ((unsigned LONGEST)1) << (TARGET_LONG_BIT-1);
+      high_bit = ((ULONGEST)1) << (TARGET_LONG_BIT-1);
       unsigned_type = builtin_type_unsigned_long;
       signed_type = builtin_type_long;
     }
   else 
     {
-      high_bit = ((unsigned LONGEST)1) << (TARGET_INT_BIT-1);
+      high_bit = ((ULONGEST)1) << (TARGET_INT_BIT-1);
       unsigned_type = builtin_type_unsigned_int;
       signed_type = builtin_type_int;
     }    
@@ -1110,60 +1101,6 @@ yylex ()
   
   lexptr += namelen;
   
-  /* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1)
-     and $$digits (equivalent to $<-digits> if you could type that).
-     Make token type LAST, and put the number (the digits) in yylval.  */
-  
-  if (*tokstart == '$')
-    {
-      register int negate = 0;
-
-      c = 1;
-      /* Double dollar means negate the number and add -1 as well.
-        Thus $$ alone means -1.  */
-      if (namelen >= 2 && tokstart[1] == '$')
-       {
-         negate = 1;
-         c = 2;
-       }
-      if (c == namelen)
-       {
-         /* Just dollars (one or two) */
-         yylval.lval = - negate;
-         return LAST;
-       }
-      /* Is the rest of the token digits?  */
-      for (; c < namelen; c++)
-       if (!(tokstart[c] >= '0' && tokstart[c] <= '9'))
-         break;
-      if (c == namelen)
-       {
-         yylval.lval = atoi (tokstart + 1 + negate);
-         if (negate)
-           yylval.lval = - yylval.lval;
-         return LAST;
-       }
-    }
-  
-  /* Handle tokens that refer to machine registers:
-     $ followed by a register name.  */
-  
-  if (*tokstart == '$') {
-    for (c = 0; c < NUM_REGS; c++)
-      if (namelen - 1 == strlen (reg_names[c])
-         && STREQN (tokstart + 1, reg_names[c], namelen - 1))
-       {
-         yylval.lval = c;
-         return REGNAME;
-       }
-    for (c = 0; c < num_std_regs; c++)
-      if (namelen - 1 == strlen (std_regs[c].name)
-         && STREQN (tokstart + 1, std_regs[c].name, namelen - 1))
-       {
-         yylval.lval = std_regs[c].regnum;
-         return REGNAME;
-       }
-  }
   /* Catch specific keywords.  */
   
   for (i = 0; f77_keywords[i].operator != NULL; i++)
@@ -1178,11 +1115,9 @@ yylex ()
   yylval.sval.ptr = tokstart;
   yylval.sval.length = namelen;
   
-  /* Any other names starting in $ are debugger internal variables.  */
-  
   if (*tokstart == '$')
     {
-      yylval.ivar =  lookup_internalvar (copy_name (yylval.sval) + 1);
+      write_dollar_variable (yylval.sval);
       return VARIABLE;
     }
   
This page took 0.026714 seconds and 4 git commands to generate.