Add gdbarch callback to provide formats for debug info float types
[deliverable/binutils-gdb.git] / gdb / jv-exp.y
index 1b80ab4582760228b090efa4c38f5df023238106..79b8127b595f48024ed3c15818a893691818d041 100644 (file)
@@ -1,22 +1,20 @@
 /* YACC parser for Java expressions, for GDB.
-   Copyright 1997, 1998, 1999, 2000
-   Free Software Foundation, Inc.
+   Copyright (C) 1997-2016 Free Software Foundation, Inc.
 
-This file is part of GDB.
+   This file is part of GDB.
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 /* Parse a Java expression from text in a string,
    and return the result as a  struct expression  pointer.
@@ -38,7 +36,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 %{
 
 #include "defs.h"
-#include "gdb_string.h"
 #include <ctype.h>
 #include "expression.h"
 #include "value.h"
@@ -48,56 +45,21 @@ 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"
+#include "completer.h"
 
-/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
-   as well as gratuitiously global symbol names, so we can have multiple
-   yacc generated parsers in gdb.  Note that these are only the variables
-   produced by yacc.  If other parser generators (bison, byacc, etc) produce
-   additional global names that conflict at link time, then those parser
-   generators need to be fixed instead of adding those names to this list. */
-
-#define        yymaxdepth java_maxdepth
-#define        yyparse java_parse
-#define        yylex   java_lex
-#define        yyerror java_error
-#define        yylval  java_lval
-#define        yychar  java_char
-#define        yydebug java_debug
-#define        yypact  java_pact       
-#define        yyr1    java_r1                 
-#define        yyr2    java_r2                 
-#define        yydef   java_def                
-#define        yychk   java_chk                
-#define        yypgo   java_pgo                
-#define        yyact   java_act                
-#define        yyexca  java_exca
-#define yyerrflag java_errflag
-#define yynerrs        java_nerrs
-#define        yyps    java_ps
-#define        yypv    java_pv
-#define        yys     java_s
-#define        yy_yys  java_yys
-#define        yystate java_state
-#define        yytmp   java_tmp
-#define        yyv     java_v
-#define        yy_yyv  java_yyv
-#define        yyval   java_val
-#define        yylloc  java_lloc
-#define yyreds java_reds               /* With YYDEBUG defined */
-#define yytoks java_toks               /* With YYDEBUG defined */
-#define yylhs  java_yylhs
-#define yylen  java_yylen
-#define yydefred java_yydefred
-#define yydgoto        java_yydgoto
-#define yysindex java_yysindex
-#define yyrindex java_yyrindex
-#define yygindex java_yygindex
-#define yytable         java_yytable
-#define yycheck         java_yycheck
-
-#ifndef YYDEBUG
-#define        YYDEBUG 0               /* Default to no yydebug support */
-#endif
+#define parse_type(ps) builtin_type (parse_gdbarch (ps))
+#define parse_java_type(ps) builtin_java_type (parse_gdbarch (ps))
+
+/* Remap normal yacc parser interface names (yyparse, yylex, yyerror,
+   etc).  */
+#define GDB_YY_REMAP_PREFIX java_
+#include "yy-remap.h"
+
+/* The state of the parser, used internally when we are parsing the
+   expression.  */
+
+static struct parser_state *pstate = NULL;
 
 int yyparse (void);
 
@@ -106,11 +68,11 @@ static int yylex (void);
 void yyerror (char *);
 
 static struct type *java_type_from_name (struct stoken);
-static void push_expression_name (struct stoken);
-static void push_fieldnames (struct stoken);
+static void push_expression_name (struct parser_state *, struct stoken);
+static void push_fieldnames (struct parser_state *, struct stoken);
 
 static struct expression *copy_exp (struct expression *, int);
-static void insert_exp (int, struct expression *);
+static void insert_exp (struct parser_state *, int, struct expression *);
 
 %}
 
@@ -142,7 +104,8 @@ static void insert_exp (int, struct expression *);
 
 %{
 /* YYSTYPE gets defined by %union */
-static int parse_number (char *, int, int, YYSTYPE *);
+static int parse_number (struct parser_state *, const char *, int,
+                        int, YYSTYPE *);
 %}
 
 %type <lval> rcurly Dims Dims_opt
@@ -175,7 +138,7 @@ static int parse_number (char *, int, int, YYSTYPE *);
 
 %token <opcode> ASSIGN_MODIFY
 
-%token THIS SUPER NEW
+%token SUPER NEW
 
 %left ','
 %right '=' ASSIGN_MODIFY
@@ -202,9 +165,9 @@ start   :   exp1
 
 type_exp:      PrimitiveOrArrayType
                {
-                 write_exp_elt_opcode(OP_TYPE);
-                 write_exp_elt_type($1);
-                 write_exp_elt_opcode(OP_TYPE);
+                 write_exp_elt_opcode (pstate, OP_TYPE);
+                 write_exp_elt_type (pstate, $1);
+                 write_exp_elt_opcode (pstate, OP_TYPE);
                }
        ;
 
@@ -216,36 +179,38 @@ PrimitiveOrArrayType:
 StringLiteral:
        STRING_LITERAL
                {
-                 write_exp_elt_opcode (OP_STRING);
-                 write_exp_string ($1);
-                 write_exp_elt_opcode (OP_STRING);
+                 write_exp_elt_opcode (pstate, OP_STRING);
+                 write_exp_string (pstate, $1);
+                 write_exp_elt_opcode (pstate, OP_STRING);
                }
 ;
 
 Literal:
        INTEGER_LITERAL
