* corelow.c, exec.c, inftarg.c, m3-nat.c, op50-rom.c, procfs.c,
[deliverable/binutils-gdb.git] / gdb / ch-exp.y
index 76eb91382f47ec506a6e2120c34dce3abc79b3a6..b7a0b5ec8c1ff82f354061a83446a96029ee224f 100644 (file)
@@ -1,5 +1,5 @@
 /* YACC grammar for Chill expressions, for GDB.
-   Copyright 1992, 1993 Free Software Foundation, Inc.
+   Copyright 1992, 1993, 1994 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -54,12 +54,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 %{
 
 #include "defs.h"
+#include <string.h>
 #include <ctype.h>
 #include "expression.h"
 #include "language.h"
 #include "value.h"
 #include "parser-defs.h"
 #include "ch-lang.h"
+#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 */
 
 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
    as well as gratuitiously global symbol names, so we can have multiple
@@ -74,16 +78,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define        yyerror chill_error
 #define        yylval  chill_lval
 #define        yychar  chill_char
-#define        yycheck chill_yycheck
 #define        yydebug chill_debug
-#define        yydefred chill_yydefred
-#define        yydgoto chill_yydgoto
-#define        yygindex chill_yygindex
-#define        yylen   chill_yylen
-#define        yylhs   chill_yylhs
-#define        yyrindex chill_yyrindex
-#define        yysccsid chill_yysccsid
-#define        yysindex chill_yysindex
 #define        yypact  chill_pact
 #define        yyr1    chill_r1
 #define        yyr2    chill_r2
@@ -97,15 +92,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define        yyps    chill_ps
 #define        yypv    chill_pv
 #define        yys     chill_s
-#define        yyss    chill_yyss
-#define        yyssp   chill_yyssp
 #define        yy_yys  chill_yys
 #define        yystate chill_state
-#define        yytable chill_yytable
 #define        yytmp   chill_tmp
 #define        yyv     chill_v
-#define        yyvs    chill_vs
-#define        yyvss   chill_vss
 #define        yy_yyv  chill_yyv
 #define        yyval   chill_val
 #define        yylloc  chill_lloc
@@ -257,18 +247,14 @@ yyerror PARAMS ((char *));
 %token <ivar>          GDB_VARIABLE    /* Convenience variable */
 %token <voidval>       GDB_ASSIGNMENT  /* Assign value to somewhere */
 
-%type <voidval>                location
 %type <voidval>                access_name
 %type <voidval>                primitive_value
-%type <voidval>                location_contents
 %type <voidval>                value_name
 %type <voidval>                literal
 %type <voidval>                tuple
 %type <voidval>                value_string_element
 %type <voidval>                value_string_slice
-%type <voidval>                value_array_element
 %type <voidval>                value_array_slice
-%type <voidval>                value_structure_field
 %type <voidval>                expression_conversion
 %type <voidval>                value_procedure_call
 %type <voidval>                value_built_in_routine_call
@@ -300,12 +286,11 @@ yyerror PARAMS ((char *));
 %type <voidval>                left_element
 %type <voidval>                right_element
 %type <voidval>                slice_size
-%type <voidval>                array_primitive_value
 %type <voidval>                expression_list
 %type <voidval>                lower_element
 %type <voidval>                upper_element
 %type <voidval>                first_element
-%type <voidval>                mode_argument
+%type <tval>           mode_argument
 %type <voidval>                upper_lower_argument
 %type <voidval>                length_argument
 %type <voidval>                array_mode_name
@@ -346,20 +331,12 @@ undefined_value   :       FIXME_01
                        }
                ;
 
-/* Z.200, 4.2.1 */
-
-location       :       access_name
-               |       primitive_value POINTER
-                       {
-                         write_exp_elt_opcode (UNOP_IND);
-                       }
-               ;
-
 /* Z.200, 4.2.2 */
 
 access_name    :       LOCATION_NAME
                        {
                          write_exp_elt_opcode (OP_VAR_VALUE);
+                         write_exp_elt_block (NULL);
                          write_exp_elt_sym ($1.sym);
                          write_exp_elt_opcode (OP_VAR_VALUE);
                        }
@@ -400,9 +377,26 @@ expression_list    :       expression
 
 /* Z.200, 5.2.1 */
 
