2003-07-16 Andrew Cagney <cagney@redhat.com>
[deliverable/binutils-gdb.git] / gdb / jv-exp.y
index d17c4f3a8b94995b90f61d45d480458d1408192c..71206205fe12ec988b3e1664a4ea61a0f29eb1fe 100644 (file)
@@ -1,5 +1,5 @@
 /* YACC parser for Java expressions, for GDB.
-   Copyright (C) 1997, 1998, 1999.
+   Copyright 1997, 1998, 1999, 2000
    Free Software Foundation, Inc.
 
 This file is part of GDB.
@@ -48,6 +48,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 "block.h"
 
 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
    as well as gratuitiously global symbol names, so we can have multiple
@@ -85,6 +86,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #define        yylloc  java_lloc
 #define yyreds java_reds               /* With YYDEBUG defined */
 #define yytoks java_toks               /* With YYDEBUG defined */
+#define yyname java_name               /* With YYDEBUG defined */
+#define yyrule java_rule               /* With YYDEBUG defined */
 #define yylhs  java_yylhs
 #define yylen  java_yylen
 #define yydefred java_yydefred
@@ -96,24 +99,23 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #define yycheck         java_yycheck
 
 #ifndef YYDEBUG
-#define        YYDEBUG 0               /* Default to no yydebug support */
+#define        YYDEBUG 1               /* Default to yydebug support */
 #endif
 
-int
-yyparse PARAMS ((void));
+#define YYFPRINTF parser_fprintf
 
-static int
-yylex PARAMS ((void));
+int yyparse (void);
 
-void
-yyerror PARAMS ((char *));
+static int yylex (void);
 
-static struct type * java_type_from_name PARAMS ((struct stoken));
-static void push_expression_name PARAMS ((struct stoken));
-static void push_fieldnames PARAMS ((struct stoken));
+void yyerror (char *);
 
-static struct expression *copy_exp PARAMS ((struct expression *, int));
-static void insert_exp PARAMS ((int, struct expression *));
+static struct type *java_type_from_name (struct stoken);
+static void push_expression_name (struct stoken);
+static void push_fieldnames (struct stoken);
+
+static struct expression *copy_exp (struct expression *, int);
+static void insert_exp (int, struct expression *);
 
 %}
 
@@ -145,8 +147,7 @@ static void insert_exp PARAMS ((int, struct expression *));
 
 %{
 /* YYSTYPE gets defined by %union */
-static int
-parse_number PARAMS ((char *, int, int, YYSTYPE *));
+static int parse_number (char *, int, int, YYSTYPE *);
 %}
 
 %type <lval> rcurly Dims Dims_opt
@@ -179,7 +180,7 @@ parse_number PARAMS ((char *, int, int, YYSTYPE *));
 
 %token <opcode> ASSIGN_MODIFY
 
-%token THIS SUPER NEW
+%token SUPER NEW
 
 %left ','
 %right '=' ASSIGN_MODIFY
@@ -365,9 +366,6 @@ Primary:
 
 PrimaryNoNewArray:
        Literal
-|      THIS
-               { write_exp_elt_opcode (OP_THIS);
-                 write_exp_elt_opcode (OP_THIS); }
 |      '(' Expression ')'
 |      ClassInstanceCreationExpression
 |      FieldAccess
@@ -392,7 +390,8 @@ rcurly:
 
 ClassInstanceCreationExpression:
        NEW ClassType '(' ArgumentList_opt ')'
-               { error ("FIXME - ClassInstanceCreationExpression"); }
+               { internal_error (__FILE__, __LINE__,
+                                 _("FIXME - ClassInstanceCreationExpression")); }
 ;
 
 ArgumentList:
@@ -410,9 +409,11 @@ ArgumentList_opt:
 
 ArrayCreationExpression:
        NEW PrimitiveType DimExprs Dims_opt
-               { error ("FIXME - ArrayCreatiionExpression"); }
+               { internal_error (__FILE__, __LINE__,
+                                 _("FIXME - ArrayCreationExpression")); }
 |      NEW ClassOrInterfaceType DimExprs Dims_opt
