Remove dead code and "current" field from MI thread output doc
[deliverable/binutils-gdb.git] / gdb / p-exp.y
index 56e163faf65cc4dcb0b1374303fb1f5ebd4b742a..81eb2162589678c2205fbec94881610a38eeb756 100644 (file)
@@ -1,6 +1,5 @@
 /* YACC parser for Pascal expressions, for GDB.
 /* YACC parser for Pascal expressions, for GDB.
-   Copyright (C) 2000, 2006, 2007, 2008, 2009, 2010, 2011
-   Free Software Foundation, Inc.
+   Copyright (C) 2000-2017 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
    This file is part of GDB.
 
     - there are some problems with boolean types.
     - Pascal type hexadecimal constants are not supported
       because they conflict with the internal variables format.
     - there are some problems with boolean types.
     - Pascal type hexadecimal constants are not supported
       because they conflict with the internal variables format.
-   Probably also lots of other problems, less well defined PM */
+   Probably also lots of other problems, less well defined PM */
 %{
 
 #include "defs.h"
 %{
 
 #include "defs.h"
-#include "gdb_string.h"
 #include <ctype.h>
 #include "expression.h"
 #include "value.h"
 #include <ctype.h>
 #include "expression.h"
 #include "value.h"
 #include "p-lang.h"
 #include "bfd.h" /* Required by objfiles.h.  */
 #include "symfile.h" /* Required by objfiles.h.  */
 #include "p-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 */
+#include "objfiles.h" /* For have_full_symbols and have_partial_symbols */
 #include "block.h"
 #include "block.h"
+#include "completer.h"
 
 
-#define parse_type builtin_type (parse_gdbarch)
-
-/* 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 pascal_maxdepth
-#define        yyparse pascal_parse
-#define        yylex   pascal_lex
-#define        yyerror pascal_error
-#define        yylval  pascal_lval
-#define        yychar  pascal_char
-#define        yydebug pascal_debug
-#define        yypact  pascal_pact     
-#define        yyr1    pascal_r1                       
-#define        yyr2    pascal_r2                       
-#define        yydef   pascal_def              
-#define        yychk   pascal_chk              
-#define        yypgo   pascal_pgo              
-#define        yyact   pascal_act
-#define        yyexca  pascal_exca
-#define yyerrflag pascal_errflag
-#define yynerrs        pascal_nerrs
-#define        yyps    pascal_ps
-#define        yypv    pascal_pv
-#define        yys     pascal_s
-#define        yy_yys  pascal_yys
-#define        yystate pascal_state
-#define        yytmp   pascal_tmp
-#define        yyv     pascal_v
-#define        yy_yyv  pascal_yyv
-#define        yyval   pascal_val
-#define        yylloc  pascal_lloc
-#define yyreds pascal_reds             /* With YYDEBUG defined */
-#define yytoks pascal_toks             /* With YYDEBUG defined */
-#define yyname pascal_name             /* With YYDEBUG defined */
-#define yyrule pascal_rule             /* With YYDEBUG defined */
-#define yylhs  pascal_yylhs
-#define yylen  pascal_yylen
-#define yydefred pascal_yydefred
-#define yydgoto        pascal_yydgoto
-#define yysindex pascal_yysindex
-#define yyrindex pascal_yyrindex
-#define yygindex pascal_yygindex
-#define yytable         pascal_yytable
-#define yycheck         pascal_yycheck
-
-#ifndef YYDEBUG
-#define        YYDEBUG 1               /* Default to yydebug support */
-#endif
-
-#define YYFPRINTF parser_fprintf
+#define parse_type(ps) builtin_type (parse_gdbarch (ps))
+
+/* Remap normal yacc parser interface names (yyparse, yylex, yyerror,
+   etc).  */
+#define GDB_YY_REMAP_PREFIX pascal_
+#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);
 
 static int yylex (void);
 
 
 int yyparse (void);
 
 static int yylex (void);
 
-void
-yyerror (char *);
+void yyerror (const char *);
 
 
-static char * uptok (char *, int);
+static char *uptok (const char *, int);
 %}
 
 /* Although the yacc "value" of an expression is not used,
 %}
 
 /* Although the yacc "value" of an expression is not used,
@@ -144,7 +98,7 @@ static char * uptok (char *, int);
     struct ttype tsym;
     struct symtoken ssym;
     int voidval;
     struct ttype tsym;
     struct symtoken ssym;
     int voidval;
-    struct block *bval;
+    const struct block *bval;
     enum exp_opcode opcode;
     struct internalvar *ivar;
 
     enum exp_opcode opcode;
     struct internalvar *ivar;
 
@@ -154,10 +108,11 @@ static char * uptok (char *, int);
 
 %{
 /* YYSTYPE gets defined by %union */
 
 %{
 /* 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 *);
 
 static struct type *current_type;
 
 static struct type *current_type;
+static struct internalvar *intvar;
 static int leftdiv_is_integer;
 static void push_current_type (void);
 static void pop_current_type (void);
 static int leftdiv_is_integer;
 static void push_current_type (void);
 static void pop_current_type (void);
@@ -182,9 +137,10 @@ static int search_field;
    Contexts where this distinction is not important can use the
    nonterminal "name", which matches either NAME or TYPENAME.  */
 
    Contexts where this distinction is not important can use the
    nonterminal "name", which matches either NAME or TYPENAME.  */
 
-%token <sval> STRING 
+%token <sval> STRING
 %token <sval> FIELDNAME
 %token <sval> FIELDNAME
-%token <ssym> NAME /* BLOCKNAME defined below to give it higher precedence. */
+%token <voidval> COMPLETE
+%token <ssym> NAME /* BLOCKNAME defined below to give it higher precedence.  */
 %token <tsym> TYPENAME
 %type <sval> name
 %type <ssym> name_not_typename
 %token <tsym> TYPENAME
 %type <sval> name
 %type <ssym> name_not_typename
@@ -233,6 +189,7 @@ static int search_field;
 %%
 
 start   :      { current_type = NULL;
 %%
 
 start   :      { current_type = NULL;
+                 intvar = NULL;
                  search_field = 0;
                  leftdiv_is_integer = 0;
                }
                  search_field = 0;
                  leftdiv_is_integer = 0;
                }
@@ -245,82 +202,127 @@ normal_start     :
        ;
 
 type_exp:      type
        ;
 
 type_exp:      type
-                       { 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);
                          current_type = $1; } ;
 
 /* Expressions, including the comma operator.  */
 exp1   :       exp
        |       exp1 ',' exp
                          current_type = $1; } ;
 
 /* Expressions, including the comma operator.  */
 exp1   :       exp
        |       exp1 ',' exp
-                       { write_exp_elt_opcode (BINOP_COMMA); }
+                       { write_exp_elt_opcode (pstate, BINOP_COMMA); }
        ;
 
 /* Expressions, not including the comma operator.  */
 exp    :       exp '^'   %prec UNARY
        ;
 
 /* Expressions, not including the comma operator.  */
 exp    :       exp '^'   %prec UNARY
-                       { write_exp_elt_opcode (UNOP_IND);
-                         if (current_type) 
+                       { write_exp_elt_opcode (pstate, UNOP_IND);
+                         if (current_type)
                            current_type = TYPE_TARGET_TYPE (current_type); }
        ;
 
 exp    :       '@' exp    %prec UNARY
                            current_type = TYPE_TARGET_TYPE (current_type); }
        ;
 
 exp    :       '@' exp    %prec UNARY
-                       { write_exp_elt_opcode (UNOP_ADDR); 
+                       { write_exp_elt_opcode (pstate, UNOP_ADDR);
                          if (current_type)
                            current_type = TYPE_POINTER_TYPE (current_type); }
        ;
 
 exp    :       '-' exp    %prec UNARY
                          if (current_type)
                            current_type = TYPE_POINTER_TYPE (current_type); }
        ;
 
 exp    :       '-' exp    %prec UNARY
-                       { write_exp_elt_opcode (UNOP_NEG); }
+                       { write_exp_elt_opcode (pstate, UNOP_NEG); }
        ;
 
 exp    :       NOT exp    %prec UNARY
        ;
 
 exp    :       NOT exp    %prec UNARY
-                       { write_exp_elt_opcode (UNOP_LOGICAL_NOT); }
+                       { write_exp_elt_opcode (pstate, UNOP_LOGICAL_NOT); }
        ;
 
 exp    :       INCREMENT '(' exp ')'   %prec UNARY
        ;
 
 exp    :       INCREMENT '(' exp ')'   %prec UNARY
-                       { write_exp_elt_opcode (UNOP_PREINCREMENT); }
+                       { write_exp_elt_opcode (pstate, UNOP_PREINCREMENT); }
        ;
 
 exp    :       DECREMENT  '(' exp ')'   %prec UNARY
        ;
 
 exp    :       DECREMENT  '(' exp ')'   %prec UNARY