-primitive_value        :       location_contents
+primitive_value        :
+                       access_name
+               |       primitive_value '('
+                               /* This is to save the value of arglist_len
+                                  being accumulated for each dimension. */
+                               { start_arglist (); }
+                       expression_list ')'
                        {
-                         $$ = 0;       /* FIXME */
+                         write_exp_elt_opcode (MULTI_SUBSCRIPT);
+                         write_exp_elt_longcst ((LONGEST) end_arglist ());
+                         write_exp_elt_opcode (MULTI_SUBSCRIPT);
+                       }
+               |       primitive_value FIELD_NAME
+                       { write_exp_elt_opcode (STRUCTOP_STRUCT);
+                         write_exp_string ($2);
+                         write_exp_elt_opcode (STRUCTOP_STRUCT);
+                       }
+               |       primitive_value POINTER
+                       {
+                         write_exp_elt_opcode (UNOP_IND);
                        }
                 |      value_name
                        {
@@ -424,18 +418,10 @@ primitive_value   :       location_contents
                        {
                          $$ = 0;       /* FIXME */
                        }
-                |      value_array_element
-                       {
-                         $$ = 0;       /* FIXME */
-                       }
                 |      value_array_slice
                        {
                          $$ = 0;       /* FIXME */
                        }
-                |      value_structure_field
-                       {
-                         $$ = 0;       /* FIXME */
-                       }
                 |      expression_conversion
                        {
                          $$ = 0;       /* FIXME */
@@ -462,14 +448,6 @@ primitive_value    :       location_contents
                        }
                ;
 
-/* Z.200, 5.2.2 */
-
-location_contents:     location
-                       {
-                         $$ = 0;       /* FIXME */
-                       }
-               ;
-
 /* Z.200, 5.2.3 */
 
 value_name     :       synonym_name
@@ -491,6 +469,7 @@ value_name  :       synonym_name
                |       GENERAL_PROCEDURE_NAME
                        {
                          write_exp_elt_opcode (OP_VAR_VALUE);
+                         write_exp_elt_block (NULL);
                          write_exp_elt_sym ($1.sym);
                          write_exp_elt_opcode (OP_VAR_VALUE);
                        }
@@ -576,41 +555,18 @@ value_string_slice:       string_primitive_value '(' left_element ':' right_element ')
                        }
                ;
 
-/* Z.200, 5.2.8 */
-
-value_array_element:   array_primitive_value '('
-                               /* This is to save the value of arglist_len
-                                  being accumulated for each dimension. */
-                               { start_arglist (); }
-                       expression_list ')'
-                       {
-                         write_exp_elt_opcode (MULTI_SUBSCRIPT);
-                         write_exp_elt_longcst ((LONGEST) end_arglist ());
-                         write_exp_elt_opcode (MULTI_SUBSCRIPT);
-                       }
-               ;
-
 /* Z.200, 5.2.9 */
 
-value_array_slice:     array_primitive_value '(' lower_element ':' upper_element ')'
+value_array_slice:     primitive_value '(' lower_element ':' upper_element ')'
                        {
                          $$ = 0;       /* FIXME */
                        }
-               |       array_primitive_value '(' first_element UP slice_size ')'
+               |       primitive_value '(' first_element UP slice_size ')'
                        {
                          $$ = 0;       /* FIXME */
                        }
                ;
 
-/* Z.200, 5.2.10 */
-
-value_structure_field: primitive_value FIELD_NAME
-                       { write_exp_elt_opcode (STRUCTOP_STRUCT);
-                         write_exp_string ($2);
-                         write_exp_elt_opcode (STRUCTOP_STRUCT);
-                       }
-               ;
-
 /* Z.200, 5.2.11 */
 
 expression_conversion: mode_name parenthesised_expression
@@ -783,7 +739,7 @@ operand_2   :       operand_3
                        }
                |       operand_2 IN operand_3
                        {
-                         $$ = 0;       /* FIXME */
+                         write_exp_elt_opcode (BINOP_IN);
                        }
                ;
 
@@ -856,7 +812,7 @@ operand_5   :       operand_6
 
 /* Z.200, 5.3.9 */
 
-operand_6      :       POINTER location
+operand_6      :       POINTER primitive_value
                        {
                          write_exp_elt_opcode (UNOP_ADDR);
                        }