-               { error ("FIXME - ArrayCreatiionExpression"); }
+               { internal_error (__FILE__, __LINE__,
+                                 _("FIXME - ArrayCreationExpression")); }
 ;
 
 DimExprs:
@@ -447,11 +448,11 @@ FieldAccess:
 
 MethodInvocation:
        Name '(' ArgumentList_opt ')'
-               { error ("method invocation not implemented"); }
+               { error (_("Method invocation not implemented")); }
 |      Primary '.' SimpleName '(' ArgumentList_opt ')'
-               { error ("method invocation not implemented"); }
+               { error (_("Method invocation not implemented")); }
 |      SUPER '.' SimpleName '(' ArgumentList_opt ')'
-               { error ("method invocation not implemented"); }
+               { error (_("Method invocation not implemented")); }
 ;
 
 ArrayAccess:
@@ -541,7 +542,7 @@ CastExpression:
                  int i;
                  int base = expout_ptr - last_exp_size - 3;
                  if (base < 0 || expout->elts[base+2].opcode != OP_TYPE)
-                   error ("invalid cast expression");
+                   error (_("Invalid cast expression"));
                  type = expout->elts[base+1].type;
                  /* Remove the 'Expression' and slide the
                     UnaryExpressionNotPlusMinus down to replace it. */
@@ -768,13 +769,13 @@ parse_number (p, len, parsed_float, putithere)
       }
 
   c = p[len-1];
+  /* A paranoid calculation of (1<<64)-1. */
   limit = (ULONGEST)0xffffffff;
+  limit = ((limit << 16) << 16) | limit;
   if (c == 'l' || c == 'L')
     {
       type = java_long_type;
       len--;
-      /* A paranoid calculation of (1<<64)-1. */
-      limit = ((limit << 16) << 16) | limit;
     }
   else
     {
@@ -797,13 +798,22 @@ parse_number (p, len, parsed_float, putithere)
        return ERROR;
       if (n > limit_div_base
          || (n *= base) > limit - c)
-       error ("Numeric constant too large.");
+       error (_("Numeric constant too large"));
       n += c;
        }
 
-   putithere->typed_val_int.val = n;
-   putithere->typed_val_int.type = type;
-   return INTEGER_LITERAL;
+  /* If the type is bigger than a 32-bit signed integer can be, implicitly
+     promote to long.  Java does not do this, so mark it as builtin_type_uint64
+     rather than java_long_type.  0x80000000 will become -0x80000000 instead
+     of 0x80000000L, because we don't know the sign at this point.
+  */
+  if (type == java_int_type && n > (ULONGEST)0x80000000)
+    type = builtin_type_uint64;
+
+  putithere->typed_val_int.val = n;
+  putithere->typed_val_int.type = type;
+
+  return INTEGER_LITERAL;
 }
 
 struct token
@@ -857,6 +867,8 @@ yylex ()
   
  retry:
 
+  prev_lexptr = lexptr;
+
   tokstart = lexptr;
   /* See if it is a special token of length 3.  */
   for (i = 0; i < sizeof tokentab3 / sizeof tokentab3[0]; i++)
@@ -896,10 +908,10 @@ yylex ()
       if (c == '\\')
        c = parse_escape (&lexptr);
       else if (c == '\'')
-       error ("Empty character constant.");
+       error (_("Empty character constant"));
 
       yylval.typed_val_int.val = c;
-      yylval.typed_val_int.type = builtin_type_char;
+      yylval.typed_val_int.type = java_char_type;
 
       c = *lexptr++;
       if (c != '\'')
@@ -909,12 +921,12 @@ yylex ()
            {
              lexptr = tokstart + namelen;
              if (lexptr[-1] != '\'')
-               error ("Unmatched single quote.");
+               error (_("Unmatched single quote"));
              namelen -= 2;
              tokstart++;
              goto tryname;
            }
-         error ("Invalid character constant.");
+         error (_("Invalid character constant"));
        }
       return INTEGER_LITERAL;
 
@@ -999,7 +1011,7 @@ yylex ()
 
            memcpy (err_copy, tokstart, p - tokstart);
            err_copy[p - tokstart] = 0;
-           error ("Invalid number \"%s\".", err_copy);
+           error (_("Invalid number \"%s\""), err_copy);
          }
        lexptr = p;
        return toktype;