-                       { write_exp_elt_opcode (UNOP_PREDECREMENT); }
+                       { write_exp_elt_opcode (pstate, UNOP_PREDECREMENT); }
+       ;
+
+
+field_exp      :       exp '.' %prec UNARY
+                       { search_field = 1; }
        ;
 
        ;
 
-exp    :       exp '.' { search_field = 1; } 
-               FIELDNAME 
-               /* name */
-                       { write_exp_elt_opcode (STRUCTOP_STRUCT);
-                         write_exp_string ($4); 
-                         write_exp_elt_opcode (STRUCTOP_STRUCT);
-                         search_field = 0; 
+exp    :       field_exp FIELDNAME
+                       { write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
+                         write_exp_string (pstate, $2);
+                         write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
+                         search_field = 0;
                          if (current_type)
                          if (current_type)
-                           { while (TYPE_CODE (current_type) == TYPE_CODE_PTR)
-                               current_type = TYPE_TARGET_TYPE (current_type);
+                           {
+                             while (TYPE_CODE (current_type)
+                                    == TYPE_CODE_PTR)
+                               current_type =
+                                 TYPE_TARGET_TYPE (current_type);
                              current_type = lookup_struct_elt_type (
                              current_type = lookup_struct_elt_type (
-                               current_type, $4.ptr, 0); };
-                        } ; 
+                               current_type, $2.ptr, 0);
+                           }
+                        }
+       ;
+
+
+exp    :       field_exp name
+                       { write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
+                         write_exp_string (pstate, $2);
+                         write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
+                         search_field = 0;
+                         if (current_type)
+                           {
+                             while (TYPE_CODE (current_type)
+                                    == TYPE_CODE_PTR)
+                               current_type =
+                                 TYPE_TARGET_TYPE (current_type);
+                             current_type = lookup_struct_elt_type (
+                               current_type, $2.ptr, 0);
+                           }
+                       }
+       ;
+exp    :       field_exp  name COMPLETE
+                       { mark_struct_expression (pstate);
+                         write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
+                         write_exp_string (pstate, $2);
+                         write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); }
+       ;
+exp    :       field_exp COMPLETE
+                       { struct stoken s;
+                         mark_struct_expression (pstate);
+                         write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
+                         s.ptr = "";
+                         s.length = 0;
+                         write_exp_string (pstate, s);
+                         write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); }
+       ;
+
 exp    :       exp '['
 exp    :       exp '['
-                       /* We need to save the current_type value */
-                       { char *arrayname; 
+                       /* We need to save the current_type value */
+                       { const char *arrayname;
                          int arrayfieldindex;
                          arrayfieldindex = is_pascal_string_type (
                                current_type, NULL, NULL,
                          int arrayfieldindex;
                          arrayfieldindex = is_pascal_string_type (
                                current_type, NULL, NULL,
-                               NULL, NULL, &arrayname); 
-                         if (arrayfieldindex) 
+                               NULL, NULL, &arrayname);
+                         if (arrayfieldindex)
                            {
                              struct stoken stringsval;
                            {
                              struct stoken stringsval;
-                             stringsval.ptr = alloca (strlen (arrayname) + 1);
+                             char *buf;
+
+                             buf = (char *) alloca (strlen (arrayname) + 1);
+                             stringsval.ptr = buf;
                              stringsval.length = strlen (arrayname);
                              stringsval.length = strlen (arrayname);
-                             strcpy (stringsval.ptr, arrayname);
+                             strcpy (buf, arrayname);
                              current_type = TYPE_FIELD_TYPE (current_type,
                              current_type = TYPE_FIELD_TYPE (current_type,
-                               arrayfieldindex - 1); 
-                             write_exp_elt_opcode (STRUCTOP_STRUCT);
-                             write_exp_string (stringsval); 
-                             write_exp_elt_opcode (STRUCTOP_STRUCT);
+                               arrayfieldindex - 1);
+                             write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
+                             write_exp_string (pstate, stringsval);
+                             write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
                            }
                          push_current_type ();  }
                exp1 ']'
                        { pop_current_type ();
                            }
                          push_current_type ();  }
                exp1 ']'
                        { pop_current_type ();
-                         write_exp_elt_opcode (BINOP_SUBSCRIPT);
+                         write_exp_elt_opcode (pstate, BINOP_SUBSCRIPT);
                          if (current_type)
                            current_type = TYPE_TARGET_TYPE (current_type); }
        ;
                          if (current_type)
                            current_type = TYPE_TARGET_TYPE (current_type); }
        ;
@@ -331,9 +333,10 @@ exp        :       exp '('
                        { push_current_type ();
                          start_arglist (); }
                arglist ')'     %prec ARROW
                        { push_current_type ();
                          start_arglist (); }
                arglist ')'     %prec ARROW
-                       { write_exp_elt_opcode (OP_FUNCALL);
-                         write_exp_elt_longcst ((LONGEST) end_arglist ());
-                         write_exp_elt_opcode (OP_FUNCALL); 
+                       { write_exp_elt_opcode (pstate, OP_FUNCALL);
+                         write_exp_elt_longcst (pstate,
+                                                (LONGEST) end_arglist ());
+                         write_exp_elt_opcode (pstate, OP_FUNCALL);
                          pop_current_type ();
                          if (current_type)
                            current_type = TYPE_TARGET_TYPE (current_type);
                          pop_current_type ();
                          if (current_type)
                            current_type = TYPE_TARGET_TYPE (current_type);
@@ -352,13 +355,13 @@ exp       :       type '(' exp ')' %prec UNARY
                            {
                              /* Allow automatic dereference of classes.  */
                              if ((TYPE_CODE (current_type) == TYPE_CODE_PTR)
                            {
                              /* Allow automatic dereference of classes.  */
                              if ((TYPE_CODE (current_type) == TYPE_CODE_PTR)
-                                 && (TYPE_CODE (TYPE_TARGET_TYPE (current_type)) == TYPE_CODE_CLASS)
-                                 && (TYPE_CODE ($1) == TYPE_CODE_CLASS))
-                               write_exp_elt_opcode (UNOP_IND);
+                                 && (TYPE_CODE (TYPE_TARGET_TYPE (current_type)) == TYPE_CODE_STRUCT)
+                                 && (TYPE_CODE ($1) == TYPE_CODE_STRUCT))
+                               write_exp_elt_opcode (pstate, UNOP_IND);
                            }
                            }
-                         write_exp_elt_opcode (UNOP_CAST);
-                         write_exp_elt_type ($1);
-                         write_exp_elt_opcode (UNOP_CAST); 
+                         write_exp_elt_opcode (pstate, UNOP_CAST);
+                         write_exp_elt_type (pstate, $1);
+                         write_exp_elt_opcode (pstate, UNOP_CAST);
                          current_type = $1; }
        ;
 
                          current_type = $1; }
        ;
 
@@ -369,198 +372,226 @@ exp     :       '(' exp1 ')'
 /* Binary operators in order of decreasing precedence.  */
 
 exp    :       exp '*' exp
 /* Binary operators in order of decreasing precedence.  */
 
 exp    :       exp '*' exp
-                       { write_exp_elt_opcode (BINOP_MUL); }
+                       { write_exp_elt_opcode (pstate, BINOP_MUL); }
        ;
 
 exp    :       exp '/' {
                          if (current_type && is_integral_type (current_type))
                            leftdiv_is_integer = 1;
        ;
 
 exp    :       exp '/' {
                          if (current_type && is_integral_type (current_type))
                            leftdiv_is_integer = 1;
-                       } 
+                       }
                exp
                exp
-                       { 
+                       {
                          if (leftdiv_is_integer && current_type
                              && is_integral_type (current_type))
                            {
                          if (leftdiv_is_integer && current_type
                              && is_integral_type (current_type))
                            {
-                             write_exp_elt_opcode (UNOP_CAST);
-                             write_exp_elt_type (parse_type->builtin_long_double);
-                             current_type = parse_type->builtin_long_double;
-                             write_exp_elt_opcode (UNOP_CAST);
+                             write_exp_elt_opcode (pstate, UNOP_CAST);
+                             write_exp_elt_type (pstate,
+                                                 parse_type (pstate)
+                                                 ->builtin_long_double);
+                             current_type
+                               = parse_type (pstate)->builtin_long_double;
+                             write_exp_elt_opcode (pstate, UNOP_CAST);
                              leftdiv_is_integer = 0;
                            }
 
                              leftdiv_is_integer = 0;
                            }
 
-                         write_exp_elt_opcode (BINOP_DIV); 
+                         write_exp_elt_opcode (pstate, BINOP_DIV);
                        }
        ;
 
 exp    :       exp DIV exp
                        }
        ;
 
 exp    :       exp DIV exp
-                       { write_exp_elt_opcode (BINOP_INTDIV); }
+                       { write_exp_elt_opcode (pstate, BINOP_INTDIV); }
        ;
 
 exp    :       exp MOD exp
        ;
 
 exp    :       exp MOD exp