-               { write_exp_elt_opcode (OP_LONG);
-                 write_exp_elt_type ($1.type);
-                 write_exp_elt_longcst ((LONGEST)($1.val));
-                 write_exp_elt_opcode (OP_LONG); }
+               { write_exp_elt_opcode (pstate, OP_LONG);
+                 write_exp_elt_type (pstate, $1.type);
+                 write_exp_elt_longcst (pstate, (LONGEST)($1.val));
+                 write_exp_elt_opcode (pstate, OP_LONG); }
 |      NAME_OR_INT
                { YYSTYPE val;
-                 parse_number ($1.ptr, $1.length, 0, &val);
-                 write_exp_elt_opcode (OP_LONG);
-                 write_exp_elt_type (val.typed_val_int.type);
-                 write_exp_elt_longcst ((LONGEST)val.typed_val_int.val);
-                 write_exp_elt_opcode (OP_LONG);
+                 parse_number (pstate, $1.ptr, $1.length, 0, &val);
+                 write_exp_elt_opcode (pstate, OP_LONG);
+                 write_exp_elt_type (pstate, val.typed_val_int.type);
+                 write_exp_elt_longcst (pstate,
+                                        (LONGEST) val.typed_val_int.val);
+                 write_exp_elt_opcode (pstate, OP_LONG);
                }
 |      FLOATING_POINT_LITERAL
-               { write_exp_elt_opcode (OP_DOUBLE);
-                 write_exp_elt_type ($1.type);
-                 write_exp_elt_dblcst ($1.dval);
-                 write_exp_elt_opcode (OP_DOUBLE); }
+               { write_exp_elt_opcode (pstate, OP_DOUBLE);
+                 write_exp_elt_type (pstate, $1.type);
+                 write_exp_elt_dblcst (pstate, $1.dval);
+                 write_exp_elt_opcode (pstate, OP_DOUBLE); }
 |      BOOLEAN_LITERAL
-               { write_exp_elt_opcode (OP_LONG);
-                 write_exp_elt_type (java_boolean_type);
-                 write_exp_elt_longcst ((LONGEST)$1);
-                 write_exp_elt_opcode (OP_LONG); }
+               { write_exp_elt_opcode (pstate, OP_LONG);
+                 write_exp_elt_type (pstate,
+                                 parse_java_type (pstate)->builtin_boolean);
+                 write_exp_elt_longcst (pstate, (LONGEST)$1);
+                 write_exp_elt_opcode (pstate, OP_LONG); }
 |      StringLiteral
        ;
 
@@ -259,7 +224,7 @@ Type:
 PrimitiveType:
        NumericType
 |      BOOLEAN
-               { $$ = java_boolean_type; }
+               { $$ = parse_java_type (pstate)->builtin_boolean; }
 ;
 
 NumericType:
@@ -269,22 +234,22 @@ NumericType:
 
 IntegralType:
        BYTE
-               { $$ = java_byte_type; }
+               { $$ = parse_java_type (pstate)->builtin_byte; }
 |      SHORT
-               { $$ = java_short_type; }
+               { $$ = parse_java_type (pstate)->builtin_short; }
 |      INT
-               { $$ = java_int_type; }
+               { $$ = parse_java_type (pstate)->builtin_int; }
 |      LONG
-               { $$ = java_long_type; }
+               { $$ = parse_java_type (pstate)->builtin_long; }
 |      CHAR
-               { $$ = java_char_type; }
+               { $$ = parse_java_type (pstate)->builtin_char; }
 ;
 
 FloatingPointType:
        FLOAT
-               { $$ = java_float_type; }
+               { $$ = parse_java_type (pstate)->builtin_float; }
 |      DOUBLE
-               { $$ = java_double_type; }
+               { $$ = parse_java_type (pstate)->builtin_double; }
 ;
 
 /* UNUSED:
@@ -330,13 +295,16 @@ QualifiedName:
                { $$.length = $1.length + $3.length + 1;
                  if ($1.ptr + $1.length + 1 == $3.ptr
                      && $1.ptr[$1.length] == '.')
-                   $$.ptr = $1.ptr;  /* Optimization. */
+                   $$.ptr = $1.ptr;  /* Optimization.  */
                  else
                    {
-                     $$.ptr = (char *) malloc ($$.length + 1);
-                     make_cleanup (free, $$.ptr);
-                     sprintf ($$.ptr, "%.*s.%.*s",
+                     char *buf;
+
+                     buf = (char *) malloc ($$.length + 1);
+                     make_cleanup (free, buf);
+                     sprintf (buf, "%.*s.%.*s",
                               $1.length, $1.ptr, $3.length, $3.ptr);
+                     $$.ptr = buf;
                } }
 ;
 
@@ -351,7 +319,7 @@ type_exp:   type
 /* Expressions, including the comma operator.  */
 exp1   :       Expression
        |       exp1 ',' Expression
-                       { write_exp_elt_opcode (BINOP_COMMA); }
+                       { write_exp_elt_opcode (pstate, BINOP_COMMA); }
        ;
 
 Primary:
@@ -361,19 +329,16 @@ Primary:
 
 PrimaryNoNewArray:
        Literal
-|      THIS
-               { write_exp_elt_opcode (OP_THIS);
-                 write_exp_elt_opcode (OP_THIS); }
 |      '(' Expression ')'
 |      ClassInstanceCreationExpression
 |      FieldAccess
 |      MethodInvocation
 |      ArrayAccess
 |      lcurly ArgumentList rcurly
-               { write_exp_elt_opcode (OP_ARRAY);
-                 write_exp_elt_longcst ((LONGEST) 0);
-                 write_exp_elt_longcst ((LONGEST) $3);
-                 write_exp_elt_opcode (OP_ARRAY); }
+               { write_exp_elt_opcode (pstate, OP_ARRAY);
+                 write_exp_elt_longcst (pstate, (LONGEST) 0);
+                 write_exp_elt_longcst (pstate, (LONGEST) $3);
+                 write_exp_elt_opcode (pstate, OP_ARRAY); }
 ;
 
 lcurly:
@@ -388,7 +353,8 @@ rcurly:
 
 ClassInstanceCreationExpression:
        NEW ClassType '(' ArgumentList_opt ')'
-               { error ("FIXME - ClassInstanceCreationExpression"); }
+               { internal_error (__FILE__, __LINE__,
+                                 _("FIXME - ClassInstanceCreationExpression")); }
 ;
 
 ArgumentList:
@@ -406,9 +372,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:
@@ -435,19 +403,28 @@ Dims_opt:
 
 FieldAccess:
        Primary '.' SimpleName
-               { push_fieldnames ($3); }
+               { push_fieldnames (pstate, $3); }
 |      VARIABLE '.' SimpleName
-               { push_fieldnames ($3); }
+               { push_fieldnames (pstate, $3); }
 /*|    SUPER '.' SimpleName { FIXME } */
 ;
 
+FuncStart:
+       Name '('
+                { push_expression_name (pstate, $1); }
+;
+
 MethodInvocation:
-       Name '(' ArgumentList_opt ')'
-               { error ("method invocation not implemented"); }
+       FuncStart
+                { start_arglist(); }
+       ArgumentList_opt ')'
+                { write_exp_elt_opcode (pstate, OP_FUNCALL);
+                 write_exp_elt_longcst (pstate, (LONGEST) end_arglist ());
+                 write_exp_elt_opcode (pstate, OP_FUNCALL); }
 |      Primary '.' SimpleName '(' ArgumentList_opt ')'
-               { error ("method invocation not implemented"); }
+               { error (_("Form of method invocation not implemented")); }
 |      SUPER '.' SimpleName '(' ArgumentList_opt ')'
-               { error ("method invocation not implemented"); }
+               { error (_("Form of method invocation not implemented")); }
 ;
 
 ArrayAccess:
@@ -460,38 +437,41 @@ ArrayAccess:
                     for our parsing kludges.  */
                  struct expression *name_expr;
 
-                 push_expression_name ($1);
-                 name_expr = copy_exp (expout, expout_ptr);
-                 expout_ptr -= name_expr->nelts;
-                 insert_exp (expout_ptr-length_of_subexp (expout, expout_ptr),
+                 push_expression_name (pstate, $1);
+                 name_expr = copy_exp (pstate->expout, pstate->expout_ptr);
+                 pstate->expout_ptr -= name_expr->nelts;
+                 insert_exp (pstate,
+                             pstate->expout_ptr
+                             - length_of_subexp (pstate->expout,
+                                                 pstate->expout_ptr),
                              name_expr);
                  free (name_expr);
-                 write_exp_elt_opcode (BINOP_SUBSCRIPT);
+                 write_exp_elt_opcode (pstate, BINOP_SUBSCRIPT);
                }
 |      VARIABLE '[' Expression ']'
-               { write_exp_elt_opcode (BINOP_SUBSCRIPT); }
+               { write_exp_elt_opcode (pstate, BINOP_SUBSCRIPT); }
 |      PrimaryNoNewArray '[' Expression ']'
-               { write_exp_elt_opcode (BINOP_SUBSCRIPT); }
+               { write_exp_elt_opcode (pstate, BINOP_SUBSCRIPT); }
 ;
 
 PostfixExpression:
        Primary
 |      Name
-               { push_expression_name ($1); }
+               { push_expression_name (pstate, $1); }
 |      VARIABLE
-               /* Already written by write_dollar_variable. */
+               /* Already written by write_dollar_variable.  */
 |      PostIncrementExpression
 |      PostDecrementExpression
 ;
 
 PostIncrementExpression:
        PostfixExpression INCREMENT
-               { write_exp_elt_opcode (UNOP_POSTINCREMENT); }
+               { write_exp_elt_opcode (pstate, UNOP_POSTINCREMENT); }
 ;
 
 PostDecrementExpression:
        PostfixExpression DECREMENT
-               { write_exp_elt_opcode (UNOP_POSTDECREMENT); }
+               { write_exp_elt_opcode (pstate, UNOP_POSTDECREMENT); }
 ;
 
 UnaryExpression:
@@ -499,145 +479,151 @@ UnaryExpression:
 |      PreDecrementExpression
 |      '+' UnaryExpression
 |      '-' UnaryExpression
-               { write_exp_elt_opcode (UNOP_NEG); }
+               { write_exp_elt_opcode (pstate, UNOP_NEG); }
 |      '*' UnaryExpression 
-               { write_exp_elt_opcode (UNOP_IND); } /*FIXME not in Java  */
+               { write_exp_elt_opcode (pstate,
+                                       UNOP_IND); } /*FIXME not in Java  */
 |      UnaryExpressionNotPlusMinus
 ;
 
 PreIncrementExpression:
        INCREMENT UnaryExpression
-               { write_exp_elt_opcode (UNOP_PREINCREMENT); }
+               { write_exp_elt_opcode (pstate, UNOP_PREINCREMENT); }
 ;
 
 PreDecrementExpression:
        DECREMENT UnaryExpression
-               { write_exp_elt_opcode (UNOP_PREDECREMENT); }
+               { write_exp_elt_opcode (pstate, UNOP_PREDECREMENT); }
 ;
 
 UnaryExpressionNotPlusMinus:
        PostfixExpression
 |      '~' UnaryExpression
-               { write_exp_elt_opcode (UNOP_COMPLEMENT); }
+               { write_exp_elt_opcode (pstate, UNOP_COMPLEMENT); }
 |      '!' UnaryExpression
-               { write_exp_elt_opcode (UNOP_LOGICAL_NOT); }
+               { write_exp_elt_opcode (pstate, UNOP_LOGICAL_NOT); }
 |      CastExpression
        ;
 
 CastExpression:
        '(' PrimitiveType Dims_opt ')' UnaryExpression