@@ -1071,7 +1083,7 @@ yylex ()
       } while ((*tokptr != '"') && (*tokptr != '\0'));
       if (*tokptr++ != '"')
        {
-         error ("Unterminated string in expression.");
+         error (_("Unterminated string in expression"));
        }
       tempbuf[tempbufindex] = '\0';    /* See note above */
       yylval.sval.ptr = tempbuf;
@@ -1083,7 +1095,7 @@ yylex ()
   if (!(c == '_' || c == '$'
        || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
     /* We must have come across a bad character (e.g. ';').  */
-    error ("Invalid character '%c' in expression.", c);
+    error (_("Invalid character '%c' in expression"), c);
 
   /* It's a name.  See how long it is.  */
   namelen = 0;
@@ -1153,17 +1165,6 @@ yylex ()
          yylval.lval = 1;
          return BOOLEAN_LITERAL;
        }
-      if (current_language->la_language == language_cplus
-         && STREQN (tokstart, "this", 4))
-       {
-         static const char this_name[] =
-                                { CPLUS_MARKER, 't', 'h', 'i', 's', '\0' };
-
-         if (lookup_symbol (this_name, expression_context_block,
-                            VAR_NAMESPACE, (int *) NULL,
-                            (struct symtab **) NULL))
-           return THIS;
-       }
       break;
     case 3:
       if (STREQN (tokstart, "int", 3))
@@ -1202,7 +1203,13 @@ void
 yyerror (msg)
      char *msg;
 {
-  error ("A %s in expression, near `%s'.", (msg ? msg : "error"), lexptr);
+  if (prev_lexptr)
+    lexptr = prev_lexptr;
+
+  if (msg)
+    error (_("%s: near `%s'"), msg, lexptr);
+  else
+    error (_("error in expression, near `%s'"), lexptr);
 }
 
 static struct type *
@@ -1213,7 +1220,7 @@ java_type_from_name (name)
   char *tmp = copy_name (name);
   struct type *typ = java_lookup_class (tmp);
   if (typ == NULL || TYPE_CODE (typ) != TYPE_CODE_STRUCT)
-    error ("No class named %s.", tmp);
+    error (_("No class named `%s'"), tmp);
   return typ;
 }
 
@@ -1221,14 +1228,12 @@ java_type_from_name (name)
    Otherwise, return 0. */
 
 static int
-push_variable (name)
-     struct stoken name;
+push_variable (struct stoken name)
 {
   char *tmp = copy_name (name);
   int is_a_field_of_this = 0;
   struct symbol *sym;
-  sym = lookup_symbol (tmp, expression_context_block, VAR_NAMESPACE,
+  sym = lookup_symbol (tmp, expression_context_block, VAR_DOMAIN,
                       &is_a_field_of_this, (struct symtab **) NULL);
   if (sym && SYMBOL_CLASS (sym) != LOC_TYPEDEF)
     {
@@ -1295,9 +1300,7 @@ push_fieldnames (name)
    Handle a qualified name, where DOT_INDEX is the index of the first '.' */
 
 static void
-push_qualified_expression_name (name, dot_index)
-     struct stoken name;
-     int dot_index;
+push_qualified_expression_name (struct stoken name, int dot_index)
 {
   struct stoken token;
   char *tmp;
@@ -1356,7 +1359,7 @@ push_qualified_expression_name (name, dot_index)
       while (dot_index < name.length && name.ptr[dot_index] != '.')
        dot_index++;
     }
-  error ("unknown type `%.*s'", name.length, name.ptr);
+  error (_("unknown type `%.*s'"), name.length, name.ptr);
 }
 
 /* Handle Name in an expression (or LHS).
@@ -1405,9 +1408,9 @@ push_expression_name (name)
                             builtin_type_int);
        }
       else if (!have_full_symbols () && !have_partial_symbols ())
-       error ("No symbol table is loaded.  Use the \"file\" command.");
+       error (_("No symbol table is loaded.  Use the \"file\" command"));
       else
-       error ("No symbol \"%s\" in current context.", tmp);
+       error (_("No symbol \"%s\" in current context"), tmp);
     }
 
 }
This page took 0.038567 seconds and 4 git commands to generate.