-                       { write_exp_elt_opcode (BINOP_REM); }
+                       { write_exp_elt_opcode (pstate, BINOP_REM); }
        ;
 
 exp    :       exp '+' exp
        ;
 
 exp    :       exp '+' exp
-                       { write_exp_elt_opcode (BINOP_ADD); }
+                       { write_exp_elt_opcode (pstate, BINOP_ADD); }
        ;
 
 exp    :       exp '-' exp
        ;
 
 exp    :       exp '-' exp
-                       { write_exp_elt_opcode (BINOP_SUB); }
+                       { write_exp_elt_opcode (pstate, BINOP_SUB); }
        ;
 
 exp    :       exp LSH exp
        ;
 
 exp    :       exp LSH exp
-                       { write_exp_elt_opcode (BINOP_LSH); }
+                       { write_exp_elt_opcode (pstate, BINOP_LSH); }
        ;
 
 exp    :       exp RSH exp
        ;
 
 exp    :       exp RSH exp
-                       { write_exp_elt_opcode (BINOP_RSH); }
+                       { write_exp_elt_opcode (pstate, BINOP_RSH); }
        ;
 
 exp    :       exp '=' exp
        ;
 
 exp    :       exp '=' exp
-                       { write_exp_elt_opcode (BINOP_EQUAL); 
-                         current_type = parse_type->builtin_bool;
+                       { write_exp_elt_opcode (pstate, BINOP_EQUAL);
+                         current_type = parse_type (pstate)->builtin_bool;
                        }
        ;
 
 exp    :       exp NOTEQUAL exp
                        }
        ;
 
 exp    :       exp NOTEQUAL exp
-                       { write_exp_elt_opcode (BINOP_NOTEQUAL); 
-                         current_type = parse_type->builtin_bool;
+                       { write_exp_elt_opcode (pstate, BINOP_NOTEQUAL);
+                         current_type = parse_type (pstate)->builtin_bool;
                        }
        ;
 
 exp    :       exp LEQ exp
                        }
        ;
 
 exp    :       exp LEQ exp
-                       { write_exp_elt_opcode (BINOP_LEQ); 
-                         current_type = parse_type->builtin_bool;
+                       { write_exp_elt_opcode (pstate, BINOP_LEQ);
+                         current_type = parse_type (pstate)->builtin_bool;
                        }
        ;
 
 exp    :       exp GEQ exp
                        }
        ;
 
 exp    :       exp GEQ exp
-                       { write_exp_elt_opcode (BINOP_GEQ); 
-                         current_type = parse_type->builtin_bool;
+                       { write_exp_elt_opcode (pstate, BINOP_GEQ);
+                         current_type = parse_type (pstate)->builtin_bool;
                        }
        ;
 
 exp    :       exp '<' exp
                        }
        ;
 
 exp    :       exp '<' exp
-                       { write_exp_elt_opcode (BINOP_LESS); 
-                         current_type = parse_type->builtin_bool;
+                       { write_exp_elt_opcode (pstate, BINOP_LESS);
+                         current_type = parse_type (pstate)->builtin_bool;
                        }
        ;
 
 exp    :       exp '>' exp
                        }
        ;
 
 exp    :       exp '>' exp
-                       { write_exp_elt_opcode (BINOP_GTR); 
-                         current_type = parse_type->builtin_bool;
+                       { write_exp_elt_opcode (pstate, BINOP_GTR);
+                         current_type = parse_type (pstate)->builtin_bool;
                        }
        ;
 
 exp    :       exp ANDAND exp
                        }
        ;
 
 exp    :       exp ANDAND exp
-                       { write_exp_elt_opcode (BINOP_BITWISE_AND); }
+                       { write_exp_elt_opcode (pstate, BINOP_BITWISE_AND); }
        ;
 
 exp    :       exp XOR exp
        ;
 
 exp    :       exp XOR exp
-                       { write_exp_elt_opcode (BINOP_BITWISE_XOR); }
+                       { write_exp_elt_opcode (pstate, BINOP_BITWISE_XOR); }
        ;
 
 exp    :       exp OR exp
        ;
 
 exp    :       exp OR exp
-                       { write_exp_elt_opcode (BINOP_BITWISE_IOR); }
+                       { write_exp_elt_opcode (pstate, BINOP_BITWISE_IOR); }
        ;
 
 exp    :       exp ASSIGN exp
        ;
 
 exp    :       exp ASSIGN exp
-                       { write_exp_elt_opcode (BINOP_ASSIGN); }
+                       { write_exp_elt_opcode (pstate, BINOP_ASSIGN); }
        ;
 
 exp    :       TRUEKEYWORD
        ;
 
 exp    :       TRUEKEYWORD
-                       { write_exp_elt_opcode (OP_BOOL);
-                         write_exp_elt_longcst ((LONGEST) $1);
-                         current_type = parse_type->builtin_bool;
-                         write_exp_elt_opcode (OP_BOOL); }
+                       { write_exp_elt_opcode (pstate, OP_BOOL);
+                         write_exp_elt_longcst (pstate, (LONGEST) $1);
+                         current_type = parse_type (pstate)->builtin_bool;
+                         write_exp_elt_opcode (pstate, OP_BOOL); }
        ;
 
 exp    :       FALSEKEYWORD
        ;
 
 exp    :       FALSEKEYWORD
-                       { write_exp_elt_opcode (OP_BOOL);
-                         write_exp_elt_longcst ((LONGEST) $1);
-                         current_type = parse_type->builtin_bool;
-                         write_exp_elt_opcode (OP_BOOL); }
+                       { write_exp_elt_opcode (pstate, OP_BOOL);
+                         write_exp_elt_longcst (pstate, (LONGEST) $1);
+                         current_type = parse_type (pstate)->builtin_bool;
+                         write_exp_elt_opcode (pstate, OP_BOOL); }
        ;
 
 exp    :       INT
        ;
 
 exp    :       INT
-                       { write_exp_elt_opcode (OP_LONG);
-                         write_exp_elt_type ($1.type);
+                       { write_exp_elt_opcode (pstate, OP_LONG);
+                         write_exp_elt_type (pstate, $1.type);
                          current_type = $1.type;
                          current_type = $1.type;
-                         write_exp_elt_longcst ((LONGEST)($1.val));
-                         write_exp_elt_opcode (OP_LONG); }
+                         write_exp_elt_longcst (pstate, (LONGEST)($1.val));
+                         write_exp_elt_opcode (pstate, OP_LONG); }
        ;
 
 exp    :       NAME_OR_INT
                        { YYSTYPE val;
        ;
 
 exp    :       NAME_OR_INT
                        { YYSTYPE val;
-                         parse_number ($1.stoken.ptr, $1.stoken.length, 0, &val);
-                         write_exp_elt_opcode (OP_LONG);
-                         write_exp_elt_type (val.typed_val_int.type);
+                         parse_number (pstate, $1.stoken.ptr,
+                                       $1.stoken.length, 0, &val);
+                         write_exp_elt_opcode (pstate, OP_LONG);
+                         write_exp_elt_type (pstate, val.typed_val_int.type);
                          current_type = val.typed_val_int.type;
                          current_type = val.typed_val_int.type;
-                         write_exp_elt_longcst ((LONGEST)val.typed_val_int.val);
-                         write_exp_elt_opcode (OP_LONG);
+                         write_exp_elt_longcst (pstate, (LONGEST)
+                                                val.typed_val_int.val);
+                         write_exp_elt_opcode (pstate, OP_LONG);
                        }
        ;
 
 
 exp    :       FLOAT
                        }
        ;
 
 
 exp    :       FLOAT
-                       { write_exp_elt_opcode (OP_DOUBLE);
-                         write_exp_elt_type ($1.type);
+                       { write_exp_elt_opcode (pstate, OP_DOUBLE);
+                         write_exp_elt_type (pstate, $1.type);
                          current_type = $1.type;
                          current_type = $1.type;
-                         write_exp_elt_dblcst ($1.dval);
-                         write_exp_elt_opcode (OP_DOUBLE); }
+                         write_exp_elt_dblcst (pstate, $1.dval);
+                         write_exp_elt_opcode (pstate, OP_DOUBLE); }
        ;
 
 exp    :       variable
        ;
 
 exp    :       VARIABLE
        ;
 
 exp    :       variable
        ;
 
 exp    :       VARIABLE
-                       /* Already written by write_dollar_variable. */
-       ;
+                       /* Already written by write_dollar_variable.
+                          Handle current_type.  */
+                       {  if (intvar) {
+                            struct value * val, * mark;
+
+                            mark = value_mark ();
+                            val = value_of_internalvar (parse_gdbarch (pstate),
+                                                        intvar);
+                            current_type = value_type (val);
+                            value_release_to_mark (mark);
+                          }
+                       }
+       ;
 
 exp    :       SIZEOF '(' type ')'     %prec UNARY
 
 exp    :       SIZEOF '(' type ')'     %prec UNARY