@@ -874,7 +830,7 @@ operand_6   :       POINTER location
 /* Z.200, 6.2 */
 
 single_assignment_action :
-                       location GDB_ASSIGNMENT value
+                       primitive_value GDB_ASSIGNMENT value
                        {
                          write_exp_elt_opcode (BINOP_ASSIGN);
                        }
@@ -911,14 +867,13 @@ chill_value_built_in_routine_call :
                        {
                          $$ = 0;       /* FIXME */
                        }
-               |       SIZE '(' location ')'
-                       {
-                         $$ = 0;       /* FIXME */
-                       }
+               |       SIZE '(' expression ')'
+                       { write_exp_elt_opcode (UNOP_SIZEOF); }
                |       SIZE '(' mode_argument ')'
-                       {
-                         $$ = 0;       /* FIXME */
-                       }
+                       { write_exp_elt_opcode (OP_LONG);
+                         write_exp_elt_type (builtin_type_int);
+                         write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3));
+                         write_exp_elt_opcode (OP_LONG); }
                |       UPPER '(' upper_lower_argument ')'
                        {
                          $$ = 0;       /* FIXME */
@@ -935,7 +890,7 @@ chill_value_built_in_routine_call :
 
 mode_argument :                mode_name
                        {
-                         $$ = 0;       /* FIXME */
+                         $$ = $1.type;
                        }
                |       array_mode_name '(' expression ')'
                        {
@@ -970,15 +925,6 @@ length_argument :  expression
                        }
                ;
 
-/* Z.200, 12.4.3 */
-
-array_primitive_value :        primitive_value
-                       {
-                         $$ = 0;
-                       }
-               ;
-
-
 /* Things which still need productions... */
 
 array_mode_name                :       FIXME_08 { $$ = 0; }
@@ -1052,7 +998,7 @@ match_simple_name_string ()
 {
   char *tokptr = lexptr;
 
-  if (isalpha (*tokptr))
+  if (isalpha (*tokptr) || *tokptr == '_')
     {
       char *result;
       do {
@@ -1062,9 +1008,6 @@ match_simple_name_string ()
       yylval.sval.length = tokptr - lexptr;
       lexptr = tokptr;
       result = copy_name (yylval.sval);
-      for (tokptr = result; *tokptr; tokptr++)
-       if (isupper (*tokptr))
-         *tokptr = tolower(*tokptr);
       return result;
     }
   return (NULL);
@@ -1088,7 +1031,9 @@ decode_integer_value (base, tokptrptr, ivalptr)
 
   while (*tokptr != '\0')
     {
-      temp = tolower (*tokptr);
+      temp = *tokptr;
+      if (isupper (temp))
+        temp = tolower (temp);
       tokptr++;
       switch (temp)
        {
@@ -1226,7 +1171,6 @@ match_float_literal ()
   char *tokptr = lexptr;
   char *buf;
   char *copy;
-  char ch;
   double dval;
   extern double strtod ();
   
@@ -1345,7 +1289,7 @@ match_float_literal ()
   return (0);
 }
 
-/* Recognize a string literal.  A string literal is a nonzero sequence
+/* Recognize a string literal.  A string literal is a sequence
    of characters enclosed in matching single or double quotes, except that
    a single character inside single quotes is a character literal, which
    we reject as a string literal.  To embed the terminator character inside
@@ -1373,7 +1317,6 @@ match_string_literal ()
       tempbuf[tempbufindex++] = *tokptr;
     }
   if (*tokptr == '\0'                                  /* no terminator */
-      || tempbufindex == 0                             /* no string */
       || (tempbufindex == 1 && *tokptr == '\''))       /* char literal */
     {
       return (0);
@@ -1416,7 +1359,7 @@ match_character_literal ()
   char *tokptr = lexptr;
   int ival = 0;
   
-  if ((tolower (*tokptr) == 'c') && (*(tokptr + 1) == '\''))
+  if ((*tokptr == 'c' || *tokptr == 'C') && (*(tokptr + 1) == '\''))
     {
       /* We have a GNU chill extension form, so skip the leading "C'",
         decode the hex value, and then ensure that we have a trailing
@@ -1547,7 +1490,9 @@ match_bitstring_literal ()
   
   while (*tokptr != '\0' && *tokptr != '\'')
     {
-      digit = tolower (*tokptr);
+      digit = *tokptr;
+      if (isupper (digit))
+        digit = tolower (digit);
       tokptr++;
       switch (digit)
        {
@@ -1667,7 +1612,7 @@ match_dollar_tokens ()
              && !isalnum (tokptr[namelength]))
            {
              yylval.lval = regno;
-             lexptr += namelength + 1;
+             lexptr += namelength;
              return (GDB_REGNAME);
            }
        }
@@ -1783,7 +1728,7 @@ yylex ()
 {
     unsigned int i;
     int token;
-    char *simplename;
+    char *inputname;
     struct symbol *sym;
 
     /* Skip over any leading whitespace. */
@@ -1816,7 +1761,7 @@ yylex ()
       {
        case '\'':
        case '\"':
-         /* First try to match a string literal, which is any nonzero
+         /* First try to match a string literal, which is any
             sequence of characters enclosed in matching single or double
             quotes, except that a single character inside single quotes
             is a character literal, so we have to catch that case also. */
@@ -1895,10 +1840,16 @@ yylex ()
        the token from lexptr, so we can't back out if we later find that
        we can't classify what sort of name it is. */
 
-    simplename = match_simple_name_string ();
+    inputname = match_simple_name_string ();
 
-    if (simplename != NULL)
+    if (inputname != NULL)
       {
+       char *simplename = (char*) alloca (strlen (inputname));
+
+       char *dptr = simplename, *sptr = inputname;
+       for (; *sptr; sptr++)
+         *dptr++ = isupper (*sptr) ? tolower(*sptr) : *sptr;
+
        /* See if it is a reserved identifier. */
        for (i = 0; i < sizeof (idtokentab) / sizeof (idtokentab[0]); i++)
            {
@@ -1920,9 +1871,15 @@ yylex ()
                return (BOOLEAN_LITERAL);
            }
 
-       sym = lookup_symbol (simplename, expression_context_block,
+       sym = lookup_symbol (inputname, expression_context_block,
                             VAR_NAMESPACE, (int *) NULL,
                             (struct symtab **) NULL);
+       if (sym == NULL && strcmp (inputname, simplename) != 0)
+         {
+           sym = lookup_symbol (simplename, expression_context_block,
+                                VAR_NAMESPACE, (int *) NULL,
+                                (struct symtab **) NULL);
+         }
        if (sym != NULL)
          {
            yylval.ssym.stoken.ptr = NULL;
@@ -1941,8 +1898,11 @@ yylex ()
              case LOC_ARG:
              case LOC_REF_ARG:
              case LOC_REGPARM:
+             case LOC_REGPARM_ADDR:
              case LOC_LOCAL:
              case LOC_LOCAL_ARG:
+             case LOC_BASEREG:
+             case LOC_BASEREG_ARG:
                if (innermost_block == NULL
                    || contained_in (block_found, innermost_block))
                  {
@@ -1960,7 +1920,7 @@ yylex ()
              case LOC_UNDEF:
              case LOC_CONST_BYTES:
              case LOC_OPTIMIZED_OUT:
-               error ("Symbol \"%s\" names no location.", simplename);
+               error ("Symbol \"%s\" names no location.", inputname);
                break;
              }
          }
@@ -1970,7 +1930,7 @@ yylex ()
          }
        else
          {
-           error ("No symbol \"%s\" in current context.", simplename);
+           error ("No symbol \"%s\" in current context.", inputname);
          }
       }
 
@@ -1982,8 +1942,8 @@ yylex ()
        case '.':                       /* Not float for example. */
          lexptr++;
          while (isspace (*lexptr)) lexptr++;
-         simplename = match_simple_name_string ();
-         if (!simplename)
+         inputname = match_simple_name_string ();
+         if (!inputname)
            return '.';
          return FIELD_NAME;
       }
@@ -1993,15 +1953,7 @@ yylex ()
 
 void
 yyerror (msg)
-     char *msg;        /* unused */
+     char *msg;
 {
-  printf ("Parsing:  %s\n", lexptr);
-  if (yychar < 256)
-    {
-      error ("Invalid syntax in expression near character '%c'.", yychar);
-    }
-  else
-    {
-      error ("Invalid syntax in expression");
-    }
+  error ("A %s in expression, near `%s'.", (msg ? msg : "error"), lexptr);
 }
This page took 0.031773 seconds and 4 git commands to generate.