-               { write_exp_elt_opcode (UNOP_CAST);
-                 write_exp_elt_type (java_array_type ($2, $3));
-                 write_exp_elt_opcode (UNOP_CAST); }
+               { write_exp_elt_opcode (pstate, UNOP_CAST);
+                 write_exp_elt_type (pstate, java_array_type ($2, $3));
+                 write_exp_elt_opcode (pstate, UNOP_CAST); }
 |      '(' Expression ')' UnaryExpressionNotPlusMinus
                {
-                 int exp_size = expout_ptr;
-                 int last_exp_size = length_of_subexp(expout, expout_ptr);
+                 int last_exp_size = length_of_subexp (pstate->expout,
+                                                       pstate->expout_ptr);
                  struct type *type;
                  int i;
-                 int base = expout_ptr - last_exp_size - 3;
-                 if (base < 0 || expout->elts[base+2].opcode != OP_TYPE)
-                   error ("invalid cast expression");
-                 type = expout->elts[base+1].type;
+                 int base = pstate->expout_ptr - last_exp_size - 3;
+
+                 if (base < 0
+                     || pstate->expout->elts[base+2].opcode != OP_TYPE)
+                   error (_("Invalid cast expression"));
+                 type = pstate->expout->elts[base+1].type;
                  /* Remove the 'Expression' and slide the
-                    UnaryExpressionNotPlusMinus down to replace it. */
+                    UnaryExpressionNotPlusMinus down to replace it.  */
                  for (i = 0;  i < last_exp_size;  i++)
-                   expout->elts[base + i] = expout->elts[base + i + 3];
-                 expout_ptr -= 3;
+                   pstate->expout->elts[base + i]
+                     = pstate->expout->elts[base + i + 3];
+                 pstate->expout_ptr -= 3;
                  if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
                    type = lookup_pointer_type (type);
-                 write_exp_elt_opcode (UNOP_CAST);
-                 write_exp_elt_type (type);
-                 write_exp_elt_opcode (UNOP_CAST);
+                 write_exp_elt_opcode (pstate, UNOP_CAST);
+                 write_exp_elt_type (pstate, type);
+                 write_exp_elt_opcode (pstate, UNOP_CAST);
                }
 |      '(' Name Dims ')' UnaryExpressionNotPlusMinus
-               { write_exp_elt_opcode (UNOP_CAST);
-                 write_exp_elt_type (java_array_type (java_type_from_name ($2), $3));
-                 write_exp_elt_opcode (UNOP_CAST); }
+               { write_exp_elt_opcode (pstate, UNOP_CAST);
+                 write_exp_elt_type (pstate,
+                                     java_array_type (java_type_from_name
+                                                      ($2), $3));
+                 write_exp_elt_opcode (pstate, UNOP_CAST); }
 ;
 
 
 MultiplicativeExpression:
        UnaryExpression
 |      MultiplicativeExpression '*' UnaryExpression
-               { write_exp_elt_opcode (BINOP_MUL); }
+               { write_exp_elt_opcode (pstate, BINOP_MUL); }
 |      MultiplicativeExpression '/' UnaryExpression
-               { write_exp_elt_opcode (BINOP_DIV); }
+               { write_exp_elt_opcode (pstate, BINOP_DIV); }
 |      MultiplicativeExpression '%' UnaryExpression
-               { write_exp_elt_opcode (BINOP_REM); }
+               { write_exp_elt_opcode (pstate, BINOP_REM); }
 ;
 
 AdditiveExpression:
        MultiplicativeExpression
 |      AdditiveExpression '+' MultiplicativeExpression
-               { write_exp_elt_opcode (BINOP_ADD); }
+               { write_exp_elt_opcode (pstate, BINOP_ADD); }
 |      AdditiveExpression '-' MultiplicativeExpression
-               { write_exp_elt_opcode (BINOP_SUB); }
+               { write_exp_elt_opcode (pstate, BINOP_SUB); }
 ;
 
 ShiftExpression:
        AdditiveExpression
 |      ShiftExpression LSH AdditiveExpression
-               { write_exp_elt_opcode (BINOP_LSH); }
+               { write_exp_elt_opcode (pstate, BINOP_LSH); }
 |      ShiftExpression RSH AdditiveExpression
-               { write_exp_elt_opcode (BINOP_RSH); }
+               { write_exp_elt_opcode (pstate, BINOP_RSH); }
 /* |   ShiftExpression >>> AdditiveExpression { FIXME } */
 ;
 
 RelationalExpression:
        ShiftExpression
 |      RelationalExpression '<' ShiftExpression
-               { write_exp_elt_opcode (BINOP_LESS); }
+               { write_exp_elt_opcode (pstate, BINOP_LESS); }
 |      RelationalExpression '>' ShiftExpression
-               { write_exp_elt_opcode (BINOP_GTR); }
+               { write_exp_elt_opcode (pstate, BINOP_GTR); }
 |      RelationalExpression LEQ ShiftExpression
-               { write_exp_elt_opcode (BINOP_LEQ); }
+               { write_exp_elt_opcode (pstate, BINOP_LEQ); }
 |      RelationalExpression GEQ ShiftExpression
-               { write_exp_elt_opcode (BINOP_GEQ); }
+               { write_exp_elt_opcode (pstate, BINOP_GEQ); }
 /* | RelationalExpresion INSTANCEOF ReferenceType { FIXME } */
 ;
 
 EqualityExpression:
        RelationalExpression
 |      EqualityExpression EQUAL RelationalExpression
-               { write_exp_elt_opcode (BINOP_EQUAL); }
+               { write_exp_elt_opcode (pstate, BINOP_EQUAL); }
 |      EqualityExpression NOTEQUAL RelationalExpression
-               { write_exp_elt_opcode (BINOP_NOTEQUAL); }
+               { write_exp_elt_opcode (pstate, BINOP_NOTEQUAL); }
 ;
 
 AndExpression:
        EqualityExpression
 |      AndExpression '&' EqualityExpression
-               { write_exp_elt_opcode (BINOP_BITWISE_AND); }
+               { write_exp_elt_opcode (pstate, BINOP_BITWISE_AND); }
 ;
 
 ExclusiveOrExpression:
        AndExpression
 |      ExclusiveOrExpression '^' AndExpression
-               { write_exp_elt_opcode (BINOP_BITWISE_XOR); }
+               { write_exp_elt_opcode (pstate, BINOP_BITWISE_XOR); }
 ;
 InclusiveOrExpression:
        ExclusiveOrExpression
 |      InclusiveOrExpression '|' ExclusiveOrExpression