-                       { write_exp_elt_opcode (OP_LONG);
-                         write_exp_elt_type (parse_type->builtin_int);
-                         CHECK_TYPEDEF ($3);
-                         write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3));
-                         write_exp_elt_opcode (OP_LONG); }
+                       { write_exp_elt_opcode (pstate, OP_LONG);
+                         write_exp_elt_type (pstate,
+                                           parse_type (pstate)->builtin_int);
+                         current_type = parse_type (pstate)->builtin_int;
+                         $3 = check_typedef ($3);
+                         write_exp_elt_longcst (pstate,
+                                                (LONGEST) TYPE_LENGTH ($3));
+                         write_exp_elt_opcode (pstate, OP_LONG); }
        ;
 
 exp    :       SIZEOF  '(' exp ')'      %prec UNARY
        ;
 
 exp    :       SIZEOF  '(' exp ')'      %prec UNARY
-                       { write_exp_elt_opcode (UNOP_SIZEOF); }
-       
+                       { write_exp_elt_opcode (pstate, UNOP_SIZEOF);
+                         current_type = parse_type (pstate)->builtin_int; }
+
 exp    :       STRING
                        { /* C strings are converted into array constants with
                             an explicit null byte added at the end.  Thus
                             the array upper bound is the string length.
                             There is no such thing in C as a completely empty
 exp    :       STRING
                        { /* C strings are converted into array constants with
                             an explicit null byte added at the end.  Thus
                             the array upper bound is the string length.
                             There is no such thing in C as a completely empty
-                            string. */
-                         char *sp = $1.ptr; int count = $1.length;
+                            string.  */
+                         const char *sp = $1.ptr; int count = $1.length;
+
                          while (count-- > 0)
                            {
                          while (count-- > 0)
                            {
-                             write_exp_elt_opcode (OP_LONG);
-                             write_exp_elt_type (parse_type->builtin_char);
-                             write_exp_elt_longcst ((LONGEST)(*sp++));
-                             write_exp_elt_opcode (OP_LONG);
+                             write_exp_elt_opcode (pstate, OP_LONG);
+                             write_exp_elt_type (pstate,
+                                                 parse_type (pstate)
+                                                 ->builtin_char);
+                             write_exp_elt_longcst (pstate,
+                                                    (LONGEST) (*sp++));
+                             write_exp_elt_opcode (pstate, OP_LONG);
                            }
                            }
-                         write_exp_elt_opcode (OP_LONG);
-                         write_exp_elt_type (parse_type->builtin_char);
-                         write_exp_elt_longcst ((LONGEST)'\0');
-                         write_exp_elt_opcode (OP_LONG);
-                         write_exp_elt_opcode (OP_ARRAY);
-                         write_exp_elt_longcst ((LONGEST) 0);
-                         write_exp_elt_longcst ((LONGEST) ($1.length));
-                         write_exp_elt_opcode (OP_ARRAY); }
+                         write_exp_elt_opcode (pstate, OP_LONG);
+                         write_exp_elt_type (pstate,
+                                             parse_type (pstate)
+                                             ->builtin_char);
+                         write_exp_elt_longcst (pstate, (LONGEST)'\0');
+                         write_exp_elt_opcode (pstate, OP_LONG);
+                         write_exp_elt_opcode (pstate, OP_ARRAY);
+                         write_exp_elt_longcst (pstate, (LONGEST) 0);
+                         write_exp_elt_longcst (pstate,
+                                                (LONGEST) ($1.length));
+                         write_exp_elt_opcode (pstate, OP_ARRAY); }
        ;
 
 /* Object pascal  */
 exp    :       THIS
        ;
 
 /* Object pascal  */
 exp    :       THIS
-                       { 
+                       {
                          struct value * this_val;
                          struct type * this_type;
                          struct value * this_val;
                          struct type * this_type;
-                         write_exp_elt_opcode (OP_THIS);
-                         write_exp_elt_opcode (OP_THIS); 
-                         /* we need type of this */
-                         this_val = value_of_this (0); 
+                         write_exp_elt_opcode (pstate, OP_THIS);
+                         write_exp_elt_opcode (pstate, OP_THIS);
+                         /* We need type of this.  */
+                         this_val
+                           = value_of_this_silent (parse_language (pstate));
                          if (this_val)
                            this_type = value_type (this_val);
                          else
                          if (this_val)
                            this_type = value_type (this_val);
                          else
@@ -570,10 +601,10 @@ exp       :       THIS
                              if (TYPE_CODE (this_type) == TYPE_CODE_PTR)
                                {
                                  this_type = TYPE_TARGET_TYPE (this_type);
                              if (TYPE_CODE (this_type) == TYPE_CODE_PTR)
                                {
                                  this_type = TYPE_TARGET_TYPE (this_type);
-                                 write_exp_elt_opcode (UNOP_IND);
+                                 write_exp_elt_opcode (pstate, UNOP_IND);
                                }
                            }
                                }
                            }
-               
+
                          current_type = this_type;
                        }
        ;
                          current_type = this_type;
                        }
        ;
@@ -582,16 +613,17 @@ exp       :       THIS
 
 block  :       BLOCKNAME
                        {
 
 block  :       BLOCKNAME
                        {
-                         if ($1.sym != 0)
-                             $$ = SYMBOL_BLOCK_VALUE ($1.sym);
+                         if ($1.sym.symbol != 0)
+                             $$ = SYMBOL_BLOCK_VALUE ($1.sym.symbol);
                          else
                            {
                              struct symtab *tem =
                                  lookup_symtab (copy_name ($1.stoken));
                              if (tem)
                          else
                            {
                              struct symtab *tem =
                                  lookup_symtab (copy_name ($1.stoken));
                              if (tem)
-                               $$ = BLOCKVECTOR_BLOCK (BLOCKVECTOR (tem), STATIC_BLOCK);
+                               $$ = BLOCKVECTOR_BLOCK (SYMTAB_BLOCKVECTOR (tem),
+                                                       STATIC_BLOCK);
                              else
                              else
-                               error ("No file or function \"%s\".",
+                               error (_("No file or function \"%s\"."),
                                       copy_name ($1.stoken));
                            }
                        }
                                       copy_name ($1.stoken));
                            }
                        }
@@ -600,40 +632,42 @@ block     :       BLOCKNAME
 block  :       block COLONCOLON name
                        { struct symbol *tem
                            = lookup_symbol (copy_name ($3), $1,
 block  :       block COLONCOLON name
                        { struct symbol *tem
                            = lookup_symbol (copy_name ($3), $1,
-                                            VAR_DOMAIN, (int *) NULL);
+                                            VAR_DOMAIN, NULL).symbol;
+
                          if (!tem || SYMBOL_CLASS (tem) != LOC_BLOCK)
                          if (!tem || SYMBOL_CLASS (tem) != LOC_BLOCK)
-                           error ("No function \"%s\" in specified context.",
+                           error (_("No function \"%s\" in specified context."),
                                   copy_name ($3));
                          $$ = SYMBOL_BLOCK_VALUE (tem); }
        ;
 
 variable:      block COLONCOLON name
                                   copy_name ($3));
                          $$ = SYMBOL_BLOCK_VALUE (tem); }
        ;
 
 variable:      block COLONCOLON name
-                       { struct symbol *sym;
+                       { struct block_symbol sym;
+
                          sym = lookup_symbol (copy_name ($3), $1,
                          sym = lookup_symbol (copy_name ($3), $1,
-                                              VAR_DOMAIN, (int *) NULL);
-                         if (sym == 0)
-                           error ("No symbol \"%s\" in specified context.",
+                                              VAR_DOMAIN, NULL);
+                         if (sym.symbol == 0)
+                           error (_("No symbol \"%s\" in specified context."),
                                   copy_name ($3));
 
                                   copy_name ($3));
 
-                         write_exp_elt_opcode (OP_VAR_VALUE);
-                         /* block_found is set by lookup_symbol.  */
-                         write_exp_elt_block (block_found);
-                         write_exp_elt_sym (sym);
-                         write_exp_elt_opcode (OP_VAR_VALUE); }
+                         write_exp_elt_opcode (pstate, OP_VAR_VALUE);
+                         write_exp_elt_block (pstate, sym.block);
+                         write_exp_elt_sym (pstate, sym.symbol);
+                         write_exp_elt_opcode (pstate, OP_VAR_VALUE); }
        ;
 
 qualified_name:        typebase COLONCOLON name
                        {
                          struct type *type = $1;
        ;
 
 qualified_name:        typebase COLONCOLON name
                        {
                          struct type *type = $1;
+
                          if (TYPE_CODE (type) != TYPE_CODE_STRUCT
                              && TYPE_CODE (type) != TYPE_CODE_UNION)
                          if (TYPE_CODE (type) != TYPE_CODE_STRUCT
                              && TYPE_CODE (type) != TYPE_CODE_UNION)
-                           error ("`%s' is not defined as an aggregate type.",
+                           error (_("`%s' is not defined as an aggregate type."),
                                   TYPE_NAME (type));
 
                                   TYPE_NAME (type));
 
-                         write_exp_elt_opcode (OP_SCOPE);
-                         write_exp_elt_type (type);
-                         write_exp_string ($3);
-                         write_exp_elt_opcode (OP_SCOPE);
+                         write_exp_elt_opcode (pstate, OP_SCOPE);
+                         write_exp_elt_type (pstate, type);
+                         write_exp_string (pstate, $3);
+                         write_exp_elt_opcode (pstate, OP_SCOPE);
                        }
        ;
 
                        }
        ;
 
