* ch-exp.y (decode_integer_value, match_character_literal,
[deliverable/binutils-gdb.git] / gdb / ch-exp.y
index 6788b551d4bccca185b4ea72f88d37b807f818de..ded20b5ca93735be3d84685ab0bbba2616b4b563 100644 (file)
@@ -1,5 +1,5 @@
 /* YACC grammar for Chill expressions, for GDB.
-   Copyright (C) 1992 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
@@ -83,8 +87,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define        yypgo   chill_pgo
 #define        yyact   chill_act
 #define        yyexca  chill_exca
-#define yyerrflag chill_errflag
-#define yynerrs        chill_nerrs
+#define        yyerrflag chill_errflag
+#define        yynerrs chill_nerrs
 #define        yyps    chill_ps
 #define        yypv    chill_pv
 #define        yys     chill_s
@@ -95,8 +99,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define        yy_yyv  chill_yyv
 #define        yyval   chill_val
 #define        yylloc  chill_lloc
-#define yyreds chill_reds              /* With YYDEBUG defined */
-#define yytoks chill_toks              /* With YYDEBUG defined */
+#define        yyreds  chill_reds              /* With YYDEBUG defined */
+#define        yytoks  chill_toks              /* With YYDEBUG defined */
 
 #ifndef YYDEBUG
 #define        YYDEBUG 0               /* Default to no yydebug support */
@@ -162,7 +166,6 @@ yyerror PARAMS ((char *));
 %token <voidval> FIXME_20
 %token <voidval> FIXME_21
 %token <voidval> FIXME_22
-%token <voidval> FIXME_23
 %token <voidval> FIXME_24
 %token <voidval> FIXME_25
 %token <voidval> FIXME_26
@@ -228,8 +231,8 @@ yyerror PARAMS ((char *));
 %token <voidval>       SUCC
 %token <voidval>       ABS
 %token <voidval>       CARD
-%token <voidval>       MAX
-%token <voidval>       MIN
+%token <voidval>       MAX_TOKEN
+%token <voidval>       MIN_TOKEN
 %token <voidval>       SIZE
 %token <voidval>       UPPER
 %token <voidval>       LOWER
@@ -292,8 +295,7 @@ yyerror PARAMS ((char *));
 %type <voidval>                lower_element
 %type <voidval>                upper_element
 %type <voidval>                first_element
-%type <voidval>                structure_primitive_value
-%type <voidval>                mode_argument
+%type <tval>           mode_argument
 %type <voidval>                upper_lower_argument
 %type <voidval>                length_argument
 %type <voidval>                array_mode_name
@@ -311,7 +313,7 @@ yyerror PARAMS ((char *));
 
 /* Z.200, 5.3.1 */
 
-start  :       value
+start  :       value { }
        |       mode_name
                        { write_exp_elt_opcode(OP_TYPE);
                          write_exp_elt_type($1.type);
@@ -337,9 +339,6 @@ undefined_value     :       FIXME_01
 /* Z.200, 4.2.1 */
 
 location       :       access_name
-                       {
-                         $$ = 0;       /* FIXME */
-                       }
                |       primitive_value POINTER
                        {
                          write_exp_elt_opcode (UNOP_IND);
@@ -351,6 +350,7 @@ location    :       access_name
 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);
                        }
@@ -482,6 +482,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);
                        }
@@ -774,7 +775,7 @@ operand_2   :       operand_3
                        }
                |       operand_2 IN operand_3
                        {
-                         $$ = 0;       /* FIXME */
+                         write_exp_elt_opcode (BINOP_IN);
                        }
                ;
 
@@ -837,7 +838,7 @@ operand_5   :       operand_6
                        {
                          write_exp_elt_opcode (UNOP_LOGICAL_NOT);
                        }