-               { write_exp_elt_opcode (BINOP_BITWISE_IOR); }
+               { write_exp_elt_opcode (pstate, BINOP_BITWISE_IOR); }
 ;
 
 ConditionalAndExpression:
        InclusiveOrExpression
 |      ConditionalAndExpression ANDAND InclusiveOrExpression
-               { write_exp_elt_opcode (BINOP_LOGICAL_AND); }
+               { write_exp_elt_opcode (pstate, BINOP_LOGICAL_AND); }
 ;
 
 ConditionalOrExpression:
        ConditionalAndExpression
 |      ConditionalOrExpression OROR ConditionalAndExpression
-               { write_exp_elt_opcode (BINOP_LOGICAL_OR); }
+               { write_exp_elt_opcode (pstate, BINOP_LOGICAL_OR); }
 ;
 
 ConditionalExpression:
        ConditionalOrExpression
 |      ConditionalOrExpression '?' Expression ':' ConditionalExpression
-               { write_exp_elt_opcode (TERNOP_COND); }
+               { write_exp_elt_opcode (pstate, TERNOP_COND); }
 ;
 
 AssignmentExpression:
@@ -647,18 +633,18 @@ AssignmentExpression:
                          
 Assignment:
        LeftHandSide '=' ConditionalExpression
-               { write_exp_elt_opcode (BINOP_ASSIGN); }
+               { write_exp_elt_opcode (pstate, BINOP_ASSIGN); }
 |      LeftHandSide ASSIGN_MODIFY ConditionalExpression
-               { write_exp_elt_opcode (BINOP_ASSIGN_MODIFY);
-                 write_exp_elt_opcode ($2);
-                 write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); }
+               { write_exp_elt_opcode (pstate, BINOP_ASSIGN_MODIFY);
+                 write_exp_elt_opcode (pstate, $2);
+                 write_exp_elt_opcode (pstate, BINOP_ASSIGN_MODIFY); }
 ;
 
 LeftHandSide:
        ForcedName
-               { push_expression_name ($1); }
+               { push_expression_name (pstate, $1); }
 |      VARIABLE
-               /* Already written by write_dollar_variable. */
+               /* Already written by write_dollar_variable.  */
 |      FieldAccess
 |      ArrayAccess
 ;
@@ -676,56 +662,42 @@ Expression:
 /*** Needs some error checking for the float case ***/
 
 static int
-parse_number (p, len, parsed_float, putithere)
-     register char *p;
-     register int len;
-     int parsed_float;
-     YYSTYPE *putithere;
+parse_number (struct parser_state *par_state,
+             const char *p, int len, int parsed_float, YYSTYPE *putithere)
 {
-  register ULONGEST n = 0;
+  ULONGEST n = 0;
   ULONGEST limit, limit_div_base;
 
-  register int c;
-  register int base = input_radix;
+  int c;
+  int base = input_radix;
 
   struct type *type;
 
   if (parsed_float)
     {
-      /* It's a float since it contains a point or an exponent.  */
-      char c;
-      int num = 0;     /* number of tokens scanned by scanf */
-      char saved_char = p[len];
-
-      p[len] = 0;      /* null-terminate the token */
-      if (sizeof (putithere->typed_val_float.dval) <= sizeof (float))
-       num = sscanf (p, "%g%c", (float *) &putithere->typed_val_float.dval, &c);
-      else if (sizeof (putithere->typed_val_float.dval) <= sizeof (double))
-       num = sscanf (p, "%lg%c", (double *) &putithere->typed_val_float.dval, &c);
-      else
-       {
-#ifdef SCANF_HAS_LONG_DOUBLE
-         num = sscanf (p, "%Lg%c", &putithere->typed_val_float.dval, &c);
-#else
-         /* Scan it into a double, then assign it to the long double.
-            This at least wins with values representable in the range
-            of doubles. */
-         double temp;
-         num = sscanf (p, "%lg%c", &temp, &c);
-         putithere->typed_val_float.dval = temp;
-#endif
-       }
-      p[len] = saved_char;     /* restore the input stream */
-      if (num != 1)            /* check scanf found ONLY a float ... */
+      const char *suffix;
+      int suffix_len;
+
+      if (! parse_float (p, len, &putithere->typed_val_float.dval, &suffix))
        return ERROR;
-      /* See if it has `f' or `d' suffix (float or double).  */
 
-      c = tolower (p[len - 1]);
+      suffix_len = p + len - suffix;
 
-      if (c == 'f' || c == 'F')
-       putithere->typed_val_float.type = builtin_type_float;
-      else if (isdigit (c) || c == '.' || c == 'd' || c == 'D')
-       putithere->typed_val_float.type = builtin_type_double;
+      if (suffix_len == 0)
+       putithere->typed_val_float.type
+         = parse_type (par_state)->builtin_double;
+      else if (suffix_len == 1)
+       {
+         /* See if it has `f' or `d' suffix (float or double).  */
+         if (tolower (*suffix) == 'f')
+           putithere->typed_val_float.type =
+             parse_type (par_state)->builtin_float;
+         else if (tolower (*suffix) == 'd')
+           putithere->typed_val_float.type =
+             parse_type (par_state)->builtin_double;
+         else
+           return ERROR;
+       }
       else
        return ERROR;
 
@@ -764,17 +736,17 @@ parse_number (p, len, parsed_float, putithere)
       }
 
   c = p[len-1];
-  /* A paranoid calculation of (1<<64)-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;
+      type = parse_java_type (par_state)->builtin_long;
       len--;
     }
   else
     {
-      type = java_int_type;
+      type = parse_java_type (par_state)->builtin_int;
     }
   limit_div_base = limit / (ULONGEST) base;
 
@@ -793,17 +765,19 @@ 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;
        }
 
   /* 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;
+     promote to long.  Java does not do this, so mark it as
+     parse_type (par_state)->builtin_uint64 rather than
+     parse_java_type (par_state)->builtin_long.
+     0x80000000 will become -0x80000000 instead of 0x80000000L, because we
+     don't know the sign at this point.  */
+  if (type == parse_java_type (par_state)->builtin_int
+      && n > (ULONGEST)0x80000000)
+    type = parse_type (par_state)->builtin_uint64;
 
   putithere->typed_val_int.val = n;
   putithere->typed_val_int.type = type;
@@ -813,7 +787,7 @@ parse_number (p, len, parsed_float, putithere)
 
 struct token
 {
-  char *operator;
+  char *oper;
   int token;
   enum exp_opcode opcode;
 };
@@ -849,23 +823,25 @@ static const struct token tokentab2[] =
 /* Read one token, getting characters through lexptr.  */
 
 static int
-yylex ()
+yylex (void)
 {
   int c;
   int namelen;
   unsigned int i;
-  char *tokstart;
-  char *tokptr;
+  const char *tokstart;
+  const char *tokptr;
   int tempbufindex;
   static char *tempbuf;
   static int tempbufsize;
   
  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++)
-    if (STREQN (tokstart, tokentab3[i].operator, 3))
+    if (strncmp (tokstart, tokentab3[i].oper, 3) == 0)
       {
        lexptr += 3;
        yylval.opcode = tokentab3[i].opcode;
@@ -874,7 +850,7 @@ yylex ()
 
   /* See if it is a special token of length 2.  */
   for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++)
-    if (STREQN (tokstart, tokentab2[i].operator, 2))
+    if (strncmp (tokstart, tokentab2[i].oper, 2) == 0)
       {
        lexptr += 2;
        yylval.opcode = tokentab2[i].opcode;
@@ -895,16 +871,16 @@ yylex ()
     case '\'':
       /* We either have a character constant ('0' or '\177' for example)
         or we have a quoted symbol reference ('foo(int,int)' in C++
-        for example). */
+        for example).  */
       lexptr++;
       c = *lexptr++;
       if (c == '\\')
-       c = parse_escape (&lexptr);
+       c = parse_escape (parse_gdbarch (pstate), &lexptr);
       else if (c == '\'')
-       error ("Empty character constant.");
+       error (_("Empty character constant"));
 
       yylval.typed_val_int.val = c;
-      yylval.typed_val_int.type = java_char_type;
+      yylval.typed_val_int.type = parse_java_type (pstate)->builtin_char;
 
       c = *lexptr++;
       if (c != '\'')
@@ -914,12 +890,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;
 
@@ -944,7 +920,7 @@ yylex ()
     case '.':
       /* Might be a floating point number.  */
       if (lexptr[1] < '0' || lexptr[1] > '9')
-       goto symbol;            /* Nope, must be a symbol. */
+       goto symbol;            /* Nope, must be a symbol.  */
       /* FALL THRU into number case.  */
 
     case '0':
@@ -960,7 +936,7 @@ yylex ()
       {
        /* It's a number.  */
        int got_dot = 0, got_e = 0, toktype;
-       register char *p = tokstart;
+       const char *p = tokstart;
        int hex = input_radix > 10;
 
        if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
@@ -997,14 +973,15 @@ yylex ()
                                  && (*p < 'A' || *p > 'Z')))
              break;
          }