@@ -642,51 +676,51 @@ variable: qualified_name
                        {
                          char *name = copy_name ($2);
                          struct symbol *sym;
                        {
                          char *name = copy_name ($2);
                          struct symbol *sym;
-                         struct minimal_symbol *msymbol;
+                         struct bound_minimal_symbol msymbol;
 
                          sym =
                            lookup_symbol (name, (const struct block *) NULL,
 
                          sym =
                            lookup_symbol (name, (const struct block *) NULL,
-                                          VAR_DOMAIN, (int *) NULL);
+                                          VAR_DOMAIN, NULL).symbol;
                          if (sym)
                            {
                          if (sym)
                            {
-                             write_exp_elt_opcode (OP_VAR_VALUE);
-                             write_exp_elt_block (NULL);
-                             write_exp_elt_sym (sym);
-                             write_exp_elt_opcode (OP_VAR_VALUE);
+                             write_exp_elt_opcode (pstate, OP_VAR_VALUE);
+                             write_exp_elt_block (pstate, NULL);
+                             write_exp_elt_sym (pstate, sym);
+                             write_exp_elt_opcode (pstate, OP_VAR_VALUE);
                              break;
                            }
 
                              break;
                            }
 
-                         msymbol = lookup_minimal_symbol (name, NULL, NULL);
-                         if (msymbol != NULL)
-                           write_exp_msymbol (msymbol);
-                         else if (!have_full_symbols () && !have_partial_symbols ())
-                           error ("No symbol table is loaded.  Use the \"file\" command.");
+                         msymbol = lookup_bound_minimal_symbol (name);
+                         if (msymbol.minsym != NULL)
+                           write_exp_msymbol (pstate, msymbol);
+                         else if (!have_full_symbols ()
+                                  && !have_partial_symbols ())
+                           error (_("No symbol table is loaded.  "
+                                  "Use the \"file\" command."));
                          else
                          else
-                           error ("No symbol \"%s\" in current context.", name);
+                           error (_("No symbol \"%s\" in current context."),
+                                  name);
                        }
        ;
 
 variable:      name_not_typename
                        }
        ;
 
 variable:      name_not_typename
-                       { struct symbol *sym = $1.sym;
+                       { struct block_symbol sym = $1.sym;
 
 
-                         if (sym)
+                         if (sym.symbol)
                            {
                            {
-                             if (symbol_read_needs_frame (sym))
+                             if (symbol_read_needs_frame (sym.symbol))
                                {
                                  if (innermost_block == 0
                                {
                                  if (innermost_block == 0
-                                     || contained_in (block_found,
+                                     || contained_in (sym.block,
                                                       innermost_block))
                                                       innermost_block))
-                                   innermost_block = block_found;
+                                   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);
-                             current_type = sym->type; }
+                             write_exp_elt_opcode (pstate, OP_VAR_VALUE);
+                             write_exp_elt_block (pstate, sym.block);
+                             write_exp_elt_sym (pstate, sym.symbol);
+                             write_exp_elt_opcode (pstate, OP_VAR_VALUE);
+                             current_type = sym.symbol->type; }
                          else if ($1.is_a_field_of_this)
                            {
                              struct value * this_val;
                          else if ($1.is_a_field_of_this)
                            {
                              struct value * this_val;
@@ -695,16 +729,17 @@ variable: name_not_typename
                                 not inadvertently convert from a method call
                                 to data ref.  */
                              if (innermost_block == 0
                                 not inadvertently convert from a method call
                                 to data ref.  */
                              if (innermost_block == 0
-                                 || contained_in (block_found,
+                                 || contained_in (sym.block,
                                                   innermost_block))
                                                   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 ($1.stoken);
-                             write_exp_elt_opcode (STRUCTOP_PTR);
-                             /* we need type of this */
-                             this_val = value_of_this (0); 
+                               innermost_block = sym.block;
+                             write_exp_elt_opcode (pstate, OP_THIS);
+                             write_exp_elt_opcode (pstate, OP_THIS);
+                             write_exp_elt_opcode (pstate, STRUCTOP_PTR);
+                             write_exp_string (pstate, $1.stoken);
+                             write_exp_elt_opcode (pstate, STRUCTOP_PTR);
+                             /* We need type of this.  */
+                             this_val
+                               = value_of_this_silent (parse_language (pstate));
                              if (this_val)
                                this_type = value_type (this_val);
                              else
                              if (this_val)
                                this_type = value_type (this_val);
                              else
@@ -714,21 +749,23 @@ variable: name_not_typename
                                  this_type,
                                  copy_name ($1.stoken), 0);
                              else
                                  this_type,
                                  copy_name ($1.stoken), 0);
                              else
-                               current_type = NULL; 
+                               current_type = NULL;
                            }
                          else
                            {
                            }
                          else
                            {
-                             struct minimal_symbol *msymbol;
+                             struct bound_minimal_symbol msymbol;
                              char *arg = copy_name ($1.stoken);
 
                              msymbol =
                              char *arg = copy_name ($1.stoken);
 
                              msymbol =
-                               lookup_minimal_symbol (arg, NULL, NULL);
-                             if (msymbol != NULL)
-                               write_exp_msymbol (msymbol);
-                             else if (!have_full_symbols () && !have_partial_symbols ())
-                               error ("No symbol table is loaded.  Use the \"file\" command.");
+                               lookup_bound_minimal_symbol (arg);
+                             if (msymbol.minsym != NULL)
+                               write_exp_msymbol (pstate, msymbol);
+                             else if (!have_full_symbols ()
+                                      && !have_partial_symbols ())
+                               error (_("No symbol table is loaded.  "
+                                      "Use the \"file\" command."));
                              else
                              else
-                               error ("No symbol \"%s\" in current context.",
+                               error (_("No symbol \"%s\" in current context."),
                                       copy_name ($1.stoken));
                            }
                        }
                                       copy_name ($1.stoken));
                            }
                        }
@@ -791,7 +828,8 @@ name_not_typename : NAME
 /*** Needs some error checking for the float case ***/
 
 static int
 /*** Needs some error checking for the float case ***/
 
 static int
-parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
+parse_number (struct parser_state *par_state,
+             const char *p, int len, int parsed_float, YYSTYPE *putithere)
 {
   /* FIXME: Shouldn't these be unsigned?  We don't deal with negative values
      here, and we do kind of silly things like cast to unsigned.  */
 {
   /* FIXME: Shouldn't these be unsigned?  We don't deal with negative values
      here, and we do kind of silly things like cast to unsigned.  */
@@ -816,14 +854,14 @@ parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
 
   if (parsed_float)
     {
 
   if (parsed_float)
     {
-      if (! parse_c_float (parse_gdbarch, p, len,
+      if (! parse_c_float (parse_gdbarch (par_state), p, len,
                           &putithere->typed_val_float.dval,
                           &putithere->typed_val_float.type))
        return ERROR;
       return FLOAT;
     }
 
                           &putithere->typed_val_float.dval,
                           &putithere->typed_val_float.type))
        return ERROR;
       return FLOAT;
     }
 
-  /* Handle base-switching prefixes 0x, 0t, 0d, 0 */
+  /* Handle base-switching prefixes 0x, 0t, 0d, 0 */
   if (p[0] == '0')
     switch (p[1])
       {
   if (p[0] == '0')
     switch (p[1])
       {
@@ -889,21 +927,21 @@ parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
            return ERROR;       /* Char not a digit */
        }
       if (i >= base)
            return ERROR;       /* Char not a digit */
        }
       if (i >= base)
-       return ERROR;           /* Invalid digit in this base */
+       return ERROR;           /* Invalid digit in this base */
 
       /* Portably test for overflow (only works for nonzero values, so make
         a second check for zero).  FIXME: Can't we just make n and prevn
         unsigned and avoid this?  */
       if (c != 'l' && c != 'u' && (prevn >= n) && n != 0)
 
       /* Portably test for overflow (only works for nonzero values, so make
         a second check for zero).  FIXME: Can't we just make n and prevn
         unsigned and avoid this?  */
       if (c != 'l' && c != 'u' && (prevn >= n) && n != 0)
-       unsigned_p = 1;         /* Try something unsigned */
+       unsigned_p = 1;         /* Try something unsigned */
 
       /* Portably test for unsigned overflow.
         FIXME: This check is wrong; for example it doesn't find overflow
         on 0x123456789 when LONGEST is 32 bits.  */
       if (c != 'l' && c != 'u' && n != 0)
 
       /* Portably test for unsigned overflow.
         FIXME: This check is wrong; for example it doesn't find overflow
         on 0x123456789 when LONGEST is 32 bits.  */
       if (c != 'l' && c != 'u' && n != 0)
-       {       
+       {
          if ((unsigned_p && (ULONGEST) prevn >= (ULONGEST) n))
          if ((unsigned_p && (ULONGEST) prevn >= (ULONGEST) n))
-           error ("Numeric constant too large.");
+           error (_("Numeric constant too large."));
        }
       prevn = n;
     }
        }
       prevn = n;
     }
@@ -922,9 +960,10 @@ parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
 
   un = (ULONGEST)n >> 2;
   if (long_p == 0
 
   un = (ULONGEST)n >> 2;
   if (long_p == 0
-      && (un >> (gdbarch_int_bit (parse_gdbarch) - 2)) == 0)
+      && (un >> (gdbarch_int_bit (parse_gdbarch (par_state)) - 2)) == 0)
     {
     {
-      high_bit = ((ULONGEST)1) << (gdbarch_int_bit (parse_gdbarch) - 1);
+      high_bit
+       = ((ULONGEST)1) << (gdbarch_int_bit (parse_gdbarch (par_state)) - 1);
 
       /* A large decimal (not hex or octal) constant (between INT_MAX
         and UINT_MAX) is a long or unsigned long, according to ANSI,
 
       /* A large decimal (not hex or octal) constant (between INT_MAX
         and UINT_MAX) is a long or unsigned long, according to ANSI,
@@ -932,34 +971,35 @@ parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
         int.  This probably should be fixed.  GCC gives a warning on
         such constants.  */
 
         int.  This probably should be fixed.  GCC gives a warning on
         such constants.  */
 
-      unsigned_type = parse_type->builtin_unsigned_int;
-      signed_type = parse_type->builtin_int;
+      unsigned_type = parse_type (par_state)->builtin_unsigned_int;
+      signed_type = parse_type (par_state)->builtin_int;
     }
   else if (long_p <= 1
     }
   else if (long_p <= 1
-          && (un >> (gdbarch_long_bit (parse_gdbarch) - 2)) == 0)
+          && (un >> (gdbarch_long_bit (parse_gdbarch (par_state)) - 2)) == 0)
     {
     {
-      high_bit = ((ULONGEST)1) << (gdbarch_long_bit (parse_gdbarch) - 1);
-      unsigned_type = parse_type->builtin_unsigned_long;
-      signed_type = parse_type->builtin_long;
+      high_bit
+       = ((ULONGEST)1) << (gdbarch_long_bit (parse_gdbarch (par_state)) - 1);
+      unsigned_type = parse_type (par_state)->builtin_unsigned_long;
+      signed_type = parse_type (par_state)->builtin_long;
     }
   else
     {
       int shift;
       if (sizeof (ULONGEST) * HOST_CHAR_BIT
     }
   else
     {
       int shift;
       if (sizeof (ULONGEST) * HOST_CHAR_BIT
-         < gdbarch_long_long_bit (parse_gdbarch))
+         < gdbarch_long_long_bit (parse_gdbarch (par_state)))
        /* A long long does not fit in a LONGEST.  */
        shift = (sizeof (ULONGEST) * HOST_CHAR_BIT - 1);
       else
        /* A long long does not fit in a LONGEST.  */
        shift = (sizeof (ULONGEST) * HOST_CHAR_BIT - 1);
       else
-       shift = (gdbarch_long_long_bit (parse_gdbarch) - 1);
+       shift = (gdbarch_long_long_bit (parse_gdbarch (par_state)) - 1);
       high_bit = (ULONGEST) 1 << shift;
       high_bit = (ULONGEST) 1 << shift;
-      unsigned_type = parse_type->builtin_unsigned_long_long;
-      signed_type = parse_type->builtin_long_long;
+      unsigned_type = parse_type (par_state)->builtin_unsigned_long_long;
+      signed_type = parse_type (par_state)->builtin_long_long;
     }
 
    putithere->typed_val_int.val = n;
 
    /* If the high bit of the worked out type is set then this number
     }
 
    putithere->typed_val_int.val = n;
 
    /* If the high bit of the worked out type is set then this number
-      has to be unsigned. */
+      has to be unsigned.  */
 
    if (unsigned_p || (n & high_bit))
      {
 
    if (unsigned_p || (n & high_bit))
      {
@@ -990,7 +1030,7 @@ push_current_type (void)
   tpnew->next = tp_top;
   tpnew->stored = current_type;
   current_type = NULL;
   tpnew->next = tp_top;
   tpnew->stored = current_type;
   current_type = NULL;
-  tp_top = tpnew; 
+  tp_top = tpnew;
 }
 
 static void
 }
 
 static void
@@ -1007,7 +1047,7 @@ pop_current_type (void)
 
 struct token
 {
 
 struct token
 {
-  char *operator;
+  const char *oper;
   int token;
   enum exp_opcode opcode;
 };
   int token;
   enum exp_opcode opcode;
 };
@@ -1034,11 +1074,10 @@ static const struct token tokentab2[] =
     {":=", ASSIGN, BINOP_END},
     {"::", COLONCOLON, BINOP_END} };
 
     {":=", ASSIGN, BINOP_END},
     {"::", COLONCOLON, BINOP_END} };
 