-               |       parenthesised_expression CHARACTER_STRING_LITERAL
+               |       parenthesised_expression literal
 /* We require the string operand to be a literal, to avoid some
    nasty parsing ambiguities. */
                        {
@@ -894,22 +895,21 @@ chill_value_built_in_routine_call :
                        {
                          $$ = 0;       /* FIXME */
                        }
-               |       MAX '(' expression ')'
-                       {
-                         $$ = 0;       /* FIXME */
-                       }
-               |       MIN '(' expression ')'
+               |       MAX_TOKEN '(' expression ')'
                        {
                          $$ = 0;       /* FIXME */
                        }
-               |       SIZE '(' location ')'
+               |       MIN_TOKEN '(' expression ')'
                        {
                          $$ = 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 */
@@ -926,7 +926,7 @@ chill_value_built_in_routine_call :
 
 mode_argument :                mode_name
                        {
-                         $$ = 0;       /* FIXME */
+                         $$ = $1.type;
                        }
                |       array_mode_name '(' expression ')'
                        {
@@ -987,7 +987,6 @@ slice_size          :       FIXME_19 { $$ = 0; }
 lower_element          :       FIXME_20 { $$ = 0; }
 upper_element          :       FIXME_21 { $$ = 0; }
 first_element          :       FIXME_22 { $$ = 0; }
-structure_primitive_value:     FIXME_23 { $$ = 0; }
 boolean_expression     :       FIXME_26 { $$ = 0; }
 case_selector_list     :       FIXME_27 { $$ = 0; }
 subexpression          :       FIXME_28 { $$ = 0; }
@@ -1044,15 +1043,20 @@ match_simple_name_string ()
 {
   char *tokptr = lexptr;
 
-  if (isalpha (*tokptr))
+  if (isalpha (*tokptr) || *tokptr == '_')
     {
+      char *result;
       do {
        tokptr++;
-      } while (isalpha (*tokptr) || isdigit (*tokptr) || (*tokptr == '_'));
+      } while (isalnum (*tokptr) || (*tokptr == '_'));
       yylval.sval.ptr = lexptr;
       yylval.sval.length = tokptr - lexptr;
       lexptr = tokptr;
-      return (copy_name (yylval.sval));
+      result = copy_name (yylval.sval);
+      for (tokptr = result; *tokptr; tokptr++)
+       if (isupper (*tokptr))
+         *tokptr = tolower(*tokptr);
+      return result;
     }
   return (NULL);
 }
@@ -1075,7 +1079,9 @@ decode_integer_value (base, tokptrptr, ivalptr)
 
   while (*tokptr != '\0')
     {
-      temp = tolower (*tokptr);
+      temp = *tokptr;
+      if (isupper (temp))
+        temp = tolower (temp);
       tokptr++;
       switch (temp)
        {
@@ -1213,7 +1219,6 @@ match_float_literal ()
   char *tokptr = lexptr;
   char *buf;
   char *copy;
-  char ch;
   double dval;
   extern double strtod ();
   
@@ -1332,7 +1337,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
@@ -1360,7 +1365,6 @@ match_string_literal ()
       tempbuf[tempbufindex++] = *tokptr;
     }
   if (*tokptr == '\0'                                  /* no terminator */
-      || tempbufindex == 0                             /* no string */
       || (tempbufindex == 1 && *tokptr == '\''))       /* char literal */
     {
       return (0);
@@ -1403,7 +1407,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
@@ -1534,7 +1538,9 @@ match_bitstring_literal ()
   
   while (*tokptr != '\0' && *tokptr != '\'')
     {
-      digit = tolower (*tokptr);
+      digit = *tokptr;
+      if (isupper (digit))
+        digit = tolower (digit);
       tokptr++;
       switch (digit)
        {
@@ -1654,7 +1660,7 @@ match_dollar_tokens ()
              && !isalnum (tokptr[namelength]))
            {
              yylval.lval = regno;
-             lexptr += namelength + 1;
+             lexptr += namelength;
              return (GDB_REGNAME);
            }
        }
@@ -1727,38 +1733,28 @@ struct token
   int token;
 };
 
-static const struct token tokentab6[] =
+static const struct token idtokentab[] =
 {
-    { "LENGTH", LENGTH }
-};
-
-static const struct token tokentab5[] =
-{
-    { "LOWER", LOWER },
-    { "UPPER", UPPER },
-    { "ANDIF", ANDIF }
-};
-
-static const struct token tokentab4[] =
-{
-    { "PRED", PRED },
-    { "SUCC", SUCC },
-    { "CARD", CARD },
-    { "SIZE", SIZE },
-    { "ORIF", ORIF }
-};
-
-static const struct token tokentab3[] =
-{
-    { "NUM", NUM },
-    { "ABS", ABS },
-    { "MAX", MAX },
-    { "MIN", MIN },
-    { "MOD", MOD },
-    { "REM", REM },
-    { "NOT", NOT },
-    { "XOR", LOGXOR },
-    { "AND", LOGAND }
+    { "length", LENGTH },
+    { "lower", LOWER },
+    { "upper", UPPER },
+    { "andif", ANDIF },
+    { "pred", PRED },
+    { "succ", SUCC },
+    { "card", CARD },
+    { "size", SIZE },
+    { "orif", ORIF },
+    { "num", NUM },
+    { "abs", ABS },
+    { "max", MAX_TOKEN },
+    { "min", MIN_TOKEN },
+    { "mod", MOD },
+    { "rem", REM },
+    { "not", NOT },
+    { "xor", LOGXOR },
+    { "and", LOGAND },
+    { "in", IN },
+    { "or", LOGIOR }
 };
 
 static const struct token tokentab2[] =
@@ -1768,9 +1764,7 @@ static const struct token tokentab2[] =
     { "->", POINTER },
     { "/=", NOTEQUAL },
     { "<=", LEQ },
-    { ">=", GTR },
-    { "IN", IN },
-    { "OR", LOGIOR }
+    { ">=", GTR }
 };
 
 /* Read one token, getting characters through lexptr.  */
@@ -1815,7 +1809,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. */
@@ -1849,42 +1843,6 @@ yylex ()
            }
          break;
       }