-       toktype = parse_number (tokstart, p - tokstart, got_dot|got_e, &yylval);
+       toktype = parse_number (pstate, tokstart, p - tokstart,
+                               got_dot|got_e, &yylval);
         if (toktype == ERROR)
          {
            char *err_copy = (char *) alloca (p - tokstart + 1);
 
            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;
@@ -1049,7 +1026,7 @@ yylex ()
 
       do {
        /* Grow the static temp buffer if necessary, including allocating
-          the first one on demand. */
+          the first one on demand.  */
        if (tempbufindex + 1 >= tempbufsize)
          {
            tempbuf = (char *) realloc (tempbuf, tempbufsize += 64);
@@ -1058,11 +1035,11 @@ yylex ()
          {
          case '\0':
          case '"':
-           /* Do nothing, loop will terminate. */
+           /* Do nothing, loop will terminate.  */
            break;
          case '\\':
            tokptr++;
-           c = parse_escape (&tokptr);
+           c = parse_escape (parse_gdbarch (pstate), &tokptr);
            if (c == -1)
              {
                continue;
@@ -1076,7 +1053,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;
@@ -1088,7 +1065,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;
@@ -1126,54 +1103,43 @@ yylex ()
   switch (namelen)
     {
     case 7:
-      if (STREQN (tokstart, "boolean", 7))
+      if (strncmp (tokstart, "boolean", 7) == 0)
        return BOOLEAN;
       break;
     case 6:
-      if (STREQN (tokstart, "double", 6))      
+      if (strncmp (tokstart, "double", 6) == 0)      
        return DOUBLE;
       break;
     case 5:
-      if (STREQN (tokstart, "short", 5))
+      if (strncmp (tokstart, "short", 5) == 0)
        return SHORT;
-      if (STREQN (tokstart, "false", 5))
+      if (strncmp (tokstart, "false", 5) == 0)
        {
          yylval.lval = 0;
          return BOOLEAN_LITERAL;
        }
-      if (STREQN (tokstart, "super", 5))
+      if (strncmp (tokstart, "super", 5) == 0)
        return SUPER;
-      if (STREQN (tokstart, "float", 5))
+      if (strncmp (tokstart, "float", 5) == 0)
        return FLOAT;
       break;
     case 4:
-      if (STREQN (tokstart, "long", 4))
+      if (strncmp (tokstart, "long", 4) == 0)
        return LONG;
-      if (STREQN (tokstart, "byte", 4))
+      if (strncmp (tokstart, "byte", 4) == 0)
        return BYTE;
-      if (STREQN (tokstart, "char", 4))
+      if (strncmp (tokstart, "char", 4) == 0)
        return CHAR;
-      if (STREQN (tokstart, "true", 4))
+      if (strncmp (tokstart, "true", 4) == 0)
        {
          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))
+      if (strncmp (tokstart, "int", 3) == 0)
        return INT;
-      if (STREQN (tokstart, "new", 3))
+      if (strncmp (tokstart, "new", 3) == 0)
        return NEW;
       break;
     default:
@@ -1185,7 +1151,7 @@ yylex ()
 
   if (*tokstart == '$')
     {
-      write_dollar_variable (yylval.sval);
+      write_dollar_variable (pstate, yylval.sval);
       return VARIABLE;
     }
 
@@ -1196,86 +1162,101 @@ yylex ()
        (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
     {
       YYSTYPE newlval; /* Its value is ignored.  */
-      int hextype = parse_number (tokstart, namelen, 0, &newlval);
+      int hextype = parse_number (pstate, tokstart, namelen, 0, &newlval);
       if (hextype == INTEGER_LITERAL)
        return NAME_OR_INT;
     }
   return IDENTIFIER;
 }
 
+int
+java_parse (struct parser_state *par_state)
+{
+  int result;
+  struct cleanup *c = make_cleanup_clear_parser_state (&pstate);
+
+  /* Setting up the parser state.  */
+  gdb_assert (par_state != NULL);
+  pstate = par_state;
+
+  result = yyparse ();
+  do_cleanups (c);
+
+  return result;
+}
+
 void
-yyerror (msg)
-     char *msg;
+yyerror (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 *
-java_type_from_name (name)
-     struct stoken name;
+java_type_from_name (struct stoken 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;
 }
 
 /* If NAME is a valid variable name in this scope, push it and return 1.
-   Otherwise, return 0. */
+   Otherwise, return 0.  */
 
 static int
-push_variable (name)
-     struct stoken name;
+push_variable (struct parser_state *par_state, 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,
-                      &is_a_field_of_this, (struct symtab **) NULL);
-  if (sym && SYMBOL_CLASS (sym) != LOC_TYPEDEF)
+  struct field_of_this_result is_a_field_of_this;
+  struct block_symbol sym;
+
+  sym = lookup_symbol (tmp, expression_context_block, VAR_DOMAIN,
+                      &is_a_field_of_this);
+  if (sym.symbol && SYMBOL_CLASS (sym.symbol) != LOC_TYPEDEF)
     {
-      if (symbol_read_needs_frame (sym))
+      if (symbol_read_needs_frame (sym.symbol))
        {
          if (innermost_block == 0 ||
-             contained_in (block_found, innermost_block))
-           innermost_block = block_found;
+             contained_in (sym.block, innermost_block))
+           innermost_block = sym.block;
        }
 
-      write_exp_elt_opcode (OP_VAR_VALUE);
-      /* We want to use the selected frame, not another more inner frame
-        which happens to be in the same block.  */
-      write_exp_elt_block (NULL);
-      write_exp_elt_sym (sym);
-      write_exp_elt_opcode (OP_VAR_VALUE);
+      write_exp_elt_opcode (par_state, OP_VAR_VALUE);
+      write_exp_elt_block (par_state, sym.block);
+      write_exp_elt_sym (par_state, sym.symbol);
+      write_exp_elt_opcode (par_state, OP_VAR_VALUE);
       return 1;
     }
-  if (is_a_field_of_this)
+  if (is_a_field_of_this.type != NULL)
     {
       /* it hangs off of `this'.  Must not inadvertently convert from a
         method call to data ref.  */
       if (innermost_block == 0 || 
-         contained_in (block_found, innermost_block))
-       innermost_block = block_found;
-      write_exp_elt_opcode (OP_THIS);
-      write_exp_elt_opcode (OP_THIS);
-      write_exp_elt_opcode (STRUCTOP_PTR);
-      write_exp_string (name);
-      write_exp_elt_opcode (STRUCTOP_PTR);
+         contained_in (sym.block, innermost_block))
+       innermost_block = sym.block;
+      write_exp_elt_opcode (par_state, OP_THIS);
+      write_exp_elt_opcode (par_state, OP_THIS);
+      write_exp_elt_opcode (par_state, STRUCTOP_PTR);
+      write_exp_string (par_state, name);
+      write_exp_elt_opcode (par_state, STRUCTOP_PTR);
       return 1;
     }
   return 0;
 }
 
 /* Assuming a reference expression has been pushed, emit the
-   STRUCTOP_STRUCT ops to access the field named NAME.  If NAME is a
-   qualified name (has '.'), generate a field access for each part. */
+   STRUCTOP_PTR ops to access the field named NAME.  If NAME is a
+   qualified name (has '.'), generate a field access for each part.  */
 
 static void
-push_fieldnames (name)
-     struct stoken name;
+push_fieldnames (struct parser_state *par_state, struct stoken name)
 {
   int i;
   struct stoken token;
@@ -1284,11 +1265,11 @@ push_fieldnames (name)
     {
       if (i == name.length || name.ptr[i] == '.')
        {
-         /* token.ptr is start of current field name. */
+         /* token.ptr is start of current field name.  */
          token.length = &name.ptr[i] - token.ptr;
-         write_exp_elt_opcode (STRUCTOP_STRUCT);
-         write_exp_string (token);
-         write_exp_elt_opcode (STRUCTOP_STRUCT);
+         write_exp_elt_opcode (par_state, STRUCTOP_PTR);
+         write_exp_string (par_state, token);
+         write_exp_elt_opcode (par_state, STRUCTOP_PTR);
          token.ptr += token.length + 1;
        }
       if (i >= name.length)
@@ -1300,9 +1281,8 @@ 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 parser_state *par_state,
+                               struct stoken name, int dot_index)
 {
   struct stoken token;
   char *tmp;
@@ -1311,11 +1291,11 @@ push_qualified_expression_name (name, dot_index)
   token.ptr = name.ptr;
   token.length = dot_index;
 
-  if (push_variable (token))
+  if (push_variable (par_state, token))
     {
       token.ptr = name.ptr + dot_index + 1;
       token.length = name.length - dot_index - 1;
-      push_fieldnames (token);
+      push_fieldnames (par_state, token);
       return;
     }
 
@@ -1329,9 +1309,9 @@ push_qualified_expression_name (name, dot_index)
        {
          if (dot_index == name.length)
            {
-             write_exp_elt_opcode(OP_TYPE);
-             write_exp_elt_type(typ);
-             write_exp_elt_opcode(OP_TYPE);
+             write_exp_elt_opcode (par_state, OP_TYPE);
+             write_exp_elt_type (par_state, typ);
+             write_exp_elt_opcode (par_state, OP_TYPE);
              return;
            }
          dot_index++;  /* Skip '.' */
@@ -1342,16 +1322,16 @@ push_qualified_expression_name (name, dot_index)
            dot_index++;
          token.ptr = name.ptr;
          token.length = dot_index;
-         write_exp_elt_opcode (OP_SCOPE);
-         write_exp_elt_type (typ);
-         write_exp_string (token);
-         write_exp_elt_opcode (OP_SCOPE); 
+         write_exp_elt_opcode (par_state, OP_SCOPE);
+         write_exp_elt_type (par_state, typ);
+         write_exp_string (par_state, token);
+         write_exp_elt_opcode (par_state, OP_SCOPE); 
          if (dot_index < name.length)
            {
              dot_index++;
              name.ptr += dot_index;
              name.length -= dot_index;
-             push_fieldnames (name);
+             push_fieldnames (par_state, name);
            }
          return;
        }
@@ -1361,58 +1341,52 @@ 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).
-   Handle VAR, TYPE, TYPE.FIELD1....FIELDN and VAR.FIELD1....FIELDN. */
+   Handle VAR, TYPE, TYPE.FIELD1....FIELDN and VAR.FIELD1....FIELDN.  */
 
 static void
-push_expression_name (name)
-     struct stoken name;
+push_expression_name (struct parser_state *par_state, struct stoken name)
 {
   char *tmp;
   struct type *typ;
-  char *ptr;
   int i;
 
   for (i = 0;  i < name.length;  i++)
     {
       if (name.ptr[i] == '.')
        {
-         /* It's a Qualified Expression Name. */
-         push_qualified_expression_name (name, i);
+         /* It's a Qualified Expression Name.  */
+         push_qualified_expression_name (par_state, name, i);
          return;
        }
     }
 
-  /* It's a Simple Expression Name. */
+  /* It's a Simple Expression Name.  */
   
-  if (push_variable (name))
+  if (push_variable (par_state, name))
     return;
   tmp = copy_name (name);
   typ = java_lookup_class (tmp);
   if (typ != NULL)
     {
-      write_exp_elt_opcode(OP_TYPE);
-      write_exp_elt_type(typ);
-      write_exp_elt_opcode(OP_TYPE);
+      write_exp_elt_opcode (par_state, OP_TYPE);
+      write_exp_elt_type (par_state, typ);
+      write_exp_elt_opcode (par_state, OP_TYPE);
     }
   else
     {
-      struct minimal_symbol *msymbol;
+      struct bound_minimal_symbol msymbol;
 
-      msymbol = lookup_minimal_symbol (tmp, NULL, NULL);
-      if (msymbol != NULL)
-       {
-         write_exp_msymbol (msymbol,
-                            lookup_function_type (builtin_type_int),
-                            builtin_type_int);
-       }
+      msymbol = lookup_bound_minimal_symbol (tmp);
+      if (msymbol.minsym != NULL)
+       write_exp_msymbol (par_state, msymbol);
       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);
     }
 
 }
@@ -1427,45 +1401,34 @@ push_expression_name (name)
    into a freshly malloc'ed struct expression.  Its language_defn is set
    to null.  */
 static struct expression *
-copy_exp (expr, endpos)
-     struct expression *expr;
-     int endpos;
+copy_exp (struct expression *expr, int endpos)
 {
   int len = length_of_subexp (expr, endpos);
-  struct expression *new
-    = (struct expression *) malloc (sizeof (*new) + EXP_ELEM_TO_BYTES (len));
-  new->nelts = len;
-  memcpy (new->elts, expr->elts + endpos - len, EXP_ELEM_TO_BYTES (len));
-  new->language_defn = 0;
+  struct expression *newobj
+    = (struct expression *) malloc (sizeof (*newobj) + EXP_ELEM_TO_BYTES (len));
+
+  newobj->nelts = len;
+  memcpy (newobj->elts, expr->elts + endpos - len, EXP_ELEM_TO_BYTES (len));
+  newobj->language_defn = 0;
 
-  return new;
+  return newobj;
 }
 
 /* Insert the expression NEW into the current expression (expout) at POS.  */
 static void
-insert_exp (pos, new)
-     int pos;
-     struct expression *new;
+insert_exp (struct parser_state *par_state, int pos, struct expression *newobj)
 {
-  int newlen = new->nelts;
+  int newlen = newobj->nelts;
+  int i;
 
   /* Grow expout if necessary.  In this function's only use at present,
      this should never be necessary.  */
-  if (expout_ptr + newlen > expout_size)
-    {
-      expout_size = max (expout_size * 2, expout_ptr + newlen + 10);
-      expout = (struct expression *)
-       realloc ((char *) expout, (sizeof (struct expression)
-                                   + EXP_ELEM_TO_BYTES (expout_size)));
-    }
-
-  {
-    int i;
+  increase_expout_size (par_state, newlen);
 
-    for (i = expout_ptr - 1; i >= pos; i--)
-      expout->elts[i + newlen] = expout->elts[i];
-  }
+  for (i = par_state->expout_ptr - 1; i >= pos; i--)
+    par_state->expout->elts[i + newlen] = par_state->expout->elts[i];
   
-  memcpy (expout->elts + pos, new->elts, EXP_ELEM_TO_BYTES (newlen));
-  expout_ptr += newlen;
+  memcpy (par_state->expout->elts + pos, newobj->elts,
+         EXP_ELEM_TO_BYTES (newlen));
+  par_state->expout_ptr += newlen;
 }
This page took 0.047214 seconds and 4 git commands to generate.