-/* Allocate uppercased var */
-/* make an uppercased copy of tokstart */
-static char * uptok (tokstart, namelen)
-  char *tokstart;
-  int namelen;
+/* Allocate uppercased var: */
+/* make an uppercased copy of tokstart.  */
+static char *
+uptok (const char *tokstart, int namelen)
 {
   int i;
   char *uptokstart = (char *)malloc(namelen+1);
 {
   int i;
   char *uptokstart = (char *)malloc(namelen+1);
@@ -1052,18 +1091,18 @@ static char * uptok (tokstart, namelen)
   uptokstart[namelen]='\0';
   return uptokstart;
 }
   uptokstart[namelen]='\0';
   return uptokstart;
 }
-/* Read one token, getting characters through lexptr.  */
 
 
+/* Read one token, getting characters through lexptr.  */
 
 static int
 
 static int
-yylex ()
+yylex (void)
 {
   int c;
   int namelen;
   unsigned int i;
 {
   int c;
   int namelen;
   unsigned int i;
-  char *tokstart;
+  const char *tokstart;
   char *uptokstart;
   char *uptokstart;
-  char *tokptr;
+  const char *tokptr;
   int explen, tempbufindex;
   static char *tempbuf;
   static int tempbufsize;
   int explen, tempbufindex;
   static char *tempbuf;
   static int tempbufsize;
@@ -1074,12 +1113,14 @@ yylex ()
 
   tokstart = lexptr;
   explen = strlen (lexptr);
 
   tokstart = lexptr;
   explen = strlen (lexptr);
+
   /* See if it is a special token of length 3.  */
   if (explen > 2)
     for (i = 0; i < sizeof (tokentab3) / sizeof (tokentab3[0]); i++)
   /* See if it is a special token of length 3.  */
   if (explen > 2)
     for (i = 0; i < sizeof (tokentab3) / sizeof (tokentab3[0]); i++)
-      if (strncasecmp (tokstart, tokentab3[i].operator, 3) == 0
-          && (!isalpha (tokentab3[i].operator[0]) || explen == 3
-              || (!isalpha (tokstart[3]) && !isdigit (tokstart[3]) && tokstart[3] != '_')))
+      if (strncasecmp (tokstart, tokentab3[i].oper, 3) == 0
+          && (!isalpha (tokentab3[i].oper[0]) || explen == 3
+              || (!isalpha (tokstart[3])
+                 && !isdigit (tokstart[3]) && tokstart[3] != '_')))
         {
           lexptr += 3;
           yylval.opcode = tokentab3[i].opcode;
         {
           lexptr += 3;
           yylval.opcode = tokentab3[i].opcode;
@@ -1089,9 +1130,10 @@ yylex ()
   /* See if it is a special token of length 2.  */
   if (explen > 1)
   for (i = 0; i < sizeof (tokentab2) / sizeof (tokentab2[0]); i++)
   /* See if it is a special token of length 2.  */
   if (explen > 1)
   for (i = 0; i < sizeof (tokentab2) / sizeof (tokentab2[0]); i++)
-      if (strncasecmp (tokstart, tokentab2[i].operator, 2) == 0
-          && (!isalpha (tokentab2[i].operator[0]) || explen == 2
-              || (!isalpha (tokstart[2]) && !isdigit (tokstart[2]) && tokstart[2] != '_')))
+      if (strncasecmp (tokstart, tokentab2[i].oper, 2) == 0
+          && (!isalpha (tokentab2[i].oper[0]) || explen == 2
+              || (!isalpha (tokstart[2])
+                 && !isdigit (tokstart[2]) && tokstart[2] != '_')))
         {
           lexptr += 2;
           yylval.opcode = tokentab2[i].opcode;
         {
           lexptr += 2;
           yylval.opcode = tokentab2[i].opcode;
@@ -1101,7 +1143,10 @@ yylex ()
   switch (c = *tokstart)
     {
     case 0:
   switch (c = *tokstart)
     {
     case 0:
-      return 0;
+      if (search_field && parse_completion)
+       return COMPLETE;
+      else
+       return 0;
 
     case ' ':
     case '\t':
 
     case ' ':
     case '\t':
@@ -1112,16 +1157,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 object pascal
     case '\'':
       /* We either have a character constant ('0' or '\177' for example)
         or we have a quoted symbol reference ('foo(int,int)' in object pascal
-        for example). */
+        for example).  */
       lexptr++;
       c = *lexptr++;
       if (c == '\\')
       lexptr++;
       c = *lexptr++;
       if (c == '\\')
-       c = parse_escape (parse_gdbarch, &lexptr);
+       c = parse_escape (parse_gdbarch (pstate), &lexptr);
       else if (c == '\'')
       else if (c == '\'')
-       error ("Empty character constant.");
+       error (_("Empty character constant."));
 
       yylval.typed_val_int.val = c;
 
       yylval.typed_val_int.val = c;
-      yylval.typed_val_int.type = parse_type->builtin_char;
+      yylval.typed_val_int.type = parse_type (pstate)->builtin_char;
 
       c = *lexptr++;
       if (c != '\'')
 
       c = *lexptr++;
       if (c != '\'')
@@ -1131,13 +1176,13 @@ yylex ()
            {
              lexptr = tokstart + namelen;
              if (lexptr[-1] != '\'')
            {
              lexptr = tokstart + namelen;
              if (lexptr[-1] != '\'')
-               error ("Unmatched single quote.");
+               error (_("Unmatched single quote."));
              namelen -= 2;
               tokstart++;
               uptokstart = uptok(tokstart,namelen);
              goto tryname;
            }
              namelen -= 2;
               tokstart++;
               uptokstart = uptok(tokstart,namelen);
              goto tryname;
            }
-         error ("Invalid character constant.");
+         error (_("Invalid character constant."));
        }
       return INT;
 
        }
       return INT;
 
@@ -1162,7 +1207,10 @@ yylex ()
     case '.':
       /* Might be a floating point number.  */
       if (lexptr[1] < '0' || lexptr[1] > '9')
     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':
       /* FALL THRU into number case.  */
 
     case '0':
@@ -1178,7 +1226,7 @@ yylex ()
       {
        /* It's a number.  */
        int got_dot = 0, got_e = 0, toktype;
       {
        /* It's a number.  */
        int got_dot = 0, got_e = 0, toktype;
-       char *p = tokstart;
+       const char *p = tokstart;
        int hex = input_radix > 10;
 
        if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
        int hex = input_radix > 10;
 
        if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
@@ -1186,7 +1234,8 @@ yylex ()
            p += 2;
            hex = 1;
          }
            p += 2;
            hex = 1;
          }
-       else if (c == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D'))
+       else if (c == '0' && (p[1]=='t' || p[1]=='T'
+                             || p[1]=='d' || p[1]=='D'))
          {
            p += 2;
            hex = 0;
          {
            p += 2;
            hex = 0;
@@ -1215,14 +1264,15 @@ yylex ()
                                  && (*p < 'A' || *p > 'Z')))
              break;
          }
                                  && (*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;
         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;
          }
        lexptr = p;
        return toktype;
@@ -1260,14 +1310,14 @@ yylex ()
         the buffer contains no embedded nulls.  Gdb does not depend
         upon the buffer being null byte terminated, it uses the length
         string instead.  This allows gdb to handle C strings (as well
         the buffer contains no embedded nulls.  Gdb does not depend
         upon the buffer being null byte terminated, it uses the length
         string instead.  This allows gdb to handle C strings (as well
-        as strings in other languages) with embedded null bytes */
+        as strings in other languages) with embedded null bytes */
 
       tokptr = ++tokstart;
       tempbufindex = 0;
 
       do {
        /* Grow the static temp buffer if necessary, including allocating
 
       tokptr = ++tokstart;
       tempbufindex = 0;
 
       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);
        if (tempbufindex + 1 >= tempbufsize)
          {
            tempbuf = (char *) realloc (tempbuf, tempbufsize += 64);
@@ -1277,11 +1327,11 @@ yylex ()
          {
          case '\0':
          case '"':
          {
          case '\0':
          case '"':
-           /* Do nothing, loop will terminate. */
+           /* Do nothing, loop will terminate.  */
            break;
          case '\\':
            break;
          case '\\':
-           tokptr++;
-           c = parse_escape (parse_gdbarch, &tokptr);
+           ++tokptr;
+           c = parse_escape (parse_gdbarch (pstate), &tokptr);
            if (c == -1)
              {
                continue;
            if (c == -1)
              {
                continue;
@@ -1295,9 +1345,9 @@ yylex ()
       } while ((*tokptr != '"') && (*tokptr != '\0'));
       if (*tokptr++ != '"')
        {
       } while ((*tokptr != '"') && (*tokptr != '\0'));
       if (*tokptr++ != '"')
        {
-         error ("Unterminated string in expression.");
+         error (_("Unterminated string in expression."));
        }
        }
-      tempbuf[tempbufindex] = '\0';    /* See note above */
+      tempbuf[tempbufindex] = '\0';    /* See note above */
       yylval.sval.ptr = tempbuf;
       yylval.sval.length = tempbufindex;
       lexptr = tokptr;
       yylval.sval.ptr = tempbuf;
       yylval.sval.length = tempbufindex;
       lexptr = tokptr;
@@ -1307,7 +1357,7 @@ yylex ()
   if (!(c == '_' || c == '$'
        || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
     /* We must have come across a bad character (e.g. ';').  */
   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;
 
   /* It's a name.  See how long it is.  */
   namelen = 0;
@@ -1337,7 +1387,7 @@ yylex ()
            break;
        }
 
            break;
        }
 
-      /* do NOT uppercase internals because of registers !!! */
+      /* do NOT uppercase internals because of registers !!!  */
       c = tokstart[++namelen];
     }
 
       c = tokstart[++namelen];
     }
 
@@ -1397,12 +1447,12 @@ yylex ()
         }
       if (strcmp (uptokstart, "SELF") == 0)
         {
         }
       if (strcmp (uptokstart, "SELF") == 0)
         {
-          /* here we search for 'this' like
-             inserted in FPC stabs debug info */
+          /* Here we search for 'this' like
+             inserted in FPC stabs debug info */
          static const char this_name[] = "this";
 
          if (lookup_symbol (this_name, expression_context_block,
          static const char this_name[] = "this";
 
          if (lookup_symbol (this_name, expression_context_block,
-                            VAR_DOMAIN, (int *) NULL))
+                            VAR_DOMAIN, NULL).symbol)
            {
              free (uptokstart);
              return THIS;
            {
              free (uptokstart);
              return THIS;
@@ -1418,11 +1468,17 @@ yylex ()
 
   if (*tokstart == '$')
     {
 
   if (*tokstart == '$')
     {
+      char *tmp;
+
       /* $ is the normal prefix for pascal hexadecimal values
         but this conflicts with the GDB use for debugger variables
         so in expression to enter hexadecimal values
         we still need to use C syntax with 0xff  */
       /* $ is the normal prefix for pascal hexadecimal values
         but this conflicts with the GDB use for debugger variables
         so in expression to enter hexadecimal values
         we still need to use C syntax with 0xff  */
-      write_dollar_variable (yylval.sval);
+      write_dollar_variable (pstate, yylval.sval);
+      tmp = (char *) alloca (namelen + 1);
+      memcpy (tmp, tokstart, namelen);
+      tmp[namelen] = '\0';
+      intvar = lookup_only_internalvar (tmp + 1);
       free (uptokstart);
       return VARIABLE;
     }
       free (uptokstart);
       return VARIABLE;
     }
@@ -1435,20 +1491,20 @@ yylex ()
   {
     char *tmp = copy_name (yylval.sval);
     struct symbol *sym;
   {
     char *tmp = copy_name (yylval.sval);
     struct symbol *sym;
-    int is_a_field_of_this = 0;
+    struct field_of_this_result is_a_field_of_this;
     int is_a_field = 0;
     int hextype;
 
     int is_a_field = 0;
     int hextype;
 
-
+    is_a_field_of_this.type = NULL;
     if (search_field && current_type)
     if (search_field && current_type)
-      is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL);    
+      is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL);
     if (is_a_field)
       sym = NULL;
     else
       sym = lookup_symbol (tmp, expression_context_block,
     if (is_a_field)
       sym = NULL;
     else
       sym = lookup_symbol (tmp, expression_context_block,
-                          VAR_DOMAIN, &is_a_field_of_this);
+                          VAR_DOMAIN, &is_a_field_of_this).symbol;
     /* second chance uppercased (as Free Pascal does).  */
     /* second chance uppercased (as Free Pascal does).  */
-    if (!sym && !is_a_field_of_this && !is_a_field)
+    if (!sym && is_a_field_of_this.type == NULL && !is_a_field)
       {
        for (i = 0; i <= namelen; i++)
          {
       {
        for (i = 0; i <= namelen; i++)
          {
@@ -1456,21 +1512,15 @@ yylex ()
              tmp[i] -= ('a'-'A');
          }
        if (search_field && current_type)
              tmp[i] -= ('a'-'A');
          }
        if (search_field && current_type)
-        is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL);  
+        is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL);
        if (is_a_field)
         sym = NULL;
        else
         sym = lookup_symbol (tmp, expression_context_block,
        if (is_a_field)
         sym = NULL;
        else
         sym = lookup_symbol (tmp, expression_context_block,
-                             VAR_DOMAIN, &is_a_field_of_this);
-       if (sym || is_a_field_of_this || is_a_field)
-         for (i = 0; i <= namelen; i++)
-           {
-             if ((tokstart[i] >= 'a' && tokstart[i] <= 'z'))
-               tokstart[i] -= ('a'-'A');
-           }
+                             VAR_DOMAIN, &is_a_field_of_this).symbol;
       }
     /* Third chance Capitalized (as GPC does).  */
       }
     /* Third chance Capitalized (as GPC does).  */
-    if (!sym && !is_a_field_of_this && !is_a_field)
+    if (!sym && is_a_field_of_this.type == NULL && !is_a_field)
       {
        for (i = 0; i <= namelen; i++)
          {
       {
        for (i = 0; i <= namelen; i++)
          {
@@ -1484,43 +1534,39 @@ yylex ()
              tmp[i] -= ('A'-'a');
           }
        if (search_field && current_type)
              tmp[i] -= ('A'-'a');
           }
        if (search_field && current_type)
-        is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL);  
+        is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL);
        if (is_a_field)
         sym = NULL;
        else
         sym = lookup_symbol (tmp, expression_context_block,
        if (is_a_field)
         sym = NULL;
        else
         sym = lookup_symbol (tmp, expression_context_block,
-                             VAR_DOMAIN, &is_a_field_of_this);
-       if (sym || is_a_field_of_this || is_a_field)
-          for (i = 0; i <= namelen; i++)
-            {
-              if (i == 0)
-                {
-                  if ((tokstart[i] >= 'a' && tokstart[i] <= 'z'))
-                    tokstart[i] -= ('a'-'A');
-                }
-              else
-                if ((tokstart[i] >= 'A' && tokstart[i] <= 'Z'))
-                  tokstart[i] -= ('A'-'a');
-            }
+                             VAR_DOMAIN, &is_a_field_of_this).symbol;
       }
 
       }
 
-    if (is_a_field)
+    if (is_a_field || (is_a_field_of_this.type != NULL))
       {
        tempbuf = (char *) realloc (tempbuf, namelen + 1);
       {
        tempbuf = (char *) realloc (tempbuf, namelen + 1);
-       strncpy (tempbuf, tokstart, namelen); tempbuf [namelen] = 0;
+       strncpy (tempbuf, tmp, namelen);
+       tempbuf [namelen] = 0;
        yylval.sval.ptr = tempbuf;
        yylval.sval.ptr = tempbuf;
-       yylval.sval.length = namelen; 
+       yylval.sval.length = namelen;
+       yylval.ssym.sym.symbol = NULL;
+       yylval.ssym.sym.block = NULL;
        free (uptokstart);
        free (uptokstart);
-       return FIELDNAME;
-      } 
+        yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
+       if (is_a_field)
+         return FIELDNAME;
+       else
+         return NAME;
+      }
     /* Call lookup_symtab, not lookup_partial_symtab, in case there are
        no psymtabs (coff, xcoff, or some future change to blow away the
        psymtabs once once symbols are read).  */
     if ((sym && SYMBOL_CLASS (sym) == LOC_BLOCK)
         || lookup_symtab (tmp))
       {
     /* Call lookup_symtab, not lookup_partial_symtab, in case there are
        no psymtabs (coff, xcoff, or some future change to blow away the
        psymtabs once once symbols are read).  */
     if ((sym && SYMBOL_CLASS (sym) == LOC_BLOCK)
         || lookup_symtab (tmp))
       {
-       yylval.ssym.sym = sym;
-       yylval.ssym.is_a_field_of_this = is_a_field_of_this;
+       yylval.ssym.sym.symbol = sym;
+       yylval.ssym.sym.block = NULL;
+       yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
        free (uptokstart);
        return BLOCKNAME;
       }
        free (uptokstart);
        return BLOCKNAME;
       }
@@ -1536,8 +1582,8 @@ yylex ()
             distinction) named x, then this code incorrectly thinks we
             are dealing with nested types rather than a member function.  */
 
             distinction) named x, then this code incorrectly thinks we
             are dealing with nested types rather than a member function.  */
 