-    /* See if it is a special token of length 6.  */
-    for (i = 0; i < sizeof (tokentab6) / sizeof (tokentab6[0]); i++)
-       {
-           if (STREQN (lexptr, tokentab6[i].operator, 6))
-               {
-                   lexptr += 6;
-                   return (tokentab6[i].token);
-               }
-       }
-    /* See if it is a special token of length 5.  */
-    for (i = 0; i < sizeof (tokentab5) / sizeof (tokentab5[0]); i++)
-       {
-           if (STREQN (lexptr, tokentab5[i].operator, 5))
-               {
-                   lexptr += 5;
-                   return (tokentab5[i].token);
-               }
-       }
-    /* See if it is a special token of length 4.  */
-    for (i = 0; i < sizeof (tokentab4) / sizeof (tokentab4[0]); i++)
-       {
-           if (STREQN (lexptr, tokentab4[i].operator, 4))
-               {
-                   lexptr += 4;
-                   return (tokentab4[i].token);
-               }
-       }
-    /* See if it is a special token of length 3.  */
-    for (i = 0; i < sizeof (tokentab3) / sizeof (tokentab3[0]); i++)
-       {
-           if (STREQN (lexptr, tokentab3[i].operator, 3))
-               {
-                   lexptr += 3;
-                   return (tokentab3[i].token);
-               }
-       }
     /* See if it is a special token of length 2.  */
     for (i = 0; i < sizeof (tokentab2) / sizeof (tokentab2[0]); i++)
        {
@@ -1906,19 +1864,6 @@ yylex ()
            case '>':
                return (*lexptr++);
        }
-    /* Look for other special tokens. */
-    if (STREQN (lexptr, "TRUE", 4)) /* FIXME:  What about lowercase? */
-       {
-           yylval.ulval = 1;
-           lexptr += 4;
-           return (BOOLEAN_LITERAL);
-       }
-    if (STREQN (lexptr, "FALSE", 5)) /* FIXME:  What about lowercase? */
-       {
-           yylval.ulval = 0;
-           lexptr += 5;
-           return (BOOLEAN_LITERAL);
-       }
     /* Look for a float literal before looking for an integer literal, so
        we match as much of the input stream as possible. */
     token = match_float_literal ();
@@ -1944,8 +1889,30 @@ yylex ()
        we can't classify what sort of name it is. */
 
     simplename = match_simple_name_string ();
+
     if (simplename != NULL)
       {
+       /* See if it is a reserved identifier. */
+       for (i = 0; i < sizeof (idtokentab) / sizeof (idtokentab[0]); i++)
+           {
+               if (STREQ (simplename, idtokentab[i].operator))
+                   {
+                       return (idtokentab[i].token);
+                   }
+           }
+
+       /* Look for other special tokens. */
+       if (STREQ (simplename, "true"))
+           {
+               yylval.ulval = 1;
+               return (BOOLEAN_LITERAL);
+           }
+       if (STREQ (simplename, "false"))
+           {
+               yylval.ulval = 0;
+               return (BOOLEAN_LITERAL);
+           }
+
        sym = lookup_symbol (simplename, expression_context_block,
                             VAR_NAMESPACE, (int *) NULL,
                             (struct symtab **) NULL);
@@ -1967,8 +1934,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))
                  {
@@ -2021,7 +1991,7 @@ void
 yyerror (msg)
      char *msg;        /* unused */
 {
-  printf ("Parsing:  %s\n", lexptr);
+  printf_unfiltered ("Parsing:  %s\n", lexptr);
   if (yychar < 256)
     {
       error ("Invalid syntax in expression near character '%c'.", yychar);
This page took 0.030213 seconds and 4 git commands to generate.