-         char *p;
-         char *namestart;
+         const char *p;
+         const char *namestart;
          struct symbol *best_sym;
 
          /* Look ahead to detect nested types.  This probably should be
          struct symbol *best_sym;
 
          /* Look ahead to detect nested types.  This probably should be
@@ -1575,7 +1621,9 @@ yylex ()
                      struct symbol *cur_sym;
                      /* As big as the whole rest of the expression, which is
                         at least big enough.  */
                      struct symbol *cur_sym;
                      /* As big as the whole rest of the expression, which is
                         at least big enough.  */
-                     char *ncopy = alloca (strlen (tmp)+strlen (namestart)+3);
+                     char *ncopy
+                       = (char *) alloca (strlen (tmp) + strlen (namestart)
+                                          + 3);
                      char *tmp1;
 
                      tmp1 = ncopy;
                      char *tmp1;
 
                      tmp1 = ncopy;
@@ -1586,7 +1634,7 @@ yylex ()
                      memcpy (tmp1, namestart, p - namestart);
                      tmp1[p - namestart] = '\0';
                      cur_sym = lookup_symbol (ncopy, expression_context_block,
                      memcpy (tmp1, namestart, p - namestart);
                      tmp1[p - namestart] = '\0';
                      cur_sym = lookup_symbol (ncopy, expression_context_block,
-                                              VAR_DOMAIN, (int *) NULL);
+                                              VAR_DOMAIN, NULL).symbol;
                      if (cur_sym)
                        {
                          if (SYMBOL_CLASS (cur_sym) == LOC_TYPEDEF)
                      if (cur_sym)
                        {
                          if (SYMBOL_CLASS (cur_sym) == LOC_TYPEDEF)
@@ -1615,8 +1663,8 @@ yylex ()
          return TYPENAME;
         }
     yylval.tsym.type
          return TYPENAME;
         }
     yylval.tsym.type
-      = language_lookup_primitive_type_by_name (parse_language,
-                                               parse_gdbarch, tmp);
+      = language_lookup_primitive_type (parse_language (pstate),
+                                       parse_gdbarch (pstate), tmp);
     if (yylval.tsym.type != NULL)
       {
        free (uptokstart);
     if (yylval.tsym.type != NULL)
       {
        free (uptokstart);
@@ -1631,30 +1679,45 @@ yylex ()
             || (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
       {
        YYSTYPE newlval;        /* Its value is ignored.  */
             || (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
       {
        YYSTYPE newlval;        /* Its value is ignored.  */
-       hextype = parse_number (tokstart, namelen, 0, &newlval);
+       hextype = parse_number (pstate, tokstart, namelen, 0, &newlval);
        if (hextype == INT)
          {
        if (hextype == INT)
          {
-           yylval.ssym.sym = sym;
-           yylval.ssym.is_a_field_of_this = is_a_field_of_this;
+           yylval.ssym.sym.symbol = sym;
+           yylval.ssym.sym.block = NULL;
+           yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
            free (uptokstart);
            return NAME_OR_INT;
          }
       }
 
     free(uptokstart);
            free (uptokstart);
            return NAME_OR_INT;
          }
       }
 
     free(uptokstart);
-    /* Any other kind of symbol */
-    yylval.ssym.sym = sym;
-    yylval.ssym.is_a_field_of_this = is_a_field_of_this;
+    /* Any other kind of symbol */
+    yylval.ssym.sym.symbol = sym;
+    yylval.ssym.sym.block = NULL;
     return NAME;
   }
 }
 
     return NAME;
   }
 }
 
+int
+pascal_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
 void
-yyerror (msg)
-     char *msg;
+yyerror (const char *msg)
 {
   if (prev_lexptr)
     lexptr = prev_lexptr;
 
 {
   if (prev_lexptr)
     lexptr = prev_lexptr;
 
-  error ("A %s in expression, near `%s'.", (msg ? msg : "error"), lexptr);
+  error (_("A %s in expression, near `%s'."), (msg ? msg : "error"), lexptr);
 }
 }
This page took 0.046277 seconds and 4 git commands to generate.