xref: /openbsd-src/gnu/usr.bin/binutils/gdb/p-exp.c (revision 11efff7f3ac2b3cfeff0c0cddc14294d9b3aca4f)
1*11efff7fSkettenis /* A Bison parser, made by GNU Bison 1.875c.  */
2b725ae77Skettenis 
3*11efff7fSkettenis /* Skeleton parser for Yacc-like parsing with Bison,
4*11efff7fSkettenis    Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
5b725ae77Skettenis 
6*11efff7fSkettenis    This program is free software; you can redistribute it and/or modify
7*11efff7fSkettenis    it under the terms of the GNU General Public License as published by
8*11efff7fSkettenis    the Free Software Foundation; either version 2, or (at your option)
9*11efff7fSkettenis    any later version.
10*11efff7fSkettenis 
11*11efff7fSkettenis    This program is distributed in the hope that it will be useful,
12*11efff7fSkettenis    but WITHOUT ANY WARRANTY; without even the implied warranty of
13*11efff7fSkettenis    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*11efff7fSkettenis    GNU General Public License for more details.
15*11efff7fSkettenis 
16*11efff7fSkettenis    You should have received a copy of the GNU General Public License
17*11efff7fSkettenis    along with this program; if not, write to the Free Software
18*11efff7fSkettenis    Foundation, Inc., 59 Temple Place - Suite 330,
19*11efff7fSkettenis    Boston, MA 02111-1307, USA.  */
20*11efff7fSkettenis 
21*11efff7fSkettenis /* As a special exception, when this file is copied by Bison into a
22*11efff7fSkettenis    Bison output file, you may use that output file without restriction.
23*11efff7fSkettenis    This special exception was added by the Free Software Foundation
24*11efff7fSkettenis    in version 1.24 of Bison.  */
25*11efff7fSkettenis 
26*11efff7fSkettenis /* Written by Richard Stallman by simplifying the original so called
27*11efff7fSkettenis    ``semantic'' parser.  */
28*11efff7fSkettenis 
29*11efff7fSkettenis /* All symbols defined below should begin with yy or YY, to avoid
30*11efff7fSkettenis    infringing on user name space.  This should be done even for local
31*11efff7fSkettenis    variables, as they might otherwise be expanded by user macros.
32*11efff7fSkettenis    There are some unavoidable exceptions within include files to
33*11efff7fSkettenis    define necessary library symbols; they are noted "INFRINGES ON
34*11efff7fSkettenis    USER NAME SPACE" below.  */
35*11efff7fSkettenis 
36*11efff7fSkettenis /* Identify Bison output.  */
37*11efff7fSkettenis #define YYBISON 1
38*11efff7fSkettenis 
39*11efff7fSkettenis /* Skeleton name.  */
40*11efff7fSkettenis #define YYSKELETON_NAME "yacc.c"
41*11efff7fSkettenis 
42*11efff7fSkettenis /* Pure parsers.  */
43*11efff7fSkettenis #define YYPURE 0
44*11efff7fSkettenis 
45*11efff7fSkettenis /* Using locations.  */
46*11efff7fSkettenis #define YYLSP_NEEDED 0
47*11efff7fSkettenis 
48*11efff7fSkettenis 
49*11efff7fSkettenis 
50*11efff7fSkettenis /* Tokens.  */
51*11efff7fSkettenis #ifndef YYTOKENTYPE
52*11efff7fSkettenis # define YYTOKENTYPE
53*11efff7fSkettenis    /* Put the tokens into the symbol table, so that GDB and other debuggers
54*11efff7fSkettenis       know about them.  */
55*11efff7fSkettenis    enum yytokentype {
56*11efff7fSkettenis      INT = 258,
57*11efff7fSkettenis      FLOAT = 259,
58*11efff7fSkettenis      STRING = 260,
59*11efff7fSkettenis      FIELDNAME = 261,
60*11efff7fSkettenis      NAME = 262,
61*11efff7fSkettenis      TYPENAME = 263,
62*11efff7fSkettenis      NAME_OR_INT = 264,
63*11efff7fSkettenis      STRUCT = 265,
64*11efff7fSkettenis      CLASS = 266,
65*11efff7fSkettenis      SIZEOF = 267,
66*11efff7fSkettenis      COLONCOLON = 268,
67*11efff7fSkettenis      ERROR = 269,
68*11efff7fSkettenis      VARIABLE = 270,
69*11efff7fSkettenis      THIS = 271,
70*11efff7fSkettenis      TRUEKEYWORD = 272,
71*11efff7fSkettenis      FALSEKEYWORD = 273,
72*11efff7fSkettenis      ABOVE_COMMA = 274,
73*11efff7fSkettenis      ASSIGN = 275,
74*11efff7fSkettenis      NOT = 276,
75*11efff7fSkettenis      OR = 277,
76*11efff7fSkettenis      XOR = 278,
77*11efff7fSkettenis      ANDAND = 279,
78*11efff7fSkettenis      NOTEQUAL = 280,
79*11efff7fSkettenis      GEQ = 281,
80*11efff7fSkettenis      LEQ = 282,
81*11efff7fSkettenis      MOD = 283,
82*11efff7fSkettenis      DIV = 284,
83*11efff7fSkettenis      RSH = 285,
84*11efff7fSkettenis      LSH = 286,
85*11efff7fSkettenis      DECREMENT = 287,
86*11efff7fSkettenis      INCREMENT = 288,
87*11efff7fSkettenis      UNARY = 289,
88*11efff7fSkettenis      ARROW = 290,
89*11efff7fSkettenis      BLOCKNAME = 291
90*11efff7fSkettenis    };
91*11efff7fSkettenis #endif
92*11efff7fSkettenis #define INT 258
93*11efff7fSkettenis #define FLOAT 259
94*11efff7fSkettenis #define STRING 260
95*11efff7fSkettenis #define FIELDNAME 261
96*11efff7fSkettenis #define NAME 262
97*11efff7fSkettenis #define TYPENAME 263
98*11efff7fSkettenis #define NAME_OR_INT 264
99*11efff7fSkettenis #define STRUCT 265
100*11efff7fSkettenis #define CLASS 266
101*11efff7fSkettenis #define SIZEOF 267
102*11efff7fSkettenis #define COLONCOLON 268
103*11efff7fSkettenis #define ERROR 269
104*11efff7fSkettenis #define VARIABLE 270
105*11efff7fSkettenis #define THIS 271
106*11efff7fSkettenis #define TRUEKEYWORD 272
107*11efff7fSkettenis #define FALSEKEYWORD 273
108*11efff7fSkettenis #define ABOVE_COMMA 274
109*11efff7fSkettenis #define ASSIGN 275
110*11efff7fSkettenis #define NOT 276
111*11efff7fSkettenis #define OR 277
112*11efff7fSkettenis #define XOR 278
113*11efff7fSkettenis #define ANDAND 279
114*11efff7fSkettenis #define NOTEQUAL 280
115b725ae77Skettenis #define GEQ 281
116*11efff7fSkettenis #define LEQ 282
117*11efff7fSkettenis #define MOD 283
118b725ae77Skettenis #define DIV 284
119*11efff7fSkettenis #define RSH 285
120*11efff7fSkettenis #define LSH 286
121*11efff7fSkettenis #define DECREMENT 287
122*11efff7fSkettenis #define INCREMENT 288
123*11efff7fSkettenis #define UNARY 289
124*11efff7fSkettenis #define ARROW 290
125*11efff7fSkettenis #define BLOCKNAME 291
126b725ae77Skettenis 
127*11efff7fSkettenis 
128*11efff7fSkettenis 
129*11efff7fSkettenis 
130*11efff7fSkettenis /* Copy the first part of user declarations.  */
131b725ae77Skettenis #line 46 "p-exp.y"
132b725ae77Skettenis 
133b725ae77Skettenis 
134b725ae77Skettenis #include "defs.h"
135b725ae77Skettenis #include "gdb_string.h"
136b725ae77Skettenis #include <ctype.h>
137b725ae77Skettenis #include "expression.h"
138b725ae77Skettenis #include "value.h"
139b725ae77Skettenis #include "parser-defs.h"
140b725ae77Skettenis #include "language.h"
141b725ae77Skettenis #include "p-lang.h"
142b725ae77Skettenis #include "bfd.h" /* Required by objfiles.h.  */
143b725ae77Skettenis #include "symfile.h" /* Required by objfiles.h.  */
144b725ae77Skettenis #include "objfiles.h" /* For have_full_symbols and have_partial_symbols */
145b725ae77Skettenis #include "block.h"
146b725ae77Skettenis 
147b725ae77Skettenis /* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
148b725ae77Skettenis    as well as gratuitiously global symbol names, so we can have multiple
149b725ae77Skettenis    yacc generated parsers in gdb.  Note that these are only the variables
150b725ae77Skettenis    produced by yacc.  If other parser generators (bison, byacc, etc) produce
151b725ae77Skettenis    additional global names that conflict at link time, then those parser
152b725ae77Skettenis    generators need to be fixed instead of adding those names to this list. */
153b725ae77Skettenis 
154b725ae77Skettenis #define	yymaxdepth pascal_maxdepth
155b725ae77Skettenis #define	yyparse	pascal_parse
156b725ae77Skettenis #define	yylex	pascal_lex
157b725ae77Skettenis #define	yyerror	pascal_error
158b725ae77Skettenis #define	yylval	pascal_lval
159b725ae77Skettenis #define	yychar	pascal_char
160b725ae77Skettenis #define	yydebug	pascal_debug
161b725ae77Skettenis #define	yypact	pascal_pact
162b725ae77Skettenis #define	yyr1	pascal_r1
163b725ae77Skettenis #define	yyr2	pascal_r2
164b725ae77Skettenis #define	yydef	pascal_def
165b725ae77Skettenis #define	yychk	pascal_chk
166b725ae77Skettenis #define	yypgo	pascal_pgo
167b725ae77Skettenis #define	yyact	pascal_act
168b725ae77Skettenis #define	yyexca	pascal_exca
169b725ae77Skettenis #define yyerrflag pascal_errflag
170b725ae77Skettenis #define yynerrs	pascal_nerrs
171b725ae77Skettenis #define	yyps	pascal_ps
172b725ae77Skettenis #define	yypv	pascal_pv
173b725ae77Skettenis #define	yys	pascal_s
174b725ae77Skettenis #define	yy_yys	pascal_yys
175b725ae77Skettenis #define	yystate	pascal_state
176b725ae77Skettenis #define	yytmp	pascal_tmp
177b725ae77Skettenis #define	yyv	pascal_v
178b725ae77Skettenis #define	yy_yyv	pascal_yyv
179b725ae77Skettenis #define	yyval	pascal_val
180b725ae77Skettenis #define	yylloc	pascal_lloc
181b725ae77Skettenis #define yyreds	pascal_reds		/* With YYDEBUG defined */
182b725ae77Skettenis #define yytoks	pascal_toks		/* With YYDEBUG defined */
183b725ae77Skettenis #define yyname	pascal_name		/* With YYDEBUG defined */
184b725ae77Skettenis #define yyrule	pascal_rule		/* With YYDEBUG defined */
185b725ae77Skettenis #define yylhs	pascal_yylhs
186b725ae77Skettenis #define yylen	pascal_yylen
187b725ae77Skettenis #define yydefred pascal_yydefred
188b725ae77Skettenis #define yydgoto	pascal_yydgoto
189b725ae77Skettenis #define yysindex pascal_yysindex
190b725ae77Skettenis #define yyrindex pascal_yyrindex
191b725ae77Skettenis #define yygindex pascal_yygindex
192b725ae77Skettenis #define yytable	 pascal_yytable
193b725ae77Skettenis #define yycheck	 pascal_yycheck
194b725ae77Skettenis 
195b725ae77Skettenis #ifndef YYDEBUG
196b725ae77Skettenis #define	YYDEBUG 1		/* Default to yydebug support */
197b725ae77Skettenis #endif
198b725ae77Skettenis 
199b725ae77Skettenis #define YYFPRINTF parser_fprintf
200b725ae77Skettenis 
201b725ae77Skettenis int yyparse (void);
202b725ae77Skettenis 
203b725ae77Skettenis static int yylex (void);
204b725ae77Skettenis 
205b725ae77Skettenis void
206b725ae77Skettenis yyerror (char *);
207b725ae77Skettenis 
208b725ae77Skettenis static char * uptok (char *, int);
209b725ae77Skettenis 
210*11efff7fSkettenis 
211*11efff7fSkettenis /* Enabling traces.  */
212*11efff7fSkettenis #ifndef YYDEBUG
213*11efff7fSkettenis # define YYDEBUG 0
214*11efff7fSkettenis #endif
215*11efff7fSkettenis 
216*11efff7fSkettenis /* Enabling verbose error messages.  */
217*11efff7fSkettenis #ifdef YYERROR_VERBOSE
218*11efff7fSkettenis # undef YYERROR_VERBOSE
219*11efff7fSkettenis # define YYERROR_VERBOSE 1
220*11efff7fSkettenis #else
221*11efff7fSkettenis # define YYERROR_VERBOSE 0
222*11efff7fSkettenis #endif
223*11efff7fSkettenis 
224*11efff7fSkettenis #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
225*11efff7fSkettenis #line 130 "p-exp.y"
226*11efff7fSkettenis typedef union YYSTYPE {
227b725ae77Skettenis     LONGEST lval;
228b725ae77Skettenis     struct {
229b725ae77Skettenis       LONGEST val;
230b725ae77Skettenis       struct type *type;
231b725ae77Skettenis     } typed_val_int;
232b725ae77Skettenis     struct {
233b725ae77Skettenis       DOUBLEST dval;
234b725ae77Skettenis       struct type *type;
235b725ae77Skettenis     } typed_val_float;
236b725ae77Skettenis     struct symbol *sym;
237b725ae77Skettenis     struct type *tval;
238b725ae77Skettenis     struct stoken sval;
239b725ae77Skettenis     struct ttype tsym;
240b725ae77Skettenis     struct symtoken ssym;
241b725ae77Skettenis     int voidval;
242b725ae77Skettenis     struct block *bval;
243b725ae77Skettenis     enum exp_opcode opcode;
244b725ae77Skettenis     struct internalvar *ivar;
245b725ae77Skettenis 
246b725ae77Skettenis     struct type **tvec;
247b725ae77Skettenis     int *ivec;
248*11efff7fSkettenis   } YYSTYPE;
249*11efff7fSkettenis /* Line 191 of yacc.c.  */
250*11efff7fSkettenis # define yystype YYSTYPE /* obsolescent; will be withdrawn */
251*11efff7fSkettenis # define YYSTYPE_IS_DECLARED 1
252b725ae77Skettenis # define YYSTYPE_IS_TRIVIAL 1
253b725ae77Skettenis #endif
254*11efff7fSkettenis 
255*11efff7fSkettenis 
256*11efff7fSkettenis 
257*11efff7fSkettenis /* Copy the second part of user declarations.  */
258b725ae77Skettenis #line 154 "p-exp.y"
259b725ae77Skettenis 
260b725ae77Skettenis /* YYSTYPE gets defined by %union */
261b725ae77Skettenis static int
262b725ae77Skettenis parse_number (char *, int, int, YYSTYPE *);
263b725ae77Skettenis 
264b725ae77Skettenis static struct type *current_type;
265b725ae77Skettenis 
266b725ae77Skettenis static void push_current_type (void);
267b725ae77Skettenis static void pop_current_type (void);
268b725ae77Skettenis static int search_field;
269*11efff7fSkettenis 
270*11efff7fSkettenis 
271*11efff7fSkettenis /* Line 214 of yacc.c.  */
272*11efff7fSkettenis 
273*11efff7fSkettenis #if ! defined (yyoverflow) || YYERROR_VERBOSE
274*11efff7fSkettenis 
275*11efff7fSkettenis # ifndef YYFREE
276*11efff7fSkettenis #  define YYFREE free
277b725ae77Skettenis # endif
278*11efff7fSkettenis # ifndef YYMALLOC
279*11efff7fSkettenis #  define YYMALLOC xmalloc
280b725ae77Skettenis # endif
281b725ae77Skettenis 
282b725ae77Skettenis /* The parser invokes alloca or xmalloc; define the necessary symbols.  */
283b725ae77Skettenis 
284*11efff7fSkettenis # ifdef YYSTACK_USE_ALLOCA
285b725ae77Skettenis #  if YYSTACK_USE_ALLOCA
286b725ae77Skettenis #   define YYSTACK_ALLOC alloca
287*11efff7fSkettenis #  endif
288b725ae77Skettenis # else
289b725ae77Skettenis #  if defined (alloca) || defined (_ALLOCA_H)
290b725ae77Skettenis #   define YYSTACK_ALLOC alloca
291b725ae77Skettenis #  else
292b725ae77Skettenis #   ifdef __GNUC__
293b725ae77Skettenis #    define YYSTACK_ALLOC __builtin_alloca
294b725ae77Skettenis #   endif
295b725ae77Skettenis #  endif
296b725ae77Skettenis # endif
297b725ae77Skettenis 
298b725ae77Skettenis # ifdef YYSTACK_ALLOC
299b725ae77Skettenis    /* Pacify GCC's `empty if-body' warning. */
300b725ae77Skettenis #  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
301b725ae77Skettenis # else
302b725ae77Skettenis #  if defined (__STDC__) || defined (__cplusplus)
303b725ae77Skettenis #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
304b725ae77Skettenis #   define YYSIZE_T size_t
305b725ae77Skettenis #  endif
306*11efff7fSkettenis #  define YYSTACK_ALLOC YYMALLOC
307*11efff7fSkettenis #  define YYSTACK_FREE YYFREE
308b725ae77Skettenis # endif
309*11efff7fSkettenis #endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
310b725ae77Skettenis 
311b725ae77Skettenis 
312b725ae77Skettenis #if (! defined (yyoverflow) \
313b725ae77Skettenis      && (! defined (__cplusplus) \
314*11efff7fSkettenis 	 || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
315b725ae77Skettenis 
316b725ae77Skettenis /* A type that is properly aligned for any stack member.  */
317b725ae77Skettenis union yyalloc
318b725ae77Skettenis {
319b725ae77Skettenis   short yyss;
320b725ae77Skettenis   YYSTYPE yyvs;
321b725ae77Skettenis   };
322b725ae77Skettenis 
323b725ae77Skettenis /* The size of the maximum gap between one aligned stack and the next.  */
324*11efff7fSkettenis # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
325b725ae77Skettenis 
326b725ae77Skettenis /* The size of an array large to enough to hold all stacks, each with
327b725ae77Skettenis    N elements.  */
328b725ae77Skettenis # define YYSTACK_BYTES(N) \
329b725ae77Skettenis      ((N) * (sizeof (short) + sizeof (YYSTYPE))				\
330*11efff7fSkettenis       + YYSTACK_GAP_MAXIMUM)
331b725ae77Skettenis 
332b725ae77Skettenis /* Copy COUNT objects from FROM to TO.  The source and destination do
333b725ae77Skettenis    not overlap.  */
334b725ae77Skettenis # ifndef YYCOPY
335*11efff7fSkettenis #  if defined (__GNUC__) && 1 < __GNUC__
336b725ae77Skettenis #   define YYCOPY(To, From, Count) \
337b725ae77Skettenis       __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
338b725ae77Skettenis #  else
339b725ae77Skettenis #   define YYCOPY(To, From, Count)		\
340b725ae77Skettenis       do					\
341b725ae77Skettenis 	{					\
342b725ae77Skettenis 	  register YYSIZE_T yyi;		\
343b725ae77Skettenis 	  for (yyi = 0; yyi < (Count); yyi++)	\
344b725ae77Skettenis 	    (To)[yyi] = (From)[yyi];		\
345b725ae77Skettenis 	}					\
346b725ae77Skettenis       while (0)
347b725ae77Skettenis #  endif
348b725ae77Skettenis # endif
349b725ae77Skettenis 
350b725ae77Skettenis /* Relocate STACK from its old location to the new one.  The
351b725ae77Skettenis    local variables YYSIZE and YYSTACKSIZE give the old and new number of
352b725ae77Skettenis    elements in the stack, and YYPTR gives the new location of the
353b725ae77Skettenis    stack.  Advance YYPTR to a properly aligned location for the next
354b725ae77Skettenis    stack.  */
355b725ae77Skettenis # define YYSTACK_RELOCATE(Stack)					\
356b725ae77Skettenis     do									\
357b725ae77Skettenis       {									\
358b725ae77Skettenis 	YYSIZE_T yynewbytes;						\
359b725ae77Skettenis 	YYCOPY (&yyptr->Stack, Stack, yysize);				\
360b725ae77Skettenis 	Stack = &yyptr->Stack;						\
361*11efff7fSkettenis 	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
362b725ae77Skettenis 	yyptr += yynewbytes / sizeof (*yyptr);				\
363b725ae77Skettenis       }									\
364b725ae77Skettenis     while (0)
365b725ae77Skettenis 
366b725ae77Skettenis #endif
367b725ae77Skettenis 
368*11efff7fSkettenis #if defined (__STDC__) || defined (__cplusplus)
369*11efff7fSkettenis    typedef signed char yysigned_char;
370*11efff7fSkettenis #else
371*11efff7fSkettenis    typedef short yysigned_char;
372*11efff7fSkettenis #endif
373*11efff7fSkettenis 
374*11efff7fSkettenis /* YYFINAL -- State number of the termination state. */
375*11efff7fSkettenis #define YYFINAL  3
376*11efff7fSkettenis /* YYLAST -- Last index in YYTABLE.  */
377*11efff7fSkettenis #define YYLAST   359
378*11efff7fSkettenis 
379*11efff7fSkettenis /* YYNTOKENS -- Number of terminals. */
380*11efff7fSkettenis #define YYNTOKENS  52
381*11efff7fSkettenis /* YYNNTS -- Number of nonterminals. */
382*11efff7fSkettenis #define YYNNTS  19
383*11efff7fSkettenis /* YYNRULES -- Number of rules. */
384*11efff7fSkettenis #define YYNRULES  73
385*11efff7fSkettenis /* YYNRULES -- Number of states. */
386*11efff7fSkettenis #define YYNSTATES  123
387*11efff7fSkettenis 
388*11efff7fSkettenis /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
389*11efff7fSkettenis #define YYUNDEFTOK  2
390*11efff7fSkettenis #define YYMAXUTOK   291
391*11efff7fSkettenis 
392*11efff7fSkettenis #define YYTRANSLATE(YYX) 						\
393*11efff7fSkettenis   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
394*11efff7fSkettenis 
395*11efff7fSkettenis /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
396*11efff7fSkettenis static const unsigned char yytranslate[] =
397*11efff7fSkettenis {
398*11efff7fSkettenis        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
399*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
400*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
401*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
402*11efff7fSkettenis       46,    50,    39,    37,    19,    38,    44,    40,     2,     2,
403*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
404*11efff7fSkettenis       28,    26,    29,     2,    36,     2,     2,     2,     2,     2,
405*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
406*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
407*11efff7fSkettenis        2,    45,     2,    51,    48,     2,     2,     2,     2,     2,
408*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
409*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
410*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
411*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
412*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
413*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
414*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
415*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
416*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
417*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
418*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
419*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
420*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
421*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
422*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
423*11efff7fSkettenis        2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
424*11efff7fSkettenis        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
425*11efff7fSkettenis       15,    16,    17,    18,    20,    21,    22,    23,    24,    25,
426*11efff7fSkettenis       27,    30,    31,    32,    33,    34,    35,    41,    42,    43,
427*11efff7fSkettenis       47,    49
428*11efff7fSkettenis };
429*11efff7fSkettenis 
430*11efff7fSkettenis #if YYDEBUG
431*11efff7fSkettenis /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
432*11efff7fSkettenis    YYRHS.  */
433*11efff7fSkettenis static const unsigned char yyprhs[] =
434*11efff7fSkettenis {
435*11efff7fSkettenis        0,     0,     3,     4,     7,     9,    11,    13,    15,    19,
436*11efff7fSkettenis       22,    25,    28,    31,    36,    41,    42,    47,    48,    54,
437*11efff7fSkettenis       55,    61,    62,    64,    68,    73,    77,    81,    85,    89,
438*11efff7fSkettenis       93,    97,   101,   105,   109,   113,   117,   121,   125,   129,
439*11efff7fSkettenis      133,   137,   141,   145,   149,   151,   153,   155,   157,   159,
440*11efff7fSkettenis      161,   163,   168,   170,   172,   174,   178,   182,   186,   188,
441*11efff7fSkettenis      191,   193,   195,   197,   201,   204,   206,   209,   212,   214,
442*11efff7fSkettenis      216,   218,   220,   222
443*11efff7fSkettenis };
444*11efff7fSkettenis 
445*11efff7fSkettenis /* YYRHS -- A `-1'-separated list of the rules' RHS. */
446*11efff7fSkettenis static const yysigned_char yyrhs[] =
447*11efff7fSkettenis {
448*11efff7fSkettenis       53,     0,    -1,    -1,    54,    55,    -1,    57,    -1,    56,
449*11efff7fSkettenis       -1,    67,    -1,    58,    -1,    57,    19,    58,    -1,    58,
450*11efff7fSkettenis       48,    -1,    36,    58,    -1,    38,    58,    -1,    22,    58,
451*11efff7fSkettenis       -1,    42,    46,    58,    50,    -1,    41,    46,    58,    50,
452*11efff7fSkettenis       -1,    -1,    58,    44,    59,     6,    -1,    -1,    58,    45,
453*11efff7fSkettenis       60,    57,    51,    -1,    -1,    58,    46,    61,    62,    50,
454*11efff7fSkettenis       -1,    -1,    58,    -1,    62,    19,    58,    -1,    67,    46,
455*11efff7fSkettenis       58,    50,    -1,    46,    57,    50,    -1,    58,    39,    58,
456*11efff7fSkettenis       -1,    58,    40,    58,    -1,    58,    33,    58,    -1,    58,
457*11efff7fSkettenis       32,    58,    -1,    58,    37,    58,    -1,    58,    38,    58,
458*11efff7fSkettenis       -1,    58,    35,    58,    -1,    58,    34,    58,    -1,    58,
459*11efff7fSkettenis       26,    58,    -1,    58,    27,    58,    -1,    58,    31,    58,
460*11efff7fSkettenis       -1,    58,    30,    58,    -1,    58,    28,    58,    -1,    58,
461*11efff7fSkettenis       29,    58,    -1,    58,    25,    58,    -1,    58,    24,    58,
462*11efff7fSkettenis       -1,    58,    23,    58,    -1,    58,    21,    58,    -1,    17,
463*11efff7fSkettenis       -1,    18,    -1,     3,    -1,     9,    -1,     4,    -1,    64,
464*11efff7fSkettenis       -1,    15,    -1,    12,    46,    67,    50,    -1,     5,    -1,
465*11efff7fSkettenis       16,    -1,    49,    -1,    63,    13,    69,    -1,    63,    13,
466*11efff7fSkettenis       69,    -1,    68,    13,    69,    -1,    65,    -1,    13,    69,
467*11efff7fSkettenis       -1,    70,    -1,    68,    -1,    66,    -1,    68,    13,    39,
468*11efff7fSkettenis       -1,    48,    68,    -1,     8,    -1,    10,    69,    -1,    11,
469*11efff7fSkettenis       69,    -1,     7,    -1,    49,    -1,     8,    -1,     9,    -1,
470*11efff7fSkettenis        7,    -1,    49,    -1
471*11efff7fSkettenis };
472*11efff7fSkettenis 
473*11efff7fSkettenis /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
474*11efff7fSkettenis static const unsigned short yyrline[] =
475*11efff7fSkettenis {
476*11efff7fSkettenis        0,   234,   234,   234,   241,   242,   245,   252,   253,   258,
477*11efff7fSkettenis      264,   270,   274,   278,   282,   286,   286,   301,   299,   329,
478*11efff7fSkettenis      326,   338,   339,   341,   345,   360,   366,   370,   374,   378,
479*11efff7fSkettenis      382,   386,   390,   394,   398,   402,   406,   410,   414,   418,
480*11efff7fSkettenis      422,   426,   430,   434,   438,   444,   450,   457,   468,   475,
481*11efff7fSkettenis      478,   482,   490,   515,   542,   559,   570,   586,   601,   602,
482*11efff7fSkettenis      636,   708,   719,   720,   725,   727,   729,   732,   740,   741,
483*11efff7fSkettenis      742,   743,   746,   747
484*11efff7fSkettenis };
485*11efff7fSkettenis #endif
486*11efff7fSkettenis 
487*11efff7fSkettenis #if YYDEBUG || YYERROR_VERBOSE
488*11efff7fSkettenis /* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
489*11efff7fSkettenis    First, the terminals, then, starting at YYNTOKENS, nonterminals. */
490*11efff7fSkettenis static const char *const yytname[] =
491*11efff7fSkettenis {
492*11efff7fSkettenis   "$end", "error", "$undefined", "INT", "FLOAT", "STRING", "FIELDNAME",
493*11efff7fSkettenis   "NAME", "TYPENAME", "NAME_OR_INT", "STRUCT", "CLASS", "SIZEOF",
494*11efff7fSkettenis   "COLONCOLON", "ERROR", "VARIABLE", "THIS", "TRUEKEYWORD", "FALSEKEYWORD",
495*11efff7fSkettenis   "','", "ABOVE_COMMA", "ASSIGN", "NOT", "OR", "XOR", "ANDAND", "'='",
496*11efff7fSkettenis   "NOTEQUAL", "'<'", "'>'", "GEQ", "LEQ", "MOD", "DIV", "RSH", "LSH",
497*11efff7fSkettenis   "'@'", "'+'", "'-'", "'*'", "'/'", "DECREMENT", "INCREMENT", "UNARY",
498*11efff7fSkettenis   "'.'", "'['", "'('", "ARROW", "'^'", "BLOCKNAME", "')'", "']'",
499*11efff7fSkettenis   "$accept", "start", "@1", "normal_start", "type_exp", "exp1", "exp",
500*11efff7fSkettenis   "@2", "@3", "@4", "arglist", "block", "variable", "qualified_name",
501*11efff7fSkettenis   "ptype", "type", "typebase", "name", "name_not_typename", 0
502*11efff7fSkettenis };
503*11efff7fSkettenis #endif
504*11efff7fSkettenis 
505*11efff7fSkettenis # ifdef YYPRINT
506*11efff7fSkettenis /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
507*11efff7fSkettenis    token YYLEX-NUM.  */
508*11efff7fSkettenis static const unsigned short yytoknum[] =
509*11efff7fSkettenis {
510*11efff7fSkettenis        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
511*11efff7fSkettenis      265,   266,   267,   268,   269,   270,   271,   272,   273,    44,
512*11efff7fSkettenis      274,   275,   276,   277,   278,   279,    61,   280,    60,    62,
513*11efff7fSkettenis      281,   282,   283,   284,   285,   286,    64,    43,    45,    42,
514*11efff7fSkettenis       47,   287,   288,   289,    46,    91,    40,   290,    94,   291,
515*11efff7fSkettenis       41,    93
516*11efff7fSkettenis };
517*11efff7fSkettenis # endif
518*11efff7fSkettenis 
519*11efff7fSkettenis /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
520*11efff7fSkettenis static const unsigned char yyr1[] =
521*11efff7fSkettenis {
522*11efff7fSkettenis        0,    52,    54,    53,    55,    55,    56,    57,    57,    58,
523*11efff7fSkettenis       58,    58,    58,    58,    58,    59,    58,    60,    58,    61,
524*11efff7fSkettenis       58,    62,    62,    62,    58,    58,    58,    58,    58,    58,
525*11efff7fSkettenis       58,    58,    58,    58,    58,    58,    58,    58,    58,    58,
526*11efff7fSkettenis       58,    58,    58,    58,    58,    58,    58,    58,    58,    58,
527*11efff7fSkettenis       58,    58,    58,    58,    63,    63,    64,    65,    64,    64,
528*11efff7fSkettenis       64,    66,    67,    67,    68,    68,    68,    68,    69,    69,
529*11efff7fSkettenis       69,    69,    70,    70
530*11efff7fSkettenis };
531*11efff7fSkettenis 
532*11efff7fSkettenis /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
533*11efff7fSkettenis static const unsigned char yyr2[] =
534*11efff7fSkettenis {
535*11efff7fSkettenis        0,     2,     0,     2,     1,     1,     1,     1,     3,     2,
536*11efff7fSkettenis        2,     2,     2,     4,     4,     0,     4,     0,     5,     0,
537*11efff7fSkettenis        5,     0,     1,     3,     4,     3,     3,     3,     3,     3,
538*11efff7fSkettenis        3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
539*11efff7fSkettenis        3,     3,     3,     3,     1,     1,     1,     1,     1,     1,
540*11efff7fSkettenis        1,     4,     1,     1,     1,     3,     3,     3,     1,     2,
541*11efff7fSkettenis        1,     1,     1,     3,     2,     1,     2,     2,     1,     1,
542*11efff7fSkettenis        1,     1,     1,     1
543*11efff7fSkettenis };
544*11efff7fSkettenis 
545*11efff7fSkettenis /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
546*11efff7fSkettenis    STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
547*11efff7fSkettenis    means the default is an error.  */
548*11efff7fSkettenis static const unsigned char yydefact[] =
549*11efff7fSkettenis {
550*11efff7fSkettenis        2,     0,     0,     1,    46,    48,    52,    72,    65,    47,
551*11efff7fSkettenis        0,     0,     0,     0,    50,    53,    44,    45,     0,     0,
552*11efff7fSkettenis        0,     0,     0,     0,     0,    73,     3,     5,     4,     7,
553*11efff7fSkettenis        0,    49,    58,    62,     6,    61,    60,    68,    70,    71,
554*11efff7fSkettenis       69,    66,    67,     0,    59,    12,     0,    10,    11,     0,
555*11efff7fSkettenis        0,     0,    64,     0,     0,     0,     0,     0,     0,     0,
556*11efff7fSkettenis        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
557*11efff7fSkettenis        0,     0,    15,    17,    19,     9,     0,     0,     0,     0,
558*11efff7fSkettenis       61,     0,     0,    25,     8,    43,    42,    41,    40,    34,
559*11efff7fSkettenis       35,    38,    39,    37,    36,    29,    28,    33,    32,    30,
560*11efff7fSkettenis       31,    26,    27,     0,     0,    21,    56,     0,    63,    57,
561*11efff7fSkettenis       51,     0,    14,    13,    16,     0,    22,     0,    24,    18,
562*11efff7fSkettenis        0,    20,    23
563*11efff7fSkettenis };
564*11efff7fSkettenis 
565*11efff7fSkettenis /* YYDEFGOTO[NTERM-NUM]. */
566*11efff7fSkettenis static const yysigned_char yydefgoto[] =
567*11efff7fSkettenis {
568*11efff7fSkettenis       -1,     1,     2,    26,    27,    28,    29,   103,   104,   105,
569*11efff7fSkettenis      117,    30,    31,    32,    33,    46,    35,    41,    36
570*11efff7fSkettenis };
571*11efff7fSkettenis 
572*11efff7fSkettenis /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
573*11efff7fSkettenis    STATE-NUM.  */
574*11efff7fSkettenis #define YYPACT_NINF -37
575*11efff7fSkettenis static const short yypact[] =
576*11efff7fSkettenis {
577*11efff7fSkettenis      -37,     5,    88,   -37,   -37,   -37,   -37,   -37,   -37,   -37,
578*11efff7fSkettenis        6,     6,   -35,     6,   -37,   -37,   -37,   -37,    88,    88,
579*11efff7fSkettenis       88,   -29,   -27,    88,    10,    12,   -37,   -37,     8,   201,
580*11efff7fSkettenis       16,   -37,   -37,   -37,   -13,    21,   -37,   -37,   -37,   -37,
581*11efff7fSkettenis      -37,   -37,   -37,    10,   -37,   -36,   -13,   -36,   -36,    88,
582*11efff7fSkettenis       88,    11,   -37,    88,    88,    88,    88,    88,    88,    88,
583*11efff7fSkettenis       88,    88,    88,    88,    88,    88,    88,    88,    88,    88,
584*11efff7fSkettenis       88,    88,   -37,   -37,   -37,   -37,     6,    88,    15,    20,
585*11efff7fSkettenis       43,   117,   145,   -37,   201,   201,   226,   250,   273,   294,
586*11efff7fSkettenis      294,   311,   311,   311,   311,    28,    28,    28,    28,    68,
587*11efff7fSkettenis       68,   -36,   -36,    56,    88,    88,    62,   173,   -37,   -37,
588*11efff7fSkettenis      -37,    38,   -37,   -37,   -37,     9,   201,    44,   -37,   -37,
589*11efff7fSkettenis       88,   -37,   201
590*11efff7fSkettenis };
591*11efff7fSkettenis 
592*11efff7fSkettenis /* YYPGOTO[NTERM-NUM].  */
593*11efff7fSkettenis static const yysigned_char yypgoto[] =
594*11efff7fSkettenis {
595*11efff7fSkettenis      -37,   -37,   -37,   -37,   -37,   -20,   -18,   -37,   -37,   -37,
596*11efff7fSkettenis      -37,   -37,   -37,   -37,   -37,    14,   -17,    -7,   -37
597*11efff7fSkettenis };
598*11efff7fSkettenis 
599*11efff7fSkettenis /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
600*11efff7fSkettenis    positive, shift that token.  If negative, reduce the rule which
601*11efff7fSkettenis    number is the opposite.  If zero, do what YYDEFACT says.
602*11efff7fSkettenis    If YYTABLE_NINF, syntax error.  */
603*11efff7fSkettenis #define YYTABLE_NINF -56
604*11efff7fSkettenis static const yysigned_char yytable[] =
605*11efff7fSkettenis {
606*11efff7fSkettenis       45,    47,    48,    51,    42,     3,    44,    52,    72,    73,
607*11efff7fSkettenis       74,    43,    75,    37,    38,    39,    34,    49,     8,    50,
608*11efff7fSkettenis       10,    11,    37,    38,    39,   -54,    80,    53,    53,    76,
609*11efff7fSkettenis       53,    81,    82,    77,    78,    84,    85,    86,    87,    88,
610*11efff7fSkettenis       89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
611*11efff7fSkettenis       99,   100,   101,   102,   108,    40,   111,    79,    24,   107,
612*11efff7fSkettenis      119,    83,   114,   120,    40,    68,    69,    70,    71,   106,
613*11efff7fSkettenis      110,   109,    72,    73,    74,   -55,    75,   108,     0,     0,
614*11efff7fSkettenis        0,     0,     0,     0,   115,     0,     0,   116,     0,     0,
615*11efff7fSkettenis        0,     4,     5,     6,   121,     7,     8,     9,    10,    11,
616*11efff7fSkettenis       12,    13,   122,    14,    15,    16,    17,    70,    71,     0,
617*11efff7fSkettenis       18,     0,    72,    73,    74,     0,    75,     0,     0,     0,
618*11efff7fSkettenis        0,     0,     0,     0,    19,     0,    20,     0,     0,    21,
619*11efff7fSkettenis       22,     0,     0,     0,    23,     0,    24,    25,    54,     0,
620*11efff7fSkettenis       55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
621*11efff7fSkettenis       65,    66,    67,     0,    68,    69,    70,    71,     0,     0,
622*11efff7fSkettenis        0,    72,    73,    74,     0,    75,    54,   112,    55,    56,
623*11efff7fSkettenis       57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
624*11efff7fSkettenis       67,     0,    68,    69,    70,    71,     0,     0,     0,    72,
625*11efff7fSkettenis       73,    74,     0,    75,    54,   113,    55,    56,    57,    58,
626*11efff7fSkettenis       59,    60,    61,    62,    63,    64,    65,    66,    67,     0,
627*11efff7fSkettenis       68,    69,    70,    71,     0,     0,     0,    72,    73,    74,
628*11efff7fSkettenis        0,    75,    54,   118,    55,    56,    57,    58,    59,    60,
629*11efff7fSkettenis       61,    62,    63,    64,    65,    66,    67,     0,    68,    69,
630*11efff7fSkettenis       70,    71,     0,     0,     0,    72,    73,    74,     0,    75,
631*11efff7fSkettenis       56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
632*11efff7fSkettenis       66,    67,     0,    68,    69,    70,    71,     0,     0,     0,
633*11efff7fSkettenis       72,    73,    74,     0,    75,    57,    58,    59,    60,    61,
634*11efff7fSkettenis       62,    63,    64,    65,    66,    67,     0,    68,    69,    70,
635*11efff7fSkettenis       71,     0,     0,     0,    72,    73,    74,     0,    75,    58,
636*11efff7fSkettenis       59,    60,    61,    62,    63,    64,    65,    66,    67,     0,
637*11efff7fSkettenis       68,    69,    70,    71,     0,     0,     0,    72,    73,    74,
638*11efff7fSkettenis        0,    75,    60,    61,    62,    63,    64,    65,    66,    67,
639*11efff7fSkettenis        0,    68,    69,    70,    71,     0,     0,     0,    72,    73,
640*11efff7fSkettenis       74,     0,    75,    64,    65,    66,    67,     0,    68,    69,
641*11efff7fSkettenis       70,    71,     0,     0,     0,    72,    73,    74,     0,    75
642*11efff7fSkettenis };
643*11efff7fSkettenis 
644*11efff7fSkettenis static const yysigned_char yycheck[] =
645*11efff7fSkettenis {
646*11efff7fSkettenis       18,    19,    20,    23,    11,     0,    13,    24,    44,    45,
647*11efff7fSkettenis       46,    46,    48,     7,     8,     9,     2,    46,     8,    46,
648*11efff7fSkettenis       10,    11,     7,     8,     9,    13,    43,    19,    19,    13,
649*11efff7fSkettenis       19,    49,    50,    46,    13,    53,    54,    55,    56,    57,
650*11efff7fSkettenis       58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
651*11efff7fSkettenis       68,    69,    70,    71,    39,    49,    13,    43,    48,    77,
652*11efff7fSkettenis       51,    50,     6,    19,    49,    37,    38,    39,    40,    76,
653*11efff7fSkettenis       50,    78,    44,    45,    46,    13,    48,    39,    -1,    -1,
654*11efff7fSkettenis       -1,    -1,    -1,    -1,   104,    -1,    -1,   105,    -1,    -1,
655*11efff7fSkettenis       -1,     3,     4,     5,    50,     7,     8,     9,    10,    11,
656*11efff7fSkettenis       12,    13,   120,    15,    16,    17,    18,    39,    40,    -1,
657*11efff7fSkettenis       22,    -1,    44,    45,    46,    -1,    48,    -1,    -1,    -1,
658*11efff7fSkettenis       -1,    -1,    -1,    -1,    36,    -1,    38,    -1,    -1,    41,
659*11efff7fSkettenis       42,    -1,    -1,    -1,    46,    -1,    48,    49,    21,    -1,
660*11efff7fSkettenis       23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
661*11efff7fSkettenis       33,    34,    35,    -1,    37,    38,    39,    40,    -1,    -1,
662*11efff7fSkettenis       -1,    44,    45,    46,    -1,    48,    21,    50,    23,    24,
663*11efff7fSkettenis       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
664*11efff7fSkettenis       35,    -1,    37,    38,    39,    40,    -1,    -1,    -1,    44,
665*11efff7fSkettenis       45,    46,    -1,    48,    21,    50,    23,    24,    25,    26,
666*11efff7fSkettenis       27,    28,    29,    30,    31,    32,    33,    34,    35,    -1,
667*11efff7fSkettenis       37,    38,    39,    40,    -1,    -1,    -1,    44,    45,    46,
668*11efff7fSkettenis       -1,    48,    21,    50,    23,    24,    25,    26,    27,    28,
669*11efff7fSkettenis       29,    30,    31,    32,    33,    34,    35,    -1,    37,    38,
670*11efff7fSkettenis       39,    40,    -1,    -1,    -1,    44,    45,    46,    -1,    48,
671*11efff7fSkettenis       24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
672*11efff7fSkettenis       34,    35,    -1,    37,    38,    39,    40,    -1,    -1,    -1,
673*11efff7fSkettenis       44,    45,    46,    -1,    48,    25,    26,    27,    28,    29,
674*11efff7fSkettenis       30,    31,    32,    33,    34,    35,    -1,    37,    38,    39,
675*11efff7fSkettenis       40,    -1,    -1,    -1,    44,    45,    46,    -1,    48,    26,
676*11efff7fSkettenis       27,    28,    29,    30,    31,    32,    33,    34,    35,    -1,
677*11efff7fSkettenis       37,    38,    39,    40,    -1,    -1,    -1,    44,    45,    46,
678*11efff7fSkettenis       -1,    48,    28,    29,    30,    31,    32,    33,    34,    35,
679*11efff7fSkettenis       -1,    37,    38,    39,    40,    -1,    -1,    -1,    44,    45,
680*11efff7fSkettenis       46,    -1,    48,    32,    33,    34,    35,    -1,    37,    38,
681*11efff7fSkettenis       39,    40,    -1,    -1,    -1,    44,    45,    46,    -1,    48
682*11efff7fSkettenis };
683*11efff7fSkettenis 
684*11efff7fSkettenis /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
685*11efff7fSkettenis    symbol of state STATE-NUM.  */
686*11efff7fSkettenis static const unsigned char yystos[] =
687*11efff7fSkettenis {
688*11efff7fSkettenis        0,    53,    54,     0,     3,     4,     5,     7,     8,     9,
689*11efff7fSkettenis       10,    11,    12,    13,    15,    16,    17,    18,    22,    36,
690*11efff7fSkettenis       38,    41,    42,    46,    48,    49,    55,    56,    57,    58,
691*11efff7fSkettenis       63,    64,    65,    66,    67,    68,    70,     7,     8,     9,
692*11efff7fSkettenis       49,    69,    69,    46,    69,    58,    67,    58,    58,    46,
693*11efff7fSkettenis       46,    57,    68,    19,    21,    23,    24,    25,    26,    27,
694*11efff7fSkettenis       28,    29,    30,    31,    32,    33,    34,    35,    37,    38,
695*11efff7fSkettenis       39,    40,    44,    45,    46,    48,    13,    46,    13,    67,
696*11efff7fSkettenis       68,    58,    58,    50,    58,    58,    58,    58,    58,    58,
697*11efff7fSkettenis       58,    58,    58,    58,    58,    58,    58,    58,    58,    58,
698*11efff7fSkettenis       58,    58,    58,    59,    60,    61,    69,    58,    39,    69,
699*11efff7fSkettenis       50,    13,    50,    50,     6,    57,    58,    62,    50,    51,
700*11efff7fSkettenis       19,    50,    58
701*11efff7fSkettenis };
702b725ae77Skettenis 
703b725ae77Skettenis #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
704b725ae77Skettenis # define YYSIZE_T __SIZE_TYPE__
705b725ae77Skettenis #endif
706b725ae77Skettenis #if ! defined (YYSIZE_T) && defined (size_t)
707b725ae77Skettenis # define YYSIZE_T size_t
708b725ae77Skettenis #endif
709b725ae77Skettenis #if ! defined (YYSIZE_T)
710b725ae77Skettenis # if defined (__STDC__) || defined (__cplusplus)
711b725ae77Skettenis #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
712b725ae77Skettenis #  define YYSIZE_T size_t
713b725ae77Skettenis # endif
714b725ae77Skettenis #endif
715b725ae77Skettenis #if ! defined (YYSIZE_T)
716b725ae77Skettenis # define YYSIZE_T unsigned int
717b725ae77Skettenis #endif
718b725ae77Skettenis 
719b725ae77Skettenis #define yyerrok		(yyerrstatus = 0)
720b725ae77Skettenis #define yyclearin	(yychar = YYEMPTY)
721*11efff7fSkettenis #define YYEMPTY		(-2)
722b725ae77Skettenis #define YYEOF		0
723*11efff7fSkettenis 
724b725ae77Skettenis #define YYACCEPT	goto yyacceptlab
725b725ae77Skettenis #define YYABORT		goto yyabortlab
726*11efff7fSkettenis #define YYERROR		goto yyerrorlab
727*11efff7fSkettenis 
728*11efff7fSkettenis 
729b725ae77Skettenis /* Like YYERROR except do call yyerror.  This remains here temporarily
730b725ae77Skettenis    to ease the transition to the new meaning of YYERROR, for GCC.
731b725ae77Skettenis    Once GCC version 2 has supplanted version 1, this can go.  */
732*11efff7fSkettenis 
733b725ae77Skettenis #define YYFAIL		goto yyerrlab
734*11efff7fSkettenis 
735b725ae77Skettenis #define YYRECOVERING()  (!!yyerrstatus)
736*11efff7fSkettenis 
737b725ae77Skettenis #define YYBACKUP(Token, Value)					\
738b725ae77Skettenis do								\
739b725ae77Skettenis   if (yychar == YYEMPTY && yylen == 1)				\
740b725ae77Skettenis     {								\
741b725ae77Skettenis       yychar = (Token);						\
742b725ae77Skettenis       yylval = (Value);						\
743*11efff7fSkettenis       yytoken = YYTRANSLATE (yychar);				\
744b725ae77Skettenis       YYPOPSTACK;						\
745b725ae77Skettenis       goto yybackup;						\
746b725ae77Skettenis     }								\
747b725ae77Skettenis   else								\
748b725ae77Skettenis     { 								\
749b725ae77Skettenis       yyerror ("syntax error: cannot back up");\
750b725ae77Skettenis       YYERROR;							\
751b725ae77Skettenis     }								\
752b725ae77Skettenis while (0)
753b725ae77Skettenis 
754b725ae77Skettenis #define YYTERROR	1
755b725ae77Skettenis #define YYERRCODE	256
756b725ae77Skettenis 
757b725ae77Skettenis /* YYLLOC_DEFAULT -- Compute the default location (before the actions
758*11efff7fSkettenis    are run).  */
759b725ae77Skettenis 
760b725ae77Skettenis #ifndef YYLLOC_DEFAULT
761b725ae77Skettenis # define YYLLOC_DEFAULT(Current, Rhs, N)		\
762*11efff7fSkettenis    ((Current).first_line   = (Rhs)[1].first_line,	\
763*11efff7fSkettenis     (Current).first_column = (Rhs)[1].first_column,	\
764*11efff7fSkettenis     (Current).last_line    = (Rhs)[N].last_line,	\
765*11efff7fSkettenis     (Current).last_column  = (Rhs)[N].last_column)
766b725ae77Skettenis #endif
767b725ae77Skettenis 
768b725ae77Skettenis /* YYLEX -- calling `yylex' with the right arguments.  */
769b725ae77Skettenis 
770b725ae77Skettenis #ifdef YYLEX_PARAM
771*11efff7fSkettenis # define YYLEX yylex (YYLEX_PARAM)
772b725ae77Skettenis #else
773b725ae77Skettenis # define YYLEX yylex ()
774*11efff7fSkettenis #endif
775b725ae77Skettenis 
776b725ae77Skettenis /* Enable debugging if requested.  */
777b725ae77Skettenis #if YYDEBUG
778b725ae77Skettenis 
779b725ae77Skettenis # ifndef YYFPRINTF
780b725ae77Skettenis #  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
781b725ae77Skettenis #  define YYFPRINTF fprintf
782b725ae77Skettenis # endif
783b725ae77Skettenis 
784b725ae77Skettenis # define YYDPRINTF(Args)			\
785b725ae77Skettenis do {						\
786b725ae77Skettenis   if (yydebug)					\
787b725ae77Skettenis     YYFPRINTF Args;				\
788b725ae77Skettenis } while (0)
789*11efff7fSkettenis 
790*11efff7fSkettenis # define YYDSYMPRINT(Args)			\
791*11efff7fSkettenis do {						\
792*11efff7fSkettenis   if (yydebug)					\
793*11efff7fSkettenis     yysymprint Args;				\
794*11efff7fSkettenis } while (0)
795*11efff7fSkettenis 
796*11efff7fSkettenis # define YYDSYMPRINTF(Title, Token, Value, Location)		\
797*11efff7fSkettenis do {								\
798*11efff7fSkettenis   if (yydebug)							\
799*11efff7fSkettenis     {								\
800*11efff7fSkettenis       YYFPRINTF (stderr, "%s ", Title);				\
801*11efff7fSkettenis       yysymprint (stderr, 					\
802*11efff7fSkettenis                   Token, Value);	\
803*11efff7fSkettenis       YYFPRINTF (stderr, "\n");					\
804*11efff7fSkettenis     }								\
805*11efff7fSkettenis } while (0)
806*11efff7fSkettenis 
807*11efff7fSkettenis /*------------------------------------------------------------------.
808*11efff7fSkettenis | yy_stack_print -- Print the state stack from its BOTTOM up to its |
809*11efff7fSkettenis | TOP (included).                                                   |
810*11efff7fSkettenis `------------------------------------------------------------------*/
811*11efff7fSkettenis 
812*11efff7fSkettenis #if defined (__STDC__) || defined (__cplusplus)
813*11efff7fSkettenis static void
yy_stack_print(short * bottom,short * top)814*11efff7fSkettenis yy_stack_print (short *bottom, short *top)
815*11efff7fSkettenis #else
816*11efff7fSkettenis static void
817*11efff7fSkettenis yy_stack_print (bottom, top)
818*11efff7fSkettenis     short *bottom;
819*11efff7fSkettenis     short *top;
820*11efff7fSkettenis #endif
821*11efff7fSkettenis {
822*11efff7fSkettenis   YYFPRINTF (stderr, "Stack now");
823*11efff7fSkettenis   for (/* Nothing. */; bottom <= top; ++bottom)
824*11efff7fSkettenis     YYFPRINTF (stderr, " %d", *bottom);
825*11efff7fSkettenis   YYFPRINTF (stderr, "\n");
826*11efff7fSkettenis }
827*11efff7fSkettenis 
828*11efff7fSkettenis # define YY_STACK_PRINT(Bottom, Top)				\
829*11efff7fSkettenis do {								\
830*11efff7fSkettenis   if (yydebug)							\
831*11efff7fSkettenis     yy_stack_print ((Bottom), (Top));				\
832*11efff7fSkettenis } while (0)
833*11efff7fSkettenis 
834*11efff7fSkettenis 
835*11efff7fSkettenis /*------------------------------------------------.
836*11efff7fSkettenis | Report that the YYRULE is going to be reduced.  |
837*11efff7fSkettenis `------------------------------------------------*/
838*11efff7fSkettenis 
839*11efff7fSkettenis #if defined (__STDC__) || defined (__cplusplus)
840*11efff7fSkettenis static void
yy_reduce_print(int yyrule)841*11efff7fSkettenis yy_reduce_print (int yyrule)
842*11efff7fSkettenis #else
843*11efff7fSkettenis static void
844*11efff7fSkettenis yy_reduce_print (yyrule)
845*11efff7fSkettenis     int yyrule;
846*11efff7fSkettenis #endif
847*11efff7fSkettenis {
848*11efff7fSkettenis   int yyi;
849*11efff7fSkettenis   unsigned int yylno = yyrline[yyrule];
850*11efff7fSkettenis   YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
851*11efff7fSkettenis              yyrule - 1, yylno);
852*11efff7fSkettenis   /* Print the symbols being reduced, and their result.  */
853*11efff7fSkettenis   for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
854*11efff7fSkettenis     YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
855*11efff7fSkettenis   YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
856*11efff7fSkettenis }
857*11efff7fSkettenis 
858*11efff7fSkettenis # define YY_REDUCE_PRINT(Rule)		\
859*11efff7fSkettenis do {					\
860*11efff7fSkettenis   if (yydebug)				\
861*11efff7fSkettenis     yy_reduce_print (Rule);		\
862*11efff7fSkettenis } while (0)
863*11efff7fSkettenis 
864b725ae77Skettenis /* Nonzero means print parse trace.  It is left uninitialized so that
865b725ae77Skettenis    multiple parsers can coexist.  */
866b725ae77Skettenis int yydebug;
867b725ae77Skettenis #else /* !YYDEBUG */
868b725ae77Skettenis # define YYDPRINTF(Args)
869*11efff7fSkettenis # define YYDSYMPRINT(Args)
870*11efff7fSkettenis # define YYDSYMPRINTF(Title, Token, Value, Location)
871*11efff7fSkettenis # define YY_STACK_PRINT(Bottom, Top)
872*11efff7fSkettenis # define YY_REDUCE_PRINT(Rule)
873b725ae77Skettenis #endif /* !YYDEBUG */
874b725ae77Skettenis 
875*11efff7fSkettenis 
876b725ae77Skettenis /* YYINITDEPTH -- initial size of the parser's stacks.  */
877b725ae77Skettenis #ifndef	YYINITDEPTH
878b725ae77Skettenis # define YYINITDEPTH 200
879b725ae77Skettenis #endif
880b725ae77Skettenis 
881b725ae77Skettenis /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
882b725ae77Skettenis    if the built-in stack extension method is used).
883b725ae77Skettenis 
884b725ae77Skettenis    Do not make this value too large; the results are undefined if
885b725ae77Skettenis    SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
886b725ae77Skettenis    evaluated with infinite-precision integer arithmetic.  */
887b725ae77Skettenis 
888*11efff7fSkettenis #if defined (YYMAXDEPTH) && YYMAXDEPTH == 0
889b725ae77Skettenis # undef YYMAXDEPTH
890b725ae77Skettenis #endif
891b725ae77Skettenis 
892b725ae77Skettenis #ifndef YYMAXDEPTH
893b725ae77Skettenis # define YYMAXDEPTH 10000
894b725ae77Skettenis #endif
895*11efff7fSkettenis 
896b725ae77Skettenis 
897*11efff7fSkettenis 
898*11efff7fSkettenis #if YYERROR_VERBOSE
899b725ae77Skettenis 
900b725ae77Skettenis # ifndef yystrlen
901b725ae77Skettenis #  if defined (__GLIBC__) && defined (_STRING_H)
902b725ae77Skettenis #   define yystrlen strlen
903b725ae77Skettenis #  else
904b725ae77Skettenis /* Return the length of YYSTR.  */
905b725ae77Skettenis static YYSIZE_T
906b725ae77Skettenis #   if defined (__STDC__) || defined (__cplusplus)
yystrlen(const char * yystr)907b725ae77Skettenis yystrlen (const char *yystr)
908b725ae77Skettenis #   else
909b725ae77Skettenis yystrlen (yystr)
910b725ae77Skettenis      const char *yystr;
911b725ae77Skettenis #   endif
912b725ae77Skettenis {
913b725ae77Skettenis   register const char *yys = yystr;
914b725ae77Skettenis 
915b725ae77Skettenis   while (*yys++ != '\0')
916b725ae77Skettenis     continue;
917b725ae77Skettenis 
918b725ae77Skettenis   return yys - yystr - 1;
919b725ae77Skettenis }
920b725ae77Skettenis #  endif
921b725ae77Skettenis # endif
922b725ae77Skettenis 
923b725ae77Skettenis # ifndef yystpcpy
924b725ae77Skettenis #  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
925b725ae77Skettenis #   define yystpcpy stpcpy
926b725ae77Skettenis #  else
927b725ae77Skettenis /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
928b725ae77Skettenis    YYDEST.  */
929b725ae77Skettenis static char *
930b725ae77Skettenis #   if defined (__STDC__) || defined (__cplusplus)
yystpcpy(char * yydest,const char * yysrc)931b725ae77Skettenis yystpcpy (char *yydest, const char *yysrc)
932b725ae77Skettenis #   else
933b725ae77Skettenis yystpcpy (yydest, yysrc)
934b725ae77Skettenis      char *yydest;
935b725ae77Skettenis      const char *yysrc;
936b725ae77Skettenis #   endif
937b725ae77Skettenis {
938b725ae77Skettenis   register char *yyd = yydest;
939b725ae77Skettenis   register const char *yys = yysrc;
940b725ae77Skettenis 
941b725ae77Skettenis   while ((*yyd++ = *yys++) != '\0')
942b725ae77Skettenis     continue;
943b725ae77Skettenis 
944b725ae77Skettenis   return yyd - 1;
945b725ae77Skettenis }
946b725ae77Skettenis #  endif
947b725ae77Skettenis # endif
948*11efff7fSkettenis 
949*11efff7fSkettenis #endif /* !YYERROR_VERBOSE */
950*11efff7fSkettenis 
951b725ae77Skettenis 
952b725ae77Skettenis 
953*11efff7fSkettenis #if YYDEBUG
954*11efff7fSkettenis /*--------------------------------.
955*11efff7fSkettenis | Print this symbol on YYOUTPUT.  |
956*11efff7fSkettenis `--------------------------------*/
957b725ae77Skettenis 
958*11efff7fSkettenis #if defined (__STDC__) || defined (__cplusplus)
959*11efff7fSkettenis static void
yysymprint(FILE * yyoutput,int yytype,YYSTYPE * yyvaluep)960*11efff7fSkettenis yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
961*11efff7fSkettenis #else
962*11efff7fSkettenis static void
963*11efff7fSkettenis yysymprint (yyoutput, yytype, yyvaluep)
964*11efff7fSkettenis     FILE *yyoutput;
965*11efff7fSkettenis     int yytype;
966*11efff7fSkettenis     YYSTYPE *yyvaluep;
967*11efff7fSkettenis #endif
968*11efff7fSkettenis {
969*11efff7fSkettenis   /* Pacify ``unused variable'' warnings.  */
970*11efff7fSkettenis   (void) yyvaluep;
971*11efff7fSkettenis 
972*11efff7fSkettenis   if (yytype < YYNTOKENS)
973*11efff7fSkettenis     {
974*11efff7fSkettenis       YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
975*11efff7fSkettenis # ifdef YYPRINT
976*11efff7fSkettenis       YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
977*11efff7fSkettenis # endif
978*11efff7fSkettenis     }
979*11efff7fSkettenis   else
980*11efff7fSkettenis     YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
981*11efff7fSkettenis 
982*11efff7fSkettenis   switch (yytype)
983*11efff7fSkettenis     {
984*11efff7fSkettenis       default:
985*11efff7fSkettenis         break;
986*11efff7fSkettenis     }
987*11efff7fSkettenis   YYFPRINTF (yyoutput, ")");
988*11efff7fSkettenis }
989*11efff7fSkettenis 
990*11efff7fSkettenis #endif /* ! YYDEBUG */
991*11efff7fSkettenis /*-----------------------------------------------.
992*11efff7fSkettenis | Release the memory associated to this symbol.  |
993*11efff7fSkettenis `-----------------------------------------------*/
994*11efff7fSkettenis 
995*11efff7fSkettenis #if defined (__STDC__) || defined (__cplusplus)
996*11efff7fSkettenis static void
yydestruct(int yytype,YYSTYPE * yyvaluep)997*11efff7fSkettenis yydestruct (int yytype, YYSTYPE *yyvaluep)
998*11efff7fSkettenis #else
999*11efff7fSkettenis static void
1000*11efff7fSkettenis yydestruct (yytype, yyvaluep)
1001*11efff7fSkettenis     int yytype;
1002*11efff7fSkettenis     YYSTYPE *yyvaluep;
1003*11efff7fSkettenis #endif
1004*11efff7fSkettenis {
1005*11efff7fSkettenis   /* Pacify ``unused variable'' warnings.  */
1006*11efff7fSkettenis   (void) yyvaluep;
1007*11efff7fSkettenis 
1008*11efff7fSkettenis   switch (yytype)
1009*11efff7fSkettenis     {
1010*11efff7fSkettenis 
1011*11efff7fSkettenis       default:
1012*11efff7fSkettenis         break;
1013*11efff7fSkettenis     }
1014*11efff7fSkettenis }
1015*11efff7fSkettenis 
1016*11efff7fSkettenis 
1017*11efff7fSkettenis /* Prevent warnings from -Wmissing-prototypes.  */
1018b725ae77Skettenis 
1019b725ae77Skettenis #ifdef YYPARSE_PARAM
1020b725ae77Skettenis # if defined (__STDC__) || defined (__cplusplus)
1021*11efff7fSkettenis int yyparse (void *YYPARSE_PARAM);
1022b725ae77Skettenis # else
1023*11efff7fSkettenis int yyparse ();
1024b725ae77Skettenis # endif
1025b725ae77Skettenis #else /* ! YYPARSE_PARAM */
1026*11efff7fSkettenis #if defined (__STDC__) || defined (__cplusplus)
1027*11efff7fSkettenis int yyparse (void);
1028*11efff7fSkettenis #else
1029*11efff7fSkettenis int yyparse ();
1030*11efff7fSkettenis #endif
1031b725ae77Skettenis #endif /* ! YYPARSE_PARAM */
1032b725ae77Skettenis 
1033b725ae77Skettenis 
1034b725ae77Skettenis 
1035*11efff7fSkettenis /* The lookahead symbol.  */
1036*11efff7fSkettenis int yychar;
1037*11efff7fSkettenis 
1038*11efff7fSkettenis /* The semantic value of the lookahead symbol.  */
1039*11efff7fSkettenis YYSTYPE yylval;
1040*11efff7fSkettenis 
1041*11efff7fSkettenis /* Number of syntax errors so far.  */
1042b725ae77Skettenis int yynerrs;
1043b725ae77Skettenis 
1044*11efff7fSkettenis 
1045*11efff7fSkettenis 
1046*11efff7fSkettenis /*----------.
1047*11efff7fSkettenis | yyparse.  |
1048*11efff7fSkettenis `----------*/
1049*11efff7fSkettenis 
1050*11efff7fSkettenis #ifdef YYPARSE_PARAM
1051*11efff7fSkettenis # if defined (__STDC__) || defined (__cplusplus)
yyparse(void * YYPARSE_PARAM)1052*11efff7fSkettenis int yyparse (void *YYPARSE_PARAM)
1053b725ae77Skettenis # else
1054*11efff7fSkettenis int yyparse (YYPARSE_PARAM)
1055*11efff7fSkettenis   void *YYPARSE_PARAM;
1056b725ae77Skettenis # endif
1057*11efff7fSkettenis #else /* ! YYPARSE_PARAM */
1058*11efff7fSkettenis #if defined (__STDC__) || defined (__cplusplus)
1059b725ae77Skettenis int
1060*11efff7fSkettenis yyparse (void)
1061*11efff7fSkettenis #else
1062*11efff7fSkettenis int
1063*11efff7fSkettenis yyparse ()
1064*11efff7fSkettenis 
1065*11efff7fSkettenis #endif
1066*11efff7fSkettenis #endif
1067b725ae77Skettenis {
1068b725ae77Skettenis 
1069b725ae77Skettenis   register int yystate;
1070b725ae77Skettenis   register int yyn;
1071b725ae77Skettenis   int yyresult;
1072b725ae77Skettenis   /* Number of tokens to shift before error messages enabled.  */
1073b725ae77Skettenis   int yyerrstatus;
1074b725ae77Skettenis   /* Lookahead token as an internal (translated) token number.  */
1075*11efff7fSkettenis   int yytoken = 0;
1076b725ae77Skettenis 
1077b725ae77Skettenis   /* Three stacks and their tools:
1078b725ae77Skettenis      `yyss': related to states,
1079b725ae77Skettenis      `yyvs': related to semantic values,
1080b725ae77Skettenis      `yyls': related to locations.
1081b725ae77Skettenis 
1082b725ae77Skettenis      Refer to the stacks thru separate pointers, to allow yyoverflow
1083b725ae77Skettenis      to xreallocate them elsewhere.  */
1084b725ae77Skettenis 
1085b725ae77Skettenis   /* The state stack.  */
1086b725ae77Skettenis   short	yyssa[YYINITDEPTH];
1087b725ae77Skettenis   short *yyss = yyssa;
1088b725ae77Skettenis   register short *yyssp;
1089b725ae77Skettenis 
1090b725ae77Skettenis   /* The semantic value stack.  */
1091b725ae77Skettenis   YYSTYPE yyvsa[YYINITDEPTH];
1092b725ae77Skettenis   YYSTYPE *yyvs = yyvsa;
1093b725ae77Skettenis   register YYSTYPE *yyvsp;
1094b725ae77Skettenis 
1095b725ae77Skettenis 
1096*11efff7fSkettenis 
1097b725ae77Skettenis #define YYPOPSTACK   (yyvsp--, yyssp--)
1098b725ae77Skettenis 
1099b725ae77Skettenis   YYSIZE_T yystacksize = YYINITDEPTH;
1100b725ae77Skettenis 
1101b725ae77Skettenis   /* The variables used to return semantic value and location from the
1102b725ae77Skettenis      action routines.  */
1103b725ae77Skettenis   YYSTYPE yyval;
1104*11efff7fSkettenis 
1105b725ae77Skettenis 
1106b725ae77Skettenis   /* When reducing, the number of symbols on the RHS of the reduced
1107b725ae77Skettenis      rule.  */
1108b725ae77Skettenis   int yylen;
1109b725ae77Skettenis 
1110b725ae77Skettenis   YYDPRINTF ((stderr, "Starting parse\n"));
1111b725ae77Skettenis 
1112b725ae77Skettenis   yystate = 0;
1113b725ae77Skettenis   yyerrstatus = 0;
1114b725ae77Skettenis   yynerrs = 0;
1115b725ae77Skettenis   yychar = YYEMPTY;		/* Cause a token to be read.  */
1116b725ae77Skettenis 
1117b725ae77Skettenis   /* Initialize stack pointers.
1118b725ae77Skettenis      Waste one element of value and location stack
1119b725ae77Skettenis      so that they stay on the same level as the state stack.
1120b725ae77Skettenis      The wasted elements are never initialized.  */
1121b725ae77Skettenis 
1122b725ae77Skettenis   yyssp = yyss;
1123b725ae77Skettenis   yyvsp = yyvs;
1124*11efff7fSkettenis 
1125b725ae77Skettenis   goto yysetstate;
1126b725ae77Skettenis 
1127b725ae77Skettenis /*------------------------------------------------------------.
1128b725ae77Skettenis | yynewstate -- Push a new state, which is found in yystate.  |
1129b725ae77Skettenis `------------------------------------------------------------*/
1130b725ae77Skettenis  yynewstate:
1131b725ae77Skettenis   /* In all cases, when you get here, the value and location stacks
1132b725ae77Skettenis      have just been pushed. so pushing a state here evens the stacks.
1133b725ae77Skettenis      */
1134b725ae77Skettenis   yyssp++;
1135b725ae77Skettenis 
1136b725ae77Skettenis  yysetstate:
1137b725ae77Skettenis   *yyssp = yystate;
1138b725ae77Skettenis 
1139*11efff7fSkettenis   if (yyss + yystacksize - 1 <= yyssp)
1140b725ae77Skettenis     {
1141b725ae77Skettenis       /* Get the current used size of the three stacks, in elements.  */
1142b725ae77Skettenis       YYSIZE_T yysize = yyssp - yyss + 1;
1143b725ae77Skettenis 
1144b725ae77Skettenis #ifdef yyoverflow
1145b725ae77Skettenis       {
1146b725ae77Skettenis 	/* Give user a chance to xreallocate the stack. Use copies of
1147b725ae77Skettenis 	   these so that the &'s don't force the real ones into
1148b725ae77Skettenis 	   memory.  */
1149b725ae77Skettenis 	YYSTYPE *yyvs1 = yyvs;
1150b725ae77Skettenis 	short *yyss1 = yyss;
1151b725ae77Skettenis 
1152*11efff7fSkettenis 
1153b725ae77Skettenis 	/* Each stack pointer address is followed by the size of the
1154*11efff7fSkettenis 	   data in use in that stack, in bytes.  This used to be a
1155*11efff7fSkettenis 	   conditional around just the two extra args, but that might
1156*11efff7fSkettenis 	   be undefined if yyoverflow is a macro.  */
1157b725ae77Skettenis 	yyoverflow ("parser stack overflow",
1158b725ae77Skettenis 		    &yyss1, yysize * sizeof (*yyssp),
1159b725ae77Skettenis 		    &yyvs1, yysize * sizeof (*yyvsp),
1160*11efff7fSkettenis 
1161b725ae77Skettenis 		    &yystacksize);
1162*11efff7fSkettenis 
1163b725ae77Skettenis 	yyss = yyss1;
1164b725ae77Skettenis 	yyvs = yyvs1;
1165b725ae77Skettenis       }
1166b725ae77Skettenis #else /* no yyoverflow */
1167b725ae77Skettenis # ifndef YYSTACK_RELOCATE
1168b725ae77Skettenis       goto yyoverflowlab;
1169b725ae77Skettenis # else
1170b725ae77Skettenis       /* Extend the stack our own way.  */
1171*11efff7fSkettenis       if (YYMAXDEPTH <= yystacksize)
1172b725ae77Skettenis 	goto yyoverflowlab;
1173b725ae77Skettenis       yystacksize *= 2;
1174*11efff7fSkettenis       if (YYMAXDEPTH < yystacksize)
1175b725ae77Skettenis 	yystacksize = YYMAXDEPTH;
1176b725ae77Skettenis 
1177b725ae77Skettenis       {
1178b725ae77Skettenis 	short *yyss1 = yyss;
1179b725ae77Skettenis 	union yyalloc *yyptr =
1180b725ae77Skettenis 	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
1181b725ae77Skettenis 	if (! yyptr)
1182b725ae77Skettenis 	  goto yyoverflowlab;
1183b725ae77Skettenis 	YYSTACK_RELOCATE (yyss);
1184b725ae77Skettenis 	YYSTACK_RELOCATE (yyvs);
1185*11efff7fSkettenis 
1186b725ae77Skettenis #  undef YYSTACK_RELOCATE
1187b725ae77Skettenis 	if (yyss1 != yyssa)
1188b725ae77Skettenis 	  YYSTACK_FREE (yyss1);
1189b725ae77Skettenis       }
1190b725ae77Skettenis # endif
1191b725ae77Skettenis #endif /* no yyoverflow */
1192b725ae77Skettenis 
1193b725ae77Skettenis       yyssp = yyss + yysize - 1;
1194b725ae77Skettenis       yyvsp = yyvs + yysize - 1;
1195*11efff7fSkettenis 
1196b725ae77Skettenis 
1197b725ae77Skettenis       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
1198b725ae77Skettenis 		  (unsigned long int) yystacksize));
1199b725ae77Skettenis 
1200*11efff7fSkettenis       if (yyss + yystacksize - 1 <= yyssp)
1201b725ae77Skettenis 	YYABORT;
1202b725ae77Skettenis     }
1203b725ae77Skettenis 
1204b725ae77Skettenis   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
1205b725ae77Skettenis 
1206b725ae77Skettenis   goto yybackup;
1207b725ae77Skettenis 
1208b725ae77Skettenis /*-----------.
1209b725ae77Skettenis | yybackup.  |
1210b725ae77Skettenis `-----------*/
1211b725ae77Skettenis yybackup:
1212b725ae77Skettenis 
1213b725ae77Skettenis /* Do appropriate processing given the current state.  */
1214b725ae77Skettenis /* Read a lookahead token if we need one and don't already have one.  */
1215b725ae77Skettenis /* yyresume: */
1216b725ae77Skettenis 
1217b725ae77Skettenis   /* First try to decide what to do without reference to lookahead token.  */
1218b725ae77Skettenis 
1219b725ae77Skettenis   yyn = yypact[yystate];
1220*11efff7fSkettenis   if (yyn == YYPACT_NINF)
1221b725ae77Skettenis     goto yydefault;
1222b725ae77Skettenis 
1223b725ae77Skettenis   /* Not known => get a lookahead token if don't already have one.  */
1224b725ae77Skettenis 
1225*11efff7fSkettenis   /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
1226b725ae77Skettenis   if (yychar == YYEMPTY)
1227b725ae77Skettenis     {
1228b725ae77Skettenis       YYDPRINTF ((stderr, "Reading a token: "));
1229b725ae77Skettenis       yychar = YYLEX;
1230b725ae77Skettenis     }
1231b725ae77Skettenis 
1232*11efff7fSkettenis   if (yychar <= YYEOF)
1233b725ae77Skettenis     {
1234*11efff7fSkettenis       yychar = yytoken = YYEOF;
1235b725ae77Skettenis       YYDPRINTF ((stderr, "Now at end of input.\n"));
1236b725ae77Skettenis     }
1237b725ae77Skettenis   else
1238b725ae77Skettenis     {
1239*11efff7fSkettenis       yytoken = YYTRANSLATE (yychar);
1240*11efff7fSkettenis       YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
1241b725ae77Skettenis     }
1242b725ae77Skettenis 
1243*11efff7fSkettenis   /* If the proper action on seeing token YYTOKEN is to reduce or to
1244*11efff7fSkettenis      detect an error, take that action.  */
1245*11efff7fSkettenis   yyn += yytoken;
1246*11efff7fSkettenis   if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
1247b725ae77Skettenis     goto yydefault;
1248b725ae77Skettenis   yyn = yytable[yyn];
1249*11efff7fSkettenis   if (yyn <= 0)
1250b725ae77Skettenis     {
1251*11efff7fSkettenis       if (yyn == 0 || yyn == YYTABLE_NINF)
1252b725ae77Skettenis 	goto yyerrlab;
1253b725ae77Skettenis       yyn = -yyn;
1254b725ae77Skettenis       goto yyreduce;
1255b725ae77Skettenis     }
1256b725ae77Skettenis 
1257b725ae77Skettenis   if (yyn == YYFINAL)
1258b725ae77Skettenis     YYACCEPT;
1259b725ae77Skettenis 
1260b725ae77Skettenis   /* Shift the lookahead token.  */
1261*11efff7fSkettenis   YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
1262b725ae77Skettenis 
1263b725ae77Skettenis   /* Discard the token being shifted unless it is eof.  */
1264b725ae77Skettenis   if (yychar != YYEOF)
1265b725ae77Skettenis     yychar = YYEMPTY;
1266b725ae77Skettenis 
1267b725ae77Skettenis   *++yyvsp = yylval;
1268*11efff7fSkettenis 
1269b725ae77Skettenis 
1270b725ae77Skettenis   /* Count tokens shifted since error; after three, turn off error
1271b725ae77Skettenis      status.  */
1272b725ae77Skettenis   if (yyerrstatus)
1273b725ae77Skettenis     yyerrstatus--;
1274b725ae77Skettenis 
1275b725ae77Skettenis   yystate = yyn;
1276b725ae77Skettenis   goto yynewstate;
1277b725ae77Skettenis 
1278b725ae77Skettenis 
1279b725ae77Skettenis /*-----------------------------------------------------------.
1280b725ae77Skettenis | yydefault -- do the default action for the current state.  |
1281b725ae77Skettenis `-----------------------------------------------------------*/
1282b725ae77Skettenis yydefault:
1283b725ae77Skettenis   yyn = yydefact[yystate];
1284b725ae77Skettenis   if (yyn == 0)
1285b725ae77Skettenis     goto yyerrlab;
1286b725ae77Skettenis   goto yyreduce;
1287b725ae77Skettenis 
1288b725ae77Skettenis 
1289b725ae77Skettenis /*-----------------------------.
1290b725ae77Skettenis | yyreduce -- Do a reduction.  |
1291b725ae77Skettenis `-----------------------------*/
1292b725ae77Skettenis yyreduce:
1293b725ae77Skettenis   /* yyn is the number of a rule to reduce with.  */
1294b725ae77Skettenis   yylen = yyr2[yyn];
1295b725ae77Skettenis 
1296b725ae77Skettenis   /* If YYLEN is nonzero, implement the default value of the action:
1297b725ae77Skettenis      `$$ = $1'.
1298b725ae77Skettenis 
1299*11efff7fSkettenis      Otherwise, the following line sets YYVAL to garbage.
1300*11efff7fSkettenis      This behavior is undocumented and Bison
1301b725ae77Skettenis      users should not rely upon it.  Assigning to YYVAL
1302b725ae77Skettenis      unconditionally makes the parser a bit smaller, and it avoids a
1303b725ae77Skettenis      GCC warning that YYVAL may be used uninitialized.  */
1304b725ae77Skettenis   yyval = yyvsp[1-yylen];
1305b725ae77Skettenis 
1306b725ae77Skettenis 
1307*11efff7fSkettenis   YY_REDUCE_PRINT (yyn);
1308*11efff7fSkettenis   switch (yyn)
1309b725ae77Skettenis     {
1310*11efff7fSkettenis         case 2:
1311b725ae77Skettenis #line 234 "p-exp.y"
1312b725ae77Skettenis     { current_type = NULL;
1313b725ae77Skettenis 		  search_field = 0;
1314b725ae77Skettenis 		}
1315b725ae77Skettenis     break;
1316*11efff7fSkettenis 
1317*11efff7fSkettenis   case 3:
1318b725ae77Skettenis #line 237 "p-exp.y"
1319b725ae77Skettenis     {}
1320b725ae77Skettenis     break;
1321*11efff7fSkettenis 
1322*11efff7fSkettenis   case 6:
1323b725ae77Skettenis #line 246 "p-exp.y"
1324b725ae77Skettenis     { write_exp_elt_opcode(OP_TYPE);
1325b725ae77Skettenis 			  write_exp_elt_type(yyvsp[0].tval);
1326b725ae77Skettenis 			  write_exp_elt_opcode(OP_TYPE);
1327b725ae77Skettenis 			  current_type = yyvsp[0].tval; }
1328b725ae77Skettenis     break;
1329*11efff7fSkettenis 
1330*11efff7fSkettenis   case 8:
1331b725ae77Skettenis #line 254 "p-exp.y"
1332b725ae77Skettenis     { write_exp_elt_opcode (BINOP_COMMA); }
1333b725ae77Skettenis     break;
1334*11efff7fSkettenis 
1335*11efff7fSkettenis   case 9:
1336b725ae77Skettenis #line 259 "p-exp.y"
1337b725ae77Skettenis     { write_exp_elt_opcode (UNOP_IND);
1338b725ae77Skettenis 			  if (current_type)
1339b725ae77Skettenis 			    current_type = TYPE_TARGET_TYPE (current_type); }
1340b725ae77Skettenis     break;
1341*11efff7fSkettenis 
1342*11efff7fSkettenis   case 10:
1343b725ae77Skettenis #line 265 "p-exp.y"
1344b725ae77Skettenis     { write_exp_elt_opcode (UNOP_ADDR);
1345b725ae77Skettenis 			  if (current_type)
1346b725ae77Skettenis 			    current_type = TYPE_POINTER_TYPE (current_type); }
1347b725ae77Skettenis     break;
1348*11efff7fSkettenis 
1349*11efff7fSkettenis   case 11:
1350b725ae77Skettenis #line 271 "p-exp.y"
1351b725ae77Skettenis     { write_exp_elt_opcode (UNOP_NEG); }
1352b725ae77Skettenis     break;
1353*11efff7fSkettenis 
1354*11efff7fSkettenis   case 12:
1355b725ae77Skettenis #line 275 "p-exp.y"
1356b725ae77Skettenis     { write_exp_elt_opcode (UNOP_LOGICAL_NOT); }
1357b725ae77Skettenis     break;
1358*11efff7fSkettenis 
1359*11efff7fSkettenis   case 13:
1360b725ae77Skettenis #line 279 "p-exp.y"
1361b725ae77Skettenis     { write_exp_elt_opcode (UNOP_PREINCREMENT); }
1362b725ae77Skettenis     break;
1363*11efff7fSkettenis 
1364*11efff7fSkettenis   case 14:
1365b725ae77Skettenis #line 283 "p-exp.y"
1366b725ae77Skettenis     { write_exp_elt_opcode (UNOP_PREDECREMENT); }
1367b725ae77Skettenis     break;
1368*11efff7fSkettenis 
1369*11efff7fSkettenis   case 15:
1370b725ae77Skettenis #line 286 "p-exp.y"
1371b725ae77Skettenis     { search_field = 1; }
1372b725ae77Skettenis     break;
1373*11efff7fSkettenis 
1374*11efff7fSkettenis   case 16:
1375b725ae77Skettenis #line 289 "p-exp.y"
1376b725ae77Skettenis     { write_exp_elt_opcode (STRUCTOP_STRUCT);
1377b725ae77Skettenis 			  write_exp_string (yyvsp[0].sval);
1378b725ae77Skettenis 			  write_exp_elt_opcode (STRUCTOP_STRUCT);
1379b725ae77Skettenis 			  search_field = 0;
1380b725ae77Skettenis 			  if (current_type)
1381b725ae77Skettenis 			    { while (TYPE_CODE (current_type) == TYPE_CODE_PTR)
1382b725ae77Skettenis 				current_type = TYPE_TARGET_TYPE (current_type);
1383b725ae77Skettenis 			      current_type = lookup_struct_elt_type (
1384b725ae77Skettenis 				current_type, yyvsp[0].sval.ptr, 0); };
1385b725ae77Skettenis 			 }
1386b725ae77Skettenis     break;
1387*11efff7fSkettenis 
1388*11efff7fSkettenis   case 17:
1389b725ae77Skettenis #line 301 "p-exp.y"
1390b725ae77Skettenis     { char *arrayname;
1391b725ae77Skettenis 			  int arrayfieldindex;
1392b725ae77Skettenis 			  arrayfieldindex = is_pascal_string_type (
1393b725ae77Skettenis 				current_type, NULL, NULL,
1394b725ae77Skettenis 				NULL, NULL, &arrayname);
1395b725ae77Skettenis 			  if (arrayfieldindex)
1396b725ae77Skettenis 			    {
1397b725ae77Skettenis 			      struct stoken stringsval;
1398b725ae77Skettenis 			      stringsval.ptr = alloca (strlen (arrayname) + 1);
1399b725ae77Skettenis 			      stringsval.length = strlen (arrayname);
1400b725ae77Skettenis 			      strcpy (stringsval.ptr, arrayname);
1401b725ae77Skettenis 			      current_type = TYPE_FIELD_TYPE (current_type,
1402b725ae77Skettenis 				arrayfieldindex - 1);
1403b725ae77Skettenis 			      write_exp_elt_opcode (STRUCTOP_STRUCT);
1404b725ae77Skettenis 			      write_exp_string (stringsval);
1405b725ae77Skettenis 			      write_exp_elt_opcode (STRUCTOP_STRUCT);
1406b725ae77Skettenis 			    }
1407b725ae77Skettenis 			  push_current_type ();  }
1408b725ae77Skettenis     break;
1409*11efff7fSkettenis 
1410*11efff7fSkettenis   case 18:
1411b725ae77Skettenis #line 320 "p-exp.y"
1412b725ae77Skettenis     { pop_current_type ();
1413b725ae77Skettenis 			  write_exp_elt_opcode (BINOP_SUBSCRIPT);
1414b725ae77Skettenis 			  if (current_type)
1415b725ae77Skettenis 			    current_type = TYPE_TARGET_TYPE (current_type); }
1416b725ae77Skettenis     break;
1417*11efff7fSkettenis 
1418*11efff7fSkettenis   case 19:
1419b725ae77Skettenis #line 329 "p-exp.y"
1420b725ae77Skettenis     { push_current_type ();
1421b725ae77Skettenis 			  start_arglist (); }
1422b725ae77Skettenis     break;
1423*11efff7fSkettenis 
1424*11efff7fSkettenis   case 20:
1425b725ae77Skettenis #line 332 "p-exp.y"
1426b725ae77Skettenis     { write_exp_elt_opcode (OP_FUNCALL);
1427b725ae77Skettenis 			  write_exp_elt_longcst ((LONGEST) end_arglist ());
1428b725ae77Skettenis 			  write_exp_elt_opcode (OP_FUNCALL);
1429b725ae77Skettenis 			  pop_current_type (); }
1430b725ae77Skettenis     break;
1431*11efff7fSkettenis 
1432*11efff7fSkettenis   case 22:
1433b725ae77Skettenis #line 340 "p-exp.y"
1434b725ae77Skettenis     { arglist_len = 1; }
1435b725ae77Skettenis     break;
1436*11efff7fSkettenis 
1437*11efff7fSkettenis   case 23:
1438b725ae77Skettenis #line 342 "p-exp.y"
1439b725ae77Skettenis     { arglist_len++; }
1440b725ae77Skettenis     break;
1441*11efff7fSkettenis 
1442*11efff7fSkettenis   case 24:
1443b725ae77Skettenis #line 346 "p-exp.y"
1444b725ae77Skettenis     { if (current_type)
1445b725ae77Skettenis 			    {
1446b725ae77Skettenis 			      /* Allow automatic dereference of classes.  */
1447b725ae77Skettenis 			      if ((TYPE_CODE (current_type) == TYPE_CODE_PTR)
1448b725ae77Skettenis 				  && (TYPE_CODE (TYPE_TARGET_TYPE (current_type)) == TYPE_CODE_CLASS)
1449b725ae77Skettenis 				  && (TYPE_CODE (yyvsp[-3].tval) == TYPE_CODE_CLASS))
1450b725ae77Skettenis 				write_exp_elt_opcode (UNOP_IND);
1451b725ae77Skettenis 			    }
1452b725ae77Skettenis 			  write_exp_elt_opcode (UNOP_CAST);
1453b725ae77Skettenis 			  write_exp_elt_type (yyvsp[-3].tval);
1454b725ae77Skettenis 			  write_exp_elt_opcode (UNOP_CAST);
1455b725ae77Skettenis 			  current_type = yyvsp[-3].tval; }
1456b725ae77Skettenis     break;
1457*11efff7fSkettenis 
1458*11efff7fSkettenis   case 25:
1459b725ae77Skettenis #line 361 "p-exp.y"
1460b725ae77Skettenis     { }
1461b725ae77Skettenis     break;
1462*11efff7fSkettenis 
1463*11efff7fSkettenis   case 26:
1464b725ae77Skettenis #line 367 "p-exp.y"
1465b725ae77Skettenis     { write_exp_elt_opcode (BINOP_MUL); }
1466b725ae77Skettenis     break;
1467*11efff7fSkettenis 
1468*11efff7fSkettenis   case 27:
1469b725ae77Skettenis #line 371 "p-exp.y"
1470b725ae77Skettenis     { write_exp_elt_opcode (BINOP_DIV); }
1471b725ae77Skettenis     break;
1472*11efff7fSkettenis 
1473*11efff7fSkettenis   case 28:
1474b725ae77Skettenis #line 375 "p-exp.y"
1475b725ae77Skettenis     { write_exp_elt_opcode (BINOP_INTDIV); }
1476b725ae77Skettenis     break;
1477*11efff7fSkettenis 
1478*11efff7fSkettenis   case 29:
1479b725ae77Skettenis #line 379 "p-exp.y"
1480b725ae77Skettenis     { write_exp_elt_opcode (BINOP_REM); }
1481b725ae77Skettenis     break;
1482*11efff7fSkettenis 
1483*11efff7fSkettenis   case 30:
1484b725ae77Skettenis #line 383 "p-exp.y"
1485b725ae77Skettenis     { write_exp_elt_opcode (BINOP_ADD); }
1486b725ae77Skettenis     break;
1487*11efff7fSkettenis 
1488*11efff7fSkettenis   case 31:
1489b725ae77Skettenis #line 387 "p-exp.y"
1490b725ae77Skettenis     { write_exp_elt_opcode (BINOP_SUB); }
1491b725ae77Skettenis     break;
1492*11efff7fSkettenis 
1493*11efff7fSkettenis   case 32:
1494b725ae77Skettenis #line 391 "p-exp.y"
1495b725ae77Skettenis     { write_exp_elt_opcode (BINOP_LSH); }
1496b725ae77Skettenis     break;
1497*11efff7fSkettenis 
1498*11efff7fSkettenis   case 33:
1499b725ae77Skettenis #line 395 "p-exp.y"
1500b725ae77Skettenis     { write_exp_elt_opcode (BINOP_RSH); }
1501b725ae77Skettenis     break;
1502*11efff7fSkettenis 
1503*11efff7fSkettenis   case 34:
1504b725ae77Skettenis #line 399 "p-exp.y"
1505b725ae77Skettenis     { write_exp_elt_opcode (BINOP_EQUAL); }
1506b725ae77Skettenis     break;
1507*11efff7fSkettenis 
1508*11efff7fSkettenis   case 35:
1509b725ae77Skettenis #line 403 "p-exp.y"
1510b725ae77Skettenis     { write_exp_elt_opcode (BINOP_NOTEQUAL); }
1511b725ae77Skettenis     break;
1512*11efff7fSkettenis 
1513*11efff7fSkettenis   case 36:
1514b725ae77Skettenis #line 407 "p-exp.y"
1515b725ae77Skettenis     { write_exp_elt_opcode (BINOP_LEQ); }
1516b725ae77Skettenis     break;
1517*11efff7fSkettenis 
1518*11efff7fSkettenis   case 37:
1519b725ae77Skettenis #line 411 "p-exp.y"
1520b725ae77Skettenis     { write_exp_elt_opcode (BINOP_GEQ); }
1521b725ae77Skettenis     break;
1522*11efff7fSkettenis 
1523*11efff7fSkettenis   case 38:
1524b725ae77Skettenis #line 415 "p-exp.y"
1525b725ae77Skettenis     { write_exp_elt_opcode (BINOP_LESS); }
1526b725ae77Skettenis     break;
1527*11efff7fSkettenis 
1528*11efff7fSkettenis   case 39:
1529b725ae77Skettenis #line 419 "p-exp.y"
1530b725ae77Skettenis     { write_exp_elt_opcode (BINOP_GTR); }
1531b725ae77Skettenis     break;
1532*11efff7fSkettenis 
1533*11efff7fSkettenis   case 40:
1534b725ae77Skettenis #line 423 "p-exp.y"
1535b725ae77Skettenis     { write_exp_elt_opcode (BINOP_BITWISE_AND); }
1536b725ae77Skettenis     break;
1537*11efff7fSkettenis 
1538*11efff7fSkettenis   case 41:
1539b725ae77Skettenis #line 427 "p-exp.y"
1540b725ae77Skettenis     { write_exp_elt_opcode (BINOP_BITWISE_XOR); }
1541b725ae77Skettenis     break;
1542*11efff7fSkettenis 
1543*11efff7fSkettenis   case 42:
1544b725ae77Skettenis #line 431 "p-exp.y"
1545b725ae77Skettenis     { write_exp_elt_opcode (BINOP_BITWISE_IOR); }
1546b725ae77Skettenis     break;
1547*11efff7fSkettenis 
1548*11efff7fSkettenis   case 43:
1549b725ae77Skettenis #line 435 "p-exp.y"
1550b725ae77Skettenis     { write_exp_elt_opcode (BINOP_ASSIGN); }
1551b725ae77Skettenis     break;
1552*11efff7fSkettenis 
1553*11efff7fSkettenis   case 44:
1554b725ae77Skettenis #line 439 "p-exp.y"
1555b725ae77Skettenis     { write_exp_elt_opcode (OP_BOOL);
1556b725ae77Skettenis 			  write_exp_elt_longcst ((LONGEST) yyvsp[0].lval);
1557b725ae77Skettenis 			  write_exp_elt_opcode (OP_BOOL); }
1558b725ae77Skettenis     break;
1559*11efff7fSkettenis 
1560*11efff7fSkettenis   case 45:
1561b725ae77Skettenis #line 445 "p-exp.y"
1562b725ae77Skettenis     { write_exp_elt_opcode (OP_BOOL);
1563b725ae77Skettenis 			  write_exp_elt_longcst ((LONGEST) yyvsp[0].lval);
1564b725ae77Skettenis 			  write_exp_elt_opcode (OP_BOOL); }
1565b725ae77Skettenis     break;
1566*11efff7fSkettenis 
1567*11efff7fSkettenis   case 46:
1568b725ae77Skettenis #line 451 "p-exp.y"
1569b725ae77Skettenis     { write_exp_elt_opcode (OP_LONG);
1570b725ae77Skettenis 			  write_exp_elt_type (yyvsp[0].typed_val_int.type);
1571b725ae77Skettenis 			  write_exp_elt_longcst ((LONGEST)(yyvsp[0].typed_val_int.val));
1572b725ae77Skettenis 			  write_exp_elt_opcode (OP_LONG); }
1573b725ae77Skettenis     break;
1574*11efff7fSkettenis 
1575*11efff7fSkettenis   case 47:
1576b725ae77Skettenis #line 458 "p-exp.y"
1577b725ae77Skettenis     { YYSTYPE val;
1578b725ae77Skettenis 			  parse_number (yyvsp[0].ssym.stoken.ptr, yyvsp[0].ssym.stoken.length, 0, &val);
1579b725ae77Skettenis 			  write_exp_elt_opcode (OP_LONG);
1580b725ae77Skettenis 			  write_exp_elt_type (val.typed_val_int.type);
1581b725ae77Skettenis 			  write_exp_elt_longcst ((LONGEST)val.typed_val_int.val);
1582b725ae77Skettenis 			  write_exp_elt_opcode (OP_LONG);
1583b725ae77Skettenis 			}
1584b725ae77Skettenis     break;
1585*11efff7fSkettenis 
1586*11efff7fSkettenis   case 48:
1587b725ae77Skettenis #line 469 "p-exp.y"
1588b725ae77Skettenis     { write_exp_elt_opcode (OP_DOUBLE);
1589b725ae77Skettenis 			  write_exp_elt_type (yyvsp[0].typed_val_float.type);
1590b725ae77Skettenis 			  write_exp_elt_dblcst (yyvsp[0].typed_val_float.dval);
1591b725ae77Skettenis 			  write_exp_elt_opcode (OP_DOUBLE); }
1592b725ae77Skettenis     break;
1593*11efff7fSkettenis 
1594*11efff7fSkettenis   case 51:
1595b725ae77Skettenis #line 483 "p-exp.y"
1596b725ae77Skettenis     { write_exp_elt_opcode (OP_LONG);
1597b725ae77Skettenis 			  write_exp_elt_type (builtin_type_int);
1598b725ae77Skettenis 			  CHECK_TYPEDEF (yyvsp[-1].tval);
1599b725ae77Skettenis 			  write_exp_elt_longcst ((LONGEST) TYPE_LENGTH (yyvsp[-1].tval));
1600b725ae77Skettenis 			  write_exp_elt_opcode (OP_LONG); }
1601b725ae77Skettenis     break;
1602*11efff7fSkettenis 
1603*11efff7fSkettenis   case 52:
1604b725ae77Skettenis #line 491 "p-exp.y"
1605b725ae77Skettenis     { /* C strings are converted into array constants with
1606b725ae77Skettenis 			     an explicit null byte added at the end.  Thus
1607b725ae77Skettenis 			     the array upper bound is the string length.
1608b725ae77Skettenis 			     There is no such thing in C as a completely empty
1609b725ae77Skettenis 			     string. */
1610b725ae77Skettenis 			  char *sp = yyvsp[0].sval.ptr; int count = yyvsp[0].sval.length;
1611b725ae77Skettenis 			  while (count-- > 0)
1612b725ae77Skettenis 			    {
1613b725ae77Skettenis 			      write_exp_elt_opcode (OP_LONG);
1614b725ae77Skettenis 			      write_exp_elt_type (builtin_type_char);
1615b725ae77Skettenis 			      write_exp_elt_longcst ((LONGEST)(*sp++));
1616b725ae77Skettenis 			      write_exp_elt_opcode (OP_LONG);
1617b725ae77Skettenis 			    }
1618b725ae77Skettenis 			  write_exp_elt_opcode (OP_LONG);
1619b725ae77Skettenis 			  write_exp_elt_type (builtin_type_char);
1620b725ae77Skettenis 			  write_exp_elt_longcst ((LONGEST)'\0');
1621b725ae77Skettenis 			  write_exp_elt_opcode (OP_LONG);
1622b725ae77Skettenis 			  write_exp_elt_opcode (OP_ARRAY);
1623b725ae77Skettenis 			  write_exp_elt_longcst ((LONGEST) 0);
1624b725ae77Skettenis 			  write_exp_elt_longcst ((LONGEST) (yyvsp[0].sval.length));
1625b725ae77Skettenis 			  write_exp_elt_opcode (OP_ARRAY); }
1626b725ae77Skettenis     break;
1627*11efff7fSkettenis 
1628*11efff7fSkettenis   case 53:
1629b725ae77Skettenis #line 516 "p-exp.y"
1630b725ae77Skettenis     {
1631b725ae77Skettenis 			  struct value * this_val;
1632b725ae77Skettenis 			  struct type * this_type;
1633b725ae77Skettenis 			  write_exp_elt_opcode (OP_THIS);
1634b725ae77Skettenis 			  write_exp_elt_opcode (OP_THIS);
1635b725ae77Skettenis 			  /* we need type of this */
1636b725ae77Skettenis 			  this_val = value_of_this (0);
1637b725ae77Skettenis 			  if (this_val)
1638b725ae77Skettenis 			    this_type = this_val->type;
1639b725ae77Skettenis 			  else
1640b725ae77Skettenis 			    this_type = NULL;
1641b725ae77Skettenis 			  if (this_type)
1642b725ae77Skettenis 			    {
1643b725ae77Skettenis 			      if (TYPE_CODE (this_type) == TYPE_CODE_PTR)
1644b725ae77Skettenis 				{
1645b725ae77Skettenis 				  this_type = TYPE_TARGET_TYPE (this_type);
1646b725ae77Skettenis 				  write_exp_elt_opcode (UNOP_IND);
1647b725ae77Skettenis 				}
1648b725ae77Skettenis 			    }
1649b725ae77Skettenis 
1650b725ae77Skettenis 			  current_type = this_type;
1651b725ae77Skettenis 			}
1652b725ae77Skettenis     break;
1653*11efff7fSkettenis 
1654*11efff7fSkettenis   case 54:
1655b725ae77Skettenis #line 543 "p-exp.y"
1656b725ae77Skettenis     {
1657b725ae77Skettenis 			  if (yyvsp[0].ssym.sym != 0)
1658b725ae77Skettenis 			      yyval.bval = SYMBOL_BLOCK_VALUE (yyvsp[0].ssym.sym);
1659b725ae77Skettenis 			  else
1660b725ae77Skettenis 			    {
1661b725ae77Skettenis 			      struct symtab *tem =
1662b725ae77Skettenis 				  lookup_symtab (copy_name (yyvsp[0].ssym.stoken));
1663b725ae77Skettenis 			      if (tem)
1664b725ae77Skettenis 				yyval.bval = BLOCKVECTOR_BLOCK (BLOCKVECTOR (tem), STATIC_BLOCK);
1665b725ae77Skettenis 			      else
1666b725ae77Skettenis 				error ("No file or function \"%s\".",
1667b725ae77Skettenis 				       copy_name (yyvsp[0].ssym.stoken));
1668b725ae77Skettenis 			    }
1669b725ae77Skettenis 			}
1670b725ae77Skettenis     break;
1671*11efff7fSkettenis 
1672*11efff7fSkettenis   case 55:
1673b725ae77Skettenis #line 560 "p-exp.y"
1674b725ae77Skettenis     { struct symbol *tem
1675b725ae77Skettenis 			    = lookup_symbol (copy_name (yyvsp[0].sval), yyvsp[-2].bval,
1676b725ae77Skettenis 					     VAR_DOMAIN, (int *) NULL,
1677b725ae77Skettenis 					     (struct symtab **) NULL);
1678b725ae77Skettenis 			  if (!tem || SYMBOL_CLASS (tem) != LOC_BLOCK)
1679b725ae77Skettenis 			    error ("No function \"%s\" in specified context.",
1680b725ae77Skettenis 				   copy_name (yyvsp[0].sval));
1681b725ae77Skettenis 			  yyval.bval = SYMBOL_BLOCK_VALUE (tem); }
1682b725ae77Skettenis     break;
1683*11efff7fSkettenis 
1684*11efff7fSkettenis   case 56:
1685b725ae77Skettenis #line 571 "p-exp.y"
1686b725ae77Skettenis     { struct symbol *sym;
1687b725ae77Skettenis 			  sym = lookup_symbol (copy_name (yyvsp[0].sval), yyvsp[-2].bval,
1688b725ae77Skettenis 					       VAR_DOMAIN, (int *) NULL,
1689b725ae77Skettenis 					       (struct symtab **) NULL);
1690b725ae77Skettenis 			  if (sym == 0)
1691b725ae77Skettenis 			    error ("No symbol \"%s\" in specified context.",
1692b725ae77Skettenis 				   copy_name (yyvsp[0].sval));
1693b725ae77Skettenis 
1694b725ae77Skettenis 			  write_exp_elt_opcode (OP_VAR_VALUE);
1695b725ae77Skettenis 			  /* block_found is set by lookup_symbol.  */
1696b725ae77Skettenis 			  write_exp_elt_block (block_found);
1697b725ae77Skettenis 			  write_exp_elt_sym (sym);
1698b725ae77Skettenis 			  write_exp_elt_opcode (OP_VAR_VALUE); }
1699b725ae77Skettenis     break;
1700*11efff7fSkettenis 
1701*11efff7fSkettenis   case 57:
1702b725ae77Skettenis #line 587 "p-exp.y"
1703b725ae77Skettenis     {
1704b725ae77Skettenis 			  struct type *type = yyvsp[-2].tval;
1705b725ae77Skettenis 			  if (TYPE_CODE (type) != TYPE_CODE_STRUCT
1706b725ae77Skettenis 			      && TYPE_CODE (type) != TYPE_CODE_UNION)
1707b725ae77Skettenis 			    error ("`%s' is not defined as an aggregate type.",
1708b725ae77Skettenis 				   TYPE_NAME (type));
1709b725ae77Skettenis 
1710b725ae77Skettenis 			  write_exp_elt_opcode (OP_SCOPE);
1711b725ae77Skettenis 			  write_exp_elt_type (type);
1712b725ae77Skettenis 			  write_exp_string (yyvsp[0].sval);
1713b725ae77Skettenis 			  write_exp_elt_opcode (OP_SCOPE);
1714b725ae77Skettenis 			}
1715b725ae77Skettenis     break;
1716*11efff7fSkettenis 
1717*11efff7fSkettenis   case 59:
1718b725ae77Skettenis #line 603 "p-exp.y"
1719b725ae77Skettenis     {
1720b725ae77Skettenis 			  char *name = copy_name (yyvsp[0].sval);
1721b725ae77Skettenis 			  struct symbol *sym;
1722b725ae77Skettenis 			  struct minimal_symbol *msymbol;
1723b725ae77Skettenis 
1724b725ae77Skettenis 			  sym =
1725b725ae77Skettenis 			    lookup_symbol (name, (const struct block *) NULL,
1726b725ae77Skettenis 					   VAR_DOMAIN, (int *) NULL,
1727b725ae77Skettenis 					   (struct symtab **) NULL);
1728b725ae77Skettenis 			  if (sym)
1729b725ae77Skettenis 			    {
1730b725ae77Skettenis 			      write_exp_elt_opcode (OP_VAR_VALUE);
1731b725ae77Skettenis 			      write_exp_elt_block (NULL);
1732b725ae77Skettenis 			      write_exp_elt_sym (sym);
1733b725ae77Skettenis 			      write_exp_elt_opcode (OP_VAR_VALUE);
1734b725ae77Skettenis 			      break;
1735b725ae77Skettenis 			    }
1736b725ae77Skettenis 
1737b725ae77Skettenis 			  msymbol = lookup_minimal_symbol (name, NULL, NULL);
1738b725ae77Skettenis 			  if (msymbol != NULL)
1739b725ae77Skettenis 			    {
1740b725ae77Skettenis 			      write_exp_msymbol (msymbol,
1741b725ae77Skettenis 						 lookup_function_type (builtin_type_int),
1742b725ae77Skettenis 						 builtin_type_int);
1743b725ae77Skettenis 			    }
1744b725ae77Skettenis 			  else
1745b725ae77Skettenis 			    if (!have_full_symbols () && !have_partial_symbols ())
1746b725ae77Skettenis 			      error ("No symbol table is loaded.  Use the \"file\" command.");
1747b725ae77Skettenis 			    else
1748b725ae77Skettenis 			      error ("No symbol \"%s\" in current context.", name);
1749b725ae77Skettenis 			}
1750b725ae77Skettenis     break;
1751*11efff7fSkettenis 
1752*11efff7fSkettenis   case 60:
1753b725ae77Skettenis #line 637 "p-exp.y"
1754b725ae77Skettenis     { struct symbol *sym = yyvsp[0].ssym.sym;
1755b725ae77Skettenis 
1756b725ae77Skettenis 			  if (sym)
1757b725ae77Skettenis 			    {
1758b725ae77Skettenis 			      if (symbol_read_needs_frame (sym))
1759b725ae77Skettenis 				{
1760b725ae77Skettenis 				  if (innermost_block == 0 ||
1761b725ae77Skettenis 				      contained_in (block_found,
1762b725ae77Skettenis 						    innermost_block))
1763b725ae77Skettenis 				    innermost_block = block_found;
1764b725ae77Skettenis 				}
1765b725ae77Skettenis 
1766b725ae77Skettenis 			      write_exp_elt_opcode (OP_VAR_VALUE);
1767b725ae77Skettenis 			      /* We want to use the selected frame, not
1768b725ae77Skettenis 				 another more inner frame which happens to
1769b725ae77Skettenis 				 be in the same block.  */
1770b725ae77Skettenis 			      write_exp_elt_block (NULL);
1771b725ae77Skettenis 			      write_exp_elt_sym (sym);
1772b725ae77Skettenis 			      write_exp_elt_opcode (OP_VAR_VALUE);
1773b725ae77Skettenis 			      current_type = sym->type; }
1774b725ae77Skettenis 			  else if (yyvsp[0].ssym.is_a_field_of_this)
1775b725ae77Skettenis 			    {
1776b725ae77Skettenis 			      struct value * this_val;
1777b725ae77Skettenis 			      struct type * this_type;
1778b725ae77Skettenis 			      /* Object pascal: it hangs off of `this'.  Must
1779b725ae77Skettenis 			         not inadvertently convert from a method call
1780b725ae77Skettenis 				 to data ref.  */
1781b725ae77Skettenis 			      if (innermost_block == 0 ||
1782b725ae77Skettenis 				  contained_in (block_found, innermost_block))
1783b725ae77Skettenis 				innermost_block = block_found;
1784b725ae77Skettenis 			      write_exp_elt_opcode (OP_THIS);
1785b725ae77Skettenis 			      write_exp_elt_opcode (OP_THIS);
1786b725ae77Skettenis 			      write_exp_elt_opcode (STRUCTOP_PTR);
1787b725ae77Skettenis 			      write_exp_string (yyvsp[0].ssym.stoken);
1788b725ae77Skettenis 			      write_exp_elt_opcode (STRUCTOP_PTR);
1789b725ae77Skettenis 			      /* we need type of this */
1790b725ae77Skettenis 			      this_val = value_of_this (0);
1791b725ae77Skettenis 			      if (this_val)
1792b725ae77Skettenis 				this_type = this_val->type;
1793b725ae77Skettenis 			      else
1794b725ae77Skettenis 				this_type = NULL;
1795b725ae77Skettenis 			      if (this_type)
1796b725ae77Skettenis 				current_type = lookup_struct_elt_type (
1797b725ae77Skettenis 				  this_type,
1798b725ae77Skettenis 				  copy_name (yyvsp[0].ssym.stoken), 0);
1799b725ae77Skettenis 			      else
1800b725ae77Skettenis 				current_type = NULL;
1801b725ae77Skettenis 			    }
1802b725ae77Skettenis 			  else
1803b725ae77Skettenis 			    {
1804b725ae77Skettenis 			      struct minimal_symbol *msymbol;
1805b725ae77Skettenis 			      char *arg = copy_name (yyvsp[0].ssym.stoken);
1806b725ae77Skettenis 
1807b725ae77Skettenis 			      msymbol =
1808b725ae77Skettenis 				lookup_minimal_symbol (arg, NULL, NULL);
1809b725ae77Skettenis 			      if (msymbol != NULL)
1810b725ae77Skettenis 				{
1811b725ae77Skettenis 				  write_exp_msymbol (msymbol,
1812b725ae77Skettenis 						     lookup_function_type (builtin_type_int),
1813b725ae77Skettenis 						     builtin_type_int);
1814b725ae77Skettenis 				}
1815b725ae77Skettenis 			      else if (!have_full_symbols () && !have_partial_symbols ())
1816b725ae77Skettenis 				error ("No symbol table is loaded.  Use the \"file\" command.");
1817b725ae77Skettenis 			      else
1818b725ae77Skettenis 				error ("No symbol \"%s\" in current context.",
1819b725ae77Skettenis 				       copy_name (yyvsp[0].ssym.stoken));
1820b725ae77Skettenis 			    }
1821b725ae77Skettenis 			}
1822b725ae77Skettenis     break;
1823*11efff7fSkettenis 
1824*11efff7fSkettenis   case 63:
1825b725ae77Skettenis #line 721 "p-exp.y"
1826b725ae77Skettenis     { yyval.tval = lookup_member_type (builtin_type_int, yyvsp[-2].tval); }
1827b725ae77Skettenis     break;
1828*11efff7fSkettenis 
1829*11efff7fSkettenis   case 64:
1830b725ae77Skettenis #line 726 "p-exp.y"
1831b725ae77Skettenis     { yyval.tval = lookup_pointer_type (yyvsp[0].tval); }
1832b725ae77Skettenis     break;
1833*11efff7fSkettenis 
1834*11efff7fSkettenis   case 65:
1835b725ae77Skettenis #line 728 "p-exp.y"
1836b725ae77Skettenis     { yyval.tval = yyvsp[0].tsym.type; }
1837b725ae77Skettenis     break;
1838*11efff7fSkettenis 
1839*11efff7fSkettenis   case 66:
1840b725ae77Skettenis #line 730 "p-exp.y"
1841b725ae77Skettenis     { yyval.tval = lookup_struct (copy_name (yyvsp[0].sval),
1842b725ae77Skettenis 					      expression_context_block); }
1843b725ae77Skettenis     break;
1844*11efff7fSkettenis 
1845*11efff7fSkettenis   case 67:
1846b725ae77Skettenis #line 733 "p-exp.y"
1847b725ae77Skettenis     { yyval.tval = lookup_struct (copy_name (yyvsp[0].sval),
1848b725ae77Skettenis 					      expression_context_block); }
1849b725ae77Skettenis     break;
1850*11efff7fSkettenis 
1851*11efff7fSkettenis   case 68:
1852b725ae77Skettenis #line 740 "p-exp.y"
1853b725ae77Skettenis     { yyval.sval = yyvsp[0].ssym.stoken; }
1854b725ae77Skettenis     break;
1855*11efff7fSkettenis 
1856*11efff7fSkettenis   case 69:
1857b725ae77Skettenis #line 741 "p-exp.y"
1858b725ae77Skettenis     { yyval.sval = yyvsp[0].ssym.stoken; }
1859b725ae77Skettenis     break;
1860*11efff7fSkettenis 
1861*11efff7fSkettenis   case 70:
1862b725ae77Skettenis #line 742 "p-exp.y"
1863b725ae77Skettenis     { yyval.sval = yyvsp[0].tsym.stoken; }
1864b725ae77Skettenis     break;
1865*11efff7fSkettenis 
1866*11efff7fSkettenis   case 71:
1867b725ae77Skettenis #line 743 "p-exp.y"
1868b725ae77Skettenis     { yyval.sval = yyvsp[0].ssym.stoken; }
1869b725ae77Skettenis     break;
1870*11efff7fSkettenis 
1871*11efff7fSkettenis 
1872b725ae77Skettenis     }
1873b725ae77Skettenis 
1874*11efff7fSkettenis /* Line 1000 of yacc.c.  */
1875b725ae77Skettenis 
1876b725ae77Skettenis   yyvsp -= yylen;
1877b725ae77Skettenis   yyssp -= yylen;
1878b725ae77Skettenis 
1879*11efff7fSkettenis 
1880*11efff7fSkettenis   YY_STACK_PRINT (yyss, yyssp);
1881b725ae77Skettenis 
1882b725ae77Skettenis   *++yyvsp = yyval;
1883*11efff7fSkettenis 
1884b725ae77Skettenis 
1885b725ae77Skettenis   /* Now `shift' the result of the reduction.  Determine what state
1886b725ae77Skettenis      that goes to, based on the state we popped back to and the rule
1887b725ae77Skettenis      number reduced by.  */
1888b725ae77Skettenis 
1889b725ae77Skettenis   yyn = yyr1[yyn];
1890b725ae77Skettenis 
1891*11efff7fSkettenis   yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
1892*11efff7fSkettenis   if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
1893b725ae77Skettenis     yystate = yytable[yystate];
1894b725ae77Skettenis   else
1895*11efff7fSkettenis     yystate = yydefgoto[yyn - YYNTOKENS];
1896b725ae77Skettenis 
1897b725ae77Skettenis   goto yynewstate;
1898b725ae77Skettenis 
1899b725ae77Skettenis 
1900b725ae77Skettenis /*------------------------------------.
1901b725ae77Skettenis | yyerrlab -- here on detecting error |
1902b725ae77Skettenis `------------------------------------*/
1903b725ae77Skettenis yyerrlab:
1904b725ae77Skettenis   /* If not already recovering from an error, report this error.  */
1905b725ae77Skettenis   if (!yyerrstatus)
1906b725ae77Skettenis     {
1907b725ae77Skettenis       ++yynerrs;
1908*11efff7fSkettenis #if YYERROR_VERBOSE
1909b725ae77Skettenis       yyn = yypact[yystate];
1910b725ae77Skettenis 
1911*11efff7fSkettenis       if (YYPACT_NINF < yyn && yyn < YYLAST)
1912b725ae77Skettenis 	{
1913b725ae77Skettenis 	  YYSIZE_T yysize = 0;
1914*11efff7fSkettenis 	  int yytype = YYTRANSLATE (yychar);
1915*11efff7fSkettenis 	  const char* yyprefix;
1916b725ae77Skettenis 	  char *yymsg;
1917*11efff7fSkettenis 	  int yyx;
1918b725ae77Skettenis 
1919b725ae77Skettenis 	  /* Start YYX at -YYN if negative to avoid negative indexes in
1920b725ae77Skettenis 	     YYCHECK.  */
1921*11efff7fSkettenis 	  int yyxbegin = yyn < 0 ? -yyn : 0;
1922*11efff7fSkettenis 
1923*11efff7fSkettenis 	  /* Stay within bounds of both yycheck and yytname.  */
1924*11efff7fSkettenis 	  int yychecklim = YYLAST - yyn;
1925*11efff7fSkettenis 	  int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
1926*11efff7fSkettenis 	  int yycount = 0;
1927*11efff7fSkettenis 
1928*11efff7fSkettenis 	  yyprefix = ", expecting ";
1929*11efff7fSkettenis 	  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
1930*11efff7fSkettenis 	    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
1931*11efff7fSkettenis 	      {
1932*11efff7fSkettenis 		yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]);
1933*11efff7fSkettenis 		yycount += 1;
1934*11efff7fSkettenis 		if (yycount == 5)
1935*11efff7fSkettenis 		  {
1936*11efff7fSkettenis 		    yysize = 0;
1937*11efff7fSkettenis 		    break;
1938*11efff7fSkettenis 		  }
1939*11efff7fSkettenis 	      }
1940*11efff7fSkettenis 	  yysize += (sizeof ("syntax error, unexpected ")
1941*11efff7fSkettenis 		     + yystrlen (yytname[yytype]));
1942b725ae77Skettenis 	  yymsg = (char *) YYSTACK_ALLOC (yysize);
1943b725ae77Skettenis 	  if (yymsg != 0)
1944b725ae77Skettenis 	    {
1945*11efff7fSkettenis 	      char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
1946*11efff7fSkettenis 	      yyp = yystpcpy (yyp, yytname[yytype]);
1947b725ae77Skettenis 
1948b725ae77Skettenis 	      if (yycount < 5)
1949b725ae77Skettenis 		{
1950*11efff7fSkettenis 		  yyprefix = ", expecting ";
1951*11efff7fSkettenis 		  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
1952*11efff7fSkettenis 		    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
1953b725ae77Skettenis 		      {
1954*11efff7fSkettenis 			yyp = yystpcpy (yyp, yyprefix);
1955b725ae77Skettenis 			yyp = yystpcpy (yyp, yytname[yyx]);
1956*11efff7fSkettenis 			yyprefix = " or ";
1957b725ae77Skettenis 		      }
1958b725ae77Skettenis 		}
1959b725ae77Skettenis 	      yyerror (yymsg);
1960b725ae77Skettenis 	      YYSTACK_FREE (yymsg);
1961b725ae77Skettenis 	    }
1962b725ae77Skettenis 	  else
1963*11efff7fSkettenis 	    yyerror ("syntax error; also virtual memory exhausted");
1964b725ae77Skettenis 	}
1965b725ae77Skettenis       else
1966*11efff7fSkettenis #endif /* YYERROR_VERBOSE */
1967*11efff7fSkettenis 	yyerror ("syntax error");
1968b725ae77Skettenis     }
1969b725ae77Skettenis 
1970b725ae77Skettenis 
1971*11efff7fSkettenis 
1972b725ae77Skettenis   if (yyerrstatus == 3)
1973b725ae77Skettenis     {
1974b725ae77Skettenis       /* If just tried and failed to reuse lookahead token after an
1975b725ae77Skettenis 	 error, discard it.  */
1976b725ae77Skettenis 
1977*11efff7fSkettenis       if (yychar <= YYEOF)
1978*11efff7fSkettenis         {
1979*11efff7fSkettenis           /* If at end of input, pop the error token,
1980*11efff7fSkettenis 	     then the rest of the stack, then return failure.  */
1981b725ae77Skettenis 	  if (yychar == YYEOF)
1982*11efff7fSkettenis 	     for (;;)
1983*11efff7fSkettenis 	       {
1984*11efff7fSkettenis 		 YYPOPSTACK;
1985*11efff7fSkettenis 		 if (yyssp == yyss)
1986b725ae77Skettenis 		   YYABORT;
1987*11efff7fSkettenis 		 YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
1988*11efff7fSkettenis 		 yydestruct (yystos[*yyssp], yyvsp);
1989*11efff7fSkettenis 	       }
1990*11efff7fSkettenis         }
1991*11efff7fSkettenis       else
1992*11efff7fSkettenis 	{
1993*11efff7fSkettenis 	  YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
1994*11efff7fSkettenis 	  yydestruct (yytoken, &yylval);
1995b725ae77Skettenis 	  yychar = YYEMPTY;
1996*11efff7fSkettenis 
1997*11efff7fSkettenis 	}
1998b725ae77Skettenis     }
1999b725ae77Skettenis 
2000b725ae77Skettenis   /* Else will try to reuse lookahead token after shifting the error
2001b725ae77Skettenis      token.  */
2002*11efff7fSkettenis   goto yyerrlab1;
2003b725ae77Skettenis 
2004b725ae77Skettenis 
2005*11efff7fSkettenis /*---------------------------------------------------.
2006*11efff7fSkettenis | yyerrorlab -- error raised explicitly by YYERROR.  |
2007*11efff7fSkettenis `---------------------------------------------------*/
2008*11efff7fSkettenis yyerrorlab:
2009b725ae77Skettenis 
2010*11efff7fSkettenis #ifdef __GNUC__
2011*11efff7fSkettenis   /* Pacify GCC when the user code never invokes YYERROR and the label
2012*11efff7fSkettenis      yyerrorlab therefore never appears in user code.  */
2013*11efff7fSkettenis   if (0)
2014*11efff7fSkettenis      goto yyerrorlab;
2015b725ae77Skettenis #endif
2016b725ae77Skettenis 
2017*11efff7fSkettenis   yyvsp -= yylen;
2018*11efff7fSkettenis   yyssp -= yylen;
2019*11efff7fSkettenis   yystate = *yyssp;
2020*11efff7fSkettenis   goto yyerrlab1;
2021b725ae77Skettenis 
2022*11efff7fSkettenis 
2023*11efff7fSkettenis /*-------------------------------------------------------------.
2024*11efff7fSkettenis | yyerrlab1 -- common code for both syntax error and YYERROR.  |
2025*11efff7fSkettenis `-------------------------------------------------------------*/
2026*11efff7fSkettenis yyerrlab1:
2027*11efff7fSkettenis   yyerrstatus = 3;	/* Each real token shifted decrements this.  */
2028*11efff7fSkettenis 
2029*11efff7fSkettenis   for (;;)
2030*11efff7fSkettenis     {
2031*11efff7fSkettenis       yyn = yypact[yystate];
2032*11efff7fSkettenis       if (yyn != YYPACT_NINF)
2033*11efff7fSkettenis 	{
2034*11efff7fSkettenis 	  yyn += YYTERROR;
2035*11efff7fSkettenis 	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
2036*11efff7fSkettenis 	    {
2037*11efff7fSkettenis 	      yyn = yytable[yyn];
2038*11efff7fSkettenis 	      if (0 < yyn)
2039*11efff7fSkettenis 		break;
2040*11efff7fSkettenis 	    }
2041*11efff7fSkettenis 	}
2042*11efff7fSkettenis 
2043*11efff7fSkettenis       /* Pop the current state because it cannot handle the error token.  */
2044b725ae77Skettenis       if (yyssp == yyss)
2045b725ae77Skettenis 	YYABORT;
2046b725ae77Skettenis 
2047*11efff7fSkettenis       YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
2048*11efff7fSkettenis       yydestruct (yystos[yystate], yyvsp);
2049*11efff7fSkettenis       YYPOPSTACK;
2050*11efff7fSkettenis       yystate = *yyssp;
2051*11efff7fSkettenis       YY_STACK_PRINT (yyss, yyssp);
2052b725ae77Skettenis     }
2053b725ae77Skettenis 
2054b725ae77Skettenis   if (yyn == YYFINAL)
2055b725ae77Skettenis     YYACCEPT;
2056b725ae77Skettenis 
2057b725ae77Skettenis   YYDPRINTF ((stderr, "Shifting error token, "));
2058b725ae77Skettenis 
2059b725ae77Skettenis   *++yyvsp = yylval;
2060*11efff7fSkettenis 
2061b725ae77Skettenis 
2062b725ae77Skettenis   yystate = yyn;
2063b725ae77Skettenis   goto yynewstate;
2064b725ae77Skettenis 
2065b725ae77Skettenis 
2066b725ae77Skettenis /*-------------------------------------.
2067b725ae77Skettenis | yyacceptlab -- YYACCEPT comes here.  |
2068b725ae77Skettenis `-------------------------------------*/
2069b725ae77Skettenis yyacceptlab:
2070b725ae77Skettenis   yyresult = 0;
2071b725ae77Skettenis   goto yyreturn;
2072b725ae77Skettenis 
2073b725ae77Skettenis /*-----------------------------------.
2074b725ae77Skettenis | yyabortlab -- YYABORT comes here.  |
2075b725ae77Skettenis `-----------------------------------*/
2076b725ae77Skettenis yyabortlab:
2077b725ae77Skettenis   yyresult = 1;
2078b725ae77Skettenis   goto yyreturn;
2079b725ae77Skettenis 
2080*11efff7fSkettenis #ifndef yyoverflow
2081*11efff7fSkettenis /*----------------------------------------------.
2082*11efff7fSkettenis | yyoverflowlab -- parser overflow comes here.  |
2083*11efff7fSkettenis `----------------------------------------------*/
2084b725ae77Skettenis yyoverflowlab:
2085b725ae77Skettenis   yyerror ("parser stack overflow");
2086b725ae77Skettenis   yyresult = 2;
2087b725ae77Skettenis   /* Fall through.  */
2088*11efff7fSkettenis #endif
2089b725ae77Skettenis 
2090b725ae77Skettenis yyreturn:
2091b725ae77Skettenis #ifndef yyoverflow
2092b725ae77Skettenis   if (yyss != yyssa)
2093b725ae77Skettenis     YYSTACK_FREE (yyss);
2094b725ae77Skettenis #endif
2095b725ae77Skettenis   return yyresult;
2096b725ae77Skettenis }
2097*11efff7fSkettenis 
2098*11efff7fSkettenis 
2099b725ae77Skettenis #line 757 "p-exp.y"
2100b725ae77Skettenis 
2101b725ae77Skettenis 
2102b725ae77Skettenis /* Take care of parsing a number (anything that starts with a digit).
2103b725ae77Skettenis    Set yylval and return the token type; update lexptr.
2104b725ae77Skettenis    LEN is the number of characters in it.  */
2105b725ae77Skettenis 
2106b725ae77Skettenis /*** Needs some error checking for the float case ***/
2107b725ae77Skettenis 
2108b725ae77Skettenis static int
parse_number(p,len,parsed_float,putithere)2109b725ae77Skettenis parse_number (p, len, parsed_float, putithere)
2110b725ae77Skettenis      char *p;
2111b725ae77Skettenis      int len;
2112b725ae77Skettenis      int parsed_float;
2113b725ae77Skettenis      YYSTYPE *putithere;
2114b725ae77Skettenis {
2115b725ae77Skettenis   /* FIXME: Shouldn't these be unsigned?  We don't deal with negative values
2116b725ae77Skettenis      here, and we do kind of silly things like cast to unsigned.  */
2117b725ae77Skettenis   LONGEST n = 0;
2118b725ae77Skettenis   LONGEST prevn = 0;
2119b725ae77Skettenis   ULONGEST un;
2120b725ae77Skettenis 
2121b725ae77Skettenis   int i = 0;
2122b725ae77Skettenis   int c;
2123b725ae77Skettenis   int base = input_radix;
2124b725ae77Skettenis   int unsigned_p = 0;
2125b725ae77Skettenis 
2126b725ae77Skettenis   /* Number of "L" suffixes encountered.  */
2127b725ae77Skettenis   int long_p = 0;
2128b725ae77Skettenis 
2129b725ae77Skettenis   /* We have found a "L" or "U" suffix.  */
2130b725ae77Skettenis   int found_suffix = 0;
2131b725ae77Skettenis 
2132b725ae77Skettenis   ULONGEST high_bit;
2133b725ae77Skettenis   struct type *signed_type;
2134b725ae77Skettenis   struct type *unsigned_type;
2135b725ae77Skettenis 
2136b725ae77Skettenis   if (parsed_float)
2137b725ae77Skettenis     {
2138b725ae77Skettenis       /* It's a float since it contains a point or an exponent.  */
2139b725ae77Skettenis       char c;
2140b725ae77Skettenis       int num = 0;	/* number of tokens scanned by scanf */
2141b725ae77Skettenis       char saved_char = p[len];
2142b725ae77Skettenis 
2143b725ae77Skettenis       p[len] = 0;	/* null-terminate the token */
2144b725ae77Skettenis       if (sizeof (putithere->typed_val_float.dval) <= sizeof (float))
2145b725ae77Skettenis 	num = sscanf (p, "%g%c", (float *) &putithere->typed_val_float.dval,&c);
2146b725ae77Skettenis       else if (sizeof (putithere->typed_val_float.dval) <= sizeof (double))
2147b725ae77Skettenis 	num = sscanf (p, "%lg%c", (double *) &putithere->typed_val_float.dval,&c);
2148b725ae77Skettenis       else
2149b725ae77Skettenis 	{
2150b725ae77Skettenis #ifdef SCANF_HAS_LONG_DOUBLE
2151b725ae77Skettenis 	  num = sscanf (p, "%Lg%c", &putithere->typed_val_float.dval,&c);
2152b725ae77Skettenis #else
2153b725ae77Skettenis 	  /* Scan it into a double, then assign it to the long double.
2154b725ae77Skettenis 	     This at least wins with values representable in the range
2155b725ae77Skettenis 	     of doubles. */
2156b725ae77Skettenis 	  double temp;
2157b725ae77Skettenis 	  num = sscanf (p, "%lg%c", &temp,&c);
2158b725ae77Skettenis 	  putithere->typed_val_float.dval = temp;
2159b725ae77Skettenis #endif
2160b725ae77Skettenis 	}
2161b725ae77Skettenis       p[len] = saved_char;	/* restore the input stream */
2162b725ae77Skettenis       if (num != 1) 		/* check scanf found ONLY a float ... */
2163b725ae77Skettenis 	return ERROR;
2164b725ae77Skettenis       /* See if it has `f' or `l' suffix (float or long double).  */
2165b725ae77Skettenis 
2166b725ae77Skettenis       c = tolower (p[len - 1]);
2167b725ae77Skettenis 
2168b725ae77Skettenis       if (c == 'f')
2169b725ae77Skettenis 	putithere->typed_val_float.type = builtin_type_float;
2170b725ae77Skettenis       else if (c == 'l')
2171b725ae77Skettenis 	putithere->typed_val_float.type = builtin_type_long_double;
2172b725ae77Skettenis       else if (isdigit (c) || c == '.')
2173b725ae77Skettenis 	putithere->typed_val_float.type = builtin_type_double;
2174b725ae77Skettenis       else
2175b725ae77Skettenis 	return ERROR;
2176b725ae77Skettenis 
2177b725ae77Skettenis       return FLOAT;
2178b725ae77Skettenis     }
2179b725ae77Skettenis 
2180b725ae77Skettenis   /* Handle base-switching prefixes 0x, 0t, 0d, 0 */
2181b725ae77Skettenis   if (p[0] == '0')
2182b725ae77Skettenis     switch (p[1])
2183b725ae77Skettenis       {
2184b725ae77Skettenis       case 'x':
2185b725ae77Skettenis       case 'X':
2186b725ae77Skettenis 	if (len >= 3)
2187b725ae77Skettenis 	  {
2188b725ae77Skettenis 	    p += 2;
2189b725ae77Skettenis 	    base = 16;
2190b725ae77Skettenis 	    len -= 2;
2191b725ae77Skettenis 	  }
2192b725ae77Skettenis 	break;
2193b725ae77Skettenis 
2194b725ae77Skettenis       case 't':
2195b725ae77Skettenis       case 'T':
2196b725ae77Skettenis       case 'd':
2197b725ae77Skettenis       case 'D':
2198b725ae77Skettenis 	if (len >= 3)
2199b725ae77Skettenis 	  {
2200b725ae77Skettenis 	    p += 2;
2201b725ae77Skettenis 	    base = 10;
2202b725ae77Skettenis 	    len -= 2;
2203b725ae77Skettenis 	  }
2204b725ae77Skettenis 	break;
2205b725ae77Skettenis 
2206b725ae77Skettenis       default:
2207b725ae77Skettenis 	base = 8;
2208b725ae77Skettenis 	break;
2209b725ae77Skettenis       }
2210b725ae77Skettenis 
2211b725ae77Skettenis   while (len-- > 0)
2212b725ae77Skettenis     {
2213b725ae77Skettenis       c = *p++;
2214b725ae77Skettenis       if (c >= 'A' && c <= 'Z')
2215b725ae77Skettenis 	c += 'a' - 'A';
2216b725ae77Skettenis       if (c != 'l' && c != 'u')
2217b725ae77Skettenis 	n *= base;
2218b725ae77Skettenis       if (c >= '0' && c <= '9')
2219b725ae77Skettenis 	{
2220b725ae77Skettenis 	  if (found_suffix)
2221b725ae77Skettenis 	    return ERROR;
2222b725ae77Skettenis 	  n += i = c - '0';
2223b725ae77Skettenis 	}
2224b725ae77Skettenis       else
2225b725ae77Skettenis 	{
2226b725ae77Skettenis 	  if (base > 10 && c >= 'a' && c <= 'f')
2227b725ae77Skettenis 	    {
2228b725ae77Skettenis 	      if (found_suffix)
2229b725ae77Skettenis 		return ERROR;
2230b725ae77Skettenis 	      n += i = c - 'a' + 10;
2231b725ae77Skettenis 	    }
2232b725ae77Skettenis 	  else if (c == 'l')
2233b725ae77Skettenis 	    {
2234b725ae77Skettenis 	      ++long_p;
2235b725ae77Skettenis 	      found_suffix = 1;
2236b725ae77Skettenis 	    }
2237b725ae77Skettenis 	  else if (c == 'u')
2238b725ae77Skettenis 	    {
2239b725ae77Skettenis 	      unsigned_p = 1;
2240b725ae77Skettenis 	      found_suffix = 1;
2241b725ae77Skettenis 	    }
2242b725ae77Skettenis 	  else
2243b725ae77Skettenis 	    return ERROR;	/* Char not a digit */
2244b725ae77Skettenis 	}
2245b725ae77Skettenis       if (i >= base)
2246b725ae77Skettenis 	return ERROR;		/* Invalid digit in this base */
2247b725ae77Skettenis 
2248b725ae77Skettenis       /* Portably test for overflow (only works for nonzero values, so make
2249b725ae77Skettenis 	 a second check for zero).  FIXME: Can't we just make n and prevn
2250b725ae77Skettenis 	 unsigned and avoid this?  */
2251b725ae77Skettenis       if (c != 'l' && c != 'u' && (prevn >= n) && n != 0)
2252b725ae77Skettenis 	unsigned_p = 1;		/* Try something unsigned */
2253b725ae77Skettenis 
2254b725ae77Skettenis       /* Portably test for unsigned overflow.
2255b725ae77Skettenis 	 FIXME: This check is wrong; for example it doesn't find overflow
2256b725ae77Skettenis 	 on 0x123456789 when LONGEST is 32 bits.  */
2257b725ae77Skettenis       if (c != 'l' && c != 'u' && n != 0)
2258b725ae77Skettenis 	{
2259b725ae77Skettenis 	  if ((unsigned_p && (ULONGEST) prevn >= (ULONGEST) n))
2260b725ae77Skettenis 	    error ("Numeric constant too large.");
2261b725ae77Skettenis 	}
2262b725ae77Skettenis       prevn = n;
2263b725ae77Skettenis     }
2264b725ae77Skettenis 
2265b725ae77Skettenis   /* An integer constant is an int, a long, or a long long.  An L
2266b725ae77Skettenis      suffix forces it to be long; an LL suffix forces it to be long
2267b725ae77Skettenis      long.  If not forced to a larger size, it gets the first type of
2268b725ae77Skettenis      the above that it fits in.  To figure out whether it fits, we
2269b725ae77Skettenis      shift it right and see whether anything remains.  Note that we
2270b725ae77Skettenis      can't shift sizeof (LONGEST) * HOST_CHAR_BIT bits or more in one
2271b725ae77Skettenis      operation, because many compilers will warn about such a shift
2272b725ae77Skettenis      (which always produces a zero result).  Sometimes TARGET_INT_BIT
2273b725ae77Skettenis      or TARGET_LONG_BIT will be that big, sometimes not.  To deal with
2274b725ae77Skettenis      the case where it is we just always shift the value more than
2275b725ae77Skettenis      once, with fewer bits each time.  */
2276b725ae77Skettenis 
2277b725ae77Skettenis   un = (ULONGEST)n >> 2;
2278b725ae77Skettenis   if (long_p == 0
2279b725ae77Skettenis       && (un >> (TARGET_INT_BIT - 2)) == 0)
2280b725ae77Skettenis     {
2281b725ae77Skettenis       high_bit = ((ULONGEST)1) << (TARGET_INT_BIT-1);
2282b725ae77Skettenis 
2283b725ae77Skettenis       /* A large decimal (not hex or octal) constant (between INT_MAX
2284b725ae77Skettenis 	 and UINT_MAX) is a long or unsigned long, according to ANSI,
2285b725ae77Skettenis 	 never an unsigned int, but this code treats it as unsigned
2286b725ae77Skettenis 	 int.  This probably should be fixed.  GCC gives a warning on
2287b725ae77Skettenis 	 such constants.  */
2288b725ae77Skettenis 
2289b725ae77Skettenis       unsigned_type = builtin_type_unsigned_int;
2290b725ae77Skettenis       signed_type = builtin_type_int;
2291b725ae77Skettenis     }
2292b725ae77Skettenis   else if (long_p <= 1
2293b725ae77Skettenis 	   && (un >> (TARGET_LONG_BIT - 2)) == 0)
2294b725ae77Skettenis     {
2295b725ae77Skettenis       high_bit = ((ULONGEST)1) << (TARGET_LONG_BIT-1);
2296b725ae77Skettenis       unsigned_type = builtin_type_unsigned_long;
2297b725ae77Skettenis       signed_type = builtin_type_long;
2298b725ae77Skettenis     }
2299b725ae77Skettenis   else
2300b725ae77Skettenis     {
2301b725ae77Skettenis       int shift;
2302b725ae77Skettenis       if (sizeof (ULONGEST) * HOST_CHAR_BIT < TARGET_LONG_LONG_BIT)
2303b725ae77Skettenis 	/* A long long does not fit in a LONGEST.  */
2304b725ae77Skettenis 	shift = (sizeof (ULONGEST) * HOST_CHAR_BIT - 1);
2305b725ae77Skettenis       else
2306b725ae77Skettenis 	shift = (TARGET_LONG_LONG_BIT - 1);
2307b725ae77Skettenis       high_bit = (ULONGEST) 1 << shift;
2308b725ae77Skettenis       unsigned_type = builtin_type_unsigned_long_long;
2309b725ae77Skettenis       signed_type = builtin_type_long_long;
2310b725ae77Skettenis     }
2311b725ae77Skettenis 
2312b725ae77Skettenis    putithere->typed_val_int.val = n;
2313b725ae77Skettenis 
2314b725ae77Skettenis    /* If the high bit of the worked out type is set then this number
2315b725ae77Skettenis       has to be unsigned. */
2316b725ae77Skettenis 
2317b725ae77Skettenis    if (unsigned_p || (n & high_bit))
2318b725ae77Skettenis      {
2319b725ae77Skettenis        putithere->typed_val_int.type = unsigned_type;
2320b725ae77Skettenis      }
2321b725ae77Skettenis    else
2322b725ae77Skettenis      {
2323b725ae77Skettenis        putithere->typed_val_int.type = signed_type;
2324b725ae77Skettenis      }
2325b725ae77Skettenis 
2326b725ae77Skettenis    return INT;
2327b725ae77Skettenis }
2328b725ae77Skettenis 
2329b725ae77Skettenis 
2330b725ae77Skettenis struct type_push
2331b725ae77Skettenis {
2332b725ae77Skettenis   struct type *stored;
2333b725ae77Skettenis   struct type_push *next;
2334b725ae77Skettenis };
2335b725ae77Skettenis 
2336b725ae77Skettenis static struct type_push *tp_top = NULL;
2337b725ae77Skettenis 
2338b725ae77Skettenis static void
push_current_type(void)2339b725ae77Skettenis push_current_type (void)
2340b725ae77Skettenis {
2341b725ae77Skettenis   struct type_push *tpnew;
2342b725ae77Skettenis   tpnew = (struct type_push *) xmalloc (sizeof (struct type_push));
2343b725ae77Skettenis   tpnew->next = tp_top;
2344b725ae77Skettenis   tpnew->stored = current_type;
2345b725ae77Skettenis   current_type = NULL;
2346b725ae77Skettenis   tp_top = tpnew;
2347b725ae77Skettenis }
2348b725ae77Skettenis 
2349b725ae77Skettenis static void
pop_current_type(void)2350b725ae77Skettenis pop_current_type (void)
2351b725ae77Skettenis {
2352b725ae77Skettenis   struct type_push *tp = tp_top;
2353b725ae77Skettenis   if (tp)
2354b725ae77Skettenis     {
2355b725ae77Skettenis       current_type = tp->stored;
2356b725ae77Skettenis       tp_top = tp->next;
2357b725ae77Skettenis       xfree (tp);
2358b725ae77Skettenis     }
2359b725ae77Skettenis }
2360b725ae77Skettenis 
2361b725ae77Skettenis struct token
2362b725ae77Skettenis {
2363b725ae77Skettenis   char *operator;
2364b725ae77Skettenis   int token;
2365b725ae77Skettenis   enum exp_opcode opcode;
2366b725ae77Skettenis };
2367b725ae77Skettenis 
2368b725ae77Skettenis static const struct token tokentab3[] =
2369b725ae77Skettenis   {
2370b725ae77Skettenis     {"shr", RSH, BINOP_END},
2371b725ae77Skettenis     {"shl", LSH, BINOP_END},
2372b725ae77Skettenis     {"and", ANDAND, BINOP_END},
2373b725ae77Skettenis     {"div", DIV, BINOP_END},
2374b725ae77Skettenis     {"not", NOT, BINOP_END},
2375b725ae77Skettenis     {"mod", MOD, BINOP_END},
2376b725ae77Skettenis     {"inc", INCREMENT, BINOP_END},
2377b725ae77Skettenis     {"dec", DECREMENT, BINOP_END},
2378b725ae77Skettenis     {"xor", XOR, BINOP_END}
2379b725ae77Skettenis   };
2380b725ae77Skettenis 
2381b725ae77Skettenis static const struct token tokentab2[] =
2382b725ae77Skettenis   {
2383b725ae77Skettenis     {"or", OR, BINOP_END},
2384b725ae77Skettenis     {"<>", NOTEQUAL, BINOP_END},
2385b725ae77Skettenis     {"<=", LEQ, BINOP_END},
2386b725ae77Skettenis     {">=", GEQ, BINOP_END},
2387b725ae77Skettenis     {":=", ASSIGN, BINOP_END},
2388b725ae77Skettenis     {"::", COLONCOLON, BINOP_END} };
2389b725ae77Skettenis 
2390b725ae77Skettenis /* Allocate uppercased var */
2391b725ae77Skettenis /* make an uppercased copy of tokstart */
uptok(tokstart,namelen)2392b725ae77Skettenis static char * uptok (tokstart, namelen)
2393b725ae77Skettenis   char *tokstart;
2394b725ae77Skettenis   int namelen;
2395b725ae77Skettenis {
2396b725ae77Skettenis   int i;
2397b725ae77Skettenis   char *uptokstart = (char *)xmalloc(namelen+1);
2398b725ae77Skettenis   for (i = 0;i <= namelen;i++)
2399b725ae77Skettenis     {
2400b725ae77Skettenis       if ((tokstart[i]>='a' && tokstart[i]<='z'))
2401b725ae77Skettenis         uptokstart[i] = tokstart[i]-('a'-'A');
2402b725ae77Skettenis       else
2403b725ae77Skettenis         uptokstart[i] = tokstart[i];
2404b725ae77Skettenis     }
2405b725ae77Skettenis   uptokstart[namelen]='\0';
2406b725ae77Skettenis   return uptokstart;
2407b725ae77Skettenis }
2408b725ae77Skettenis /* Read one token, getting characters through lexptr.  */
2409b725ae77Skettenis 
2410b725ae77Skettenis 
2411b725ae77Skettenis static int
yylex()2412b725ae77Skettenis yylex ()
2413b725ae77Skettenis {
2414b725ae77Skettenis   int c;
2415b725ae77Skettenis   int namelen;
2416b725ae77Skettenis   unsigned int i;
2417b725ae77Skettenis   char *tokstart;
2418b725ae77Skettenis   char *uptokstart;
2419b725ae77Skettenis   char *tokptr;
2420b725ae77Skettenis   char *p;
2421b725ae77Skettenis   int explen, tempbufindex;
2422b725ae77Skettenis   static char *tempbuf;
2423b725ae77Skettenis   static int tempbufsize;
2424b725ae77Skettenis 
2425b725ae77Skettenis  retry:
2426b725ae77Skettenis 
2427b725ae77Skettenis   prev_lexptr = lexptr;
2428b725ae77Skettenis 
2429b725ae77Skettenis   tokstart = lexptr;
2430b725ae77Skettenis   explen = strlen (lexptr);
2431b725ae77Skettenis   /* See if it is a special token of length 3.  */
2432b725ae77Skettenis   if (explen > 2)
2433b725ae77Skettenis     for (i = 0; i < sizeof (tokentab3) / sizeof (tokentab3[0]); i++)
2434b725ae77Skettenis       if (strncasecmp (tokstart, tokentab3[i].operator, 3) == 0
2435b725ae77Skettenis           && (!isalpha (tokentab3[i].operator[0]) || explen == 3
2436b725ae77Skettenis               || (!isalpha (tokstart[3]) && !isdigit (tokstart[3]) && tokstart[3] != '_')))
2437b725ae77Skettenis         {
2438b725ae77Skettenis           lexptr += 3;
2439b725ae77Skettenis           yylval.opcode = tokentab3[i].opcode;
2440b725ae77Skettenis           return tokentab3[i].token;
2441b725ae77Skettenis         }
2442b725ae77Skettenis 
2443b725ae77Skettenis   /* See if it is a special token of length 2.  */
2444b725ae77Skettenis   if (explen > 1)
2445b725ae77Skettenis   for (i = 0; i < sizeof (tokentab2) / sizeof (tokentab2[0]); i++)
2446b725ae77Skettenis       if (strncasecmp (tokstart, tokentab2[i].operator, 2) == 0
2447b725ae77Skettenis           && (!isalpha (tokentab2[i].operator[0]) || explen == 2
2448b725ae77Skettenis               || (!isalpha (tokstart[2]) && !isdigit (tokstart[2]) && tokstart[2] != '_')))
2449b725ae77Skettenis         {
2450b725ae77Skettenis           lexptr += 2;
2451b725ae77Skettenis           yylval.opcode = tokentab2[i].opcode;
2452b725ae77Skettenis           return tokentab2[i].token;
2453b725ae77Skettenis         }
2454b725ae77Skettenis 
2455b725ae77Skettenis   switch (c = *tokstart)
2456b725ae77Skettenis     {
2457b725ae77Skettenis     case 0:
2458b725ae77Skettenis       return 0;
2459b725ae77Skettenis 
2460b725ae77Skettenis     case ' ':
2461b725ae77Skettenis     case '\t':
2462b725ae77Skettenis     case '\n':
2463b725ae77Skettenis       lexptr++;
2464b725ae77Skettenis       goto retry;
2465b725ae77Skettenis 
2466b725ae77Skettenis     case '\'':
2467b725ae77Skettenis       /* We either have a character constant ('0' or '\177' for example)
2468b725ae77Skettenis 	 or we have a quoted symbol reference ('foo(int,int)' in object pascal
2469b725ae77Skettenis 	 for example). */
2470b725ae77Skettenis       lexptr++;
2471b725ae77Skettenis       c = *lexptr++;
2472b725ae77Skettenis       if (c == '\\')
2473b725ae77Skettenis 	c = parse_escape (&lexptr);
2474b725ae77Skettenis       else if (c == '\'')
2475b725ae77Skettenis 	error ("Empty character constant.");
2476b725ae77Skettenis 
2477b725ae77Skettenis       yylval.typed_val_int.val = c;
2478b725ae77Skettenis       yylval.typed_val_int.type = builtin_type_char;
2479b725ae77Skettenis 
2480b725ae77Skettenis       c = *lexptr++;
2481b725ae77Skettenis       if (c != '\'')
2482b725ae77Skettenis 	{
2483b725ae77Skettenis 	  namelen = skip_quoted (tokstart) - tokstart;
2484b725ae77Skettenis 	  if (namelen > 2)
2485b725ae77Skettenis 	    {
2486b725ae77Skettenis 	      lexptr = tokstart + namelen;
2487b725ae77Skettenis 	      if (lexptr[-1] != '\'')
2488b725ae77Skettenis 		error ("Unmatched single quote.");
2489b725ae77Skettenis 	      namelen -= 2;
2490b725ae77Skettenis               tokstart++;
2491b725ae77Skettenis               uptokstart = uptok(tokstart,namelen);
2492b725ae77Skettenis 	      goto tryname;
2493b725ae77Skettenis 	    }
2494b725ae77Skettenis 	  error ("Invalid character constant.");
2495b725ae77Skettenis 	}
2496b725ae77Skettenis       return INT;
2497b725ae77Skettenis 
2498b725ae77Skettenis     case '(':
2499b725ae77Skettenis       paren_depth++;
2500b725ae77Skettenis       lexptr++;
2501b725ae77Skettenis       return c;
2502b725ae77Skettenis 
2503b725ae77Skettenis     case ')':
2504b725ae77Skettenis       if (paren_depth == 0)
2505b725ae77Skettenis 	return 0;
2506b725ae77Skettenis       paren_depth--;
2507b725ae77Skettenis       lexptr++;
2508b725ae77Skettenis       return c;
2509b725ae77Skettenis 
2510b725ae77Skettenis     case ',':
2511b725ae77Skettenis       if (comma_terminates && paren_depth == 0)
2512b725ae77Skettenis 	return 0;
2513b725ae77Skettenis       lexptr++;
2514b725ae77Skettenis       return c;
2515b725ae77Skettenis 
2516b725ae77Skettenis     case '.':
2517b725ae77Skettenis       /* Might be a floating point number.  */
2518b725ae77Skettenis       if (lexptr[1] < '0' || lexptr[1] > '9')
2519b725ae77Skettenis 	goto symbol;		/* Nope, must be a symbol. */
2520b725ae77Skettenis       /* FALL THRU into number case.  */
2521b725ae77Skettenis 
2522b725ae77Skettenis     case '0':
2523b725ae77Skettenis     case '1':
2524b725ae77Skettenis     case '2':
2525b725ae77Skettenis     case '3':
2526b725ae77Skettenis     case '4':
2527b725ae77Skettenis     case '5':
2528b725ae77Skettenis     case '6':
2529b725ae77Skettenis     case '7':
2530b725ae77Skettenis     case '8':
2531b725ae77Skettenis     case '9':
2532b725ae77Skettenis       {
2533b725ae77Skettenis 	/* It's a number.  */
2534b725ae77Skettenis 	int got_dot = 0, got_e = 0, toktype;
2535b725ae77Skettenis 	char *p = tokstart;
2536b725ae77Skettenis 	int hex = input_radix > 10;
2537b725ae77Skettenis 
2538b725ae77Skettenis 	if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
2539b725ae77Skettenis 	  {
2540b725ae77Skettenis 	    p += 2;
2541b725ae77Skettenis 	    hex = 1;
2542b725ae77Skettenis 	  }
2543b725ae77Skettenis 	else if (c == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D'))
2544b725ae77Skettenis 	  {
2545b725ae77Skettenis 	    p += 2;
2546b725ae77Skettenis 	    hex = 0;
2547b725ae77Skettenis 	  }
2548b725ae77Skettenis 
2549b725ae77Skettenis 	for (;; ++p)
2550b725ae77Skettenis 	  {
2551b725ae77Skettenis 	    /* This test includes !hex because 'e' is a valid hex digit
2552b725ae77Skettenis 	       and thus does not indicate a floating point number when
2553b725ae77Skettenis 	       the radix is hex.  */
2554b725ae77Skettenis 	    if (!hex && !got_e && (*p == 'e' || *p == 'E'))
2555b725ae77Skettenis 	      got_dot = got_e = 1;
2556b725ae77Skettenis 	    /* This test does not include !hex, because a '.' always indicates
2557b725ae77Skettenis 	       a decimal floating point number regardless of the radix.  */
2558b725ae77Skettenis 	    else if (!got_dot && *p == '.')
2559b725ae77Skettenis 	      got_dot = 1;
2560b725ae77Skettenis 	    else if (got_e && (p[-1] == 'e' || p[-1] == 'E')
2561b725ae77Skettenis 		     && (*p == '-' || *p == '+'))
2562b725ae77Skettenis 	      /* This is the sign of the exponent, not the end of the
2563b725ae77Skettenis 		 number.  */
2564b725ae77Skettenis 	      continue;
2565b725ae77Skettenis 	    /* We will take any letters or digits.  parse_number will
2566b725ae77Skettenis 	       complain if past the radix, or if L or U are not final.  */
2567b725ae77Skettenis 	    else if ((*p < '0' || *p > '9')
2568b725ae77Skettenis 		     && ((*p < 'a' || *p > 'z')
2569b725ae77Skettenis 				  && (*p < 'A' || *p > 'Z')))
2570b725ae77Skettenis 	      break;
2571b725ae77Skettenis 	  }
2572b725ae77Skettenis 	toktype = parse_number (tokstart, p - tokstart, got_dot|got_e, &yylval);
2573b725ae77Skettenis         if (toktype == ERROR)
2574b725ae77Skettenis 	  {
2575b725ae77Skettenis 	    char *err_copy = (char *) alloca (p - tokstart + 1);
2576b725ae77Skettenis 
2577b725ae77Skettenis 	    memcpy (err_copy, tokstart, p - tokstart);
2578b725ae77Skettenis 	    err_copy[p - tokstart] = 0;
2579b725ae77Skettenis 	    error ("Invalid number \"%s\".", err_copy);
2580b725ae77Skettenis 	  }
2581b725ae77Skettenis 	lexptr = p;
2582b725ae77Skettenis 	return toktype;
2583b725ae77Skettenis       }
2584b725ae77Skettenis 
2585b725ae77Skettenis     case '+':
2586b725ae77Skettenis     case '-':
2587b725ae77Skettenis     case '*':
2588b725ae77Skettenis     case '/':
2589b725ae77Skettenis     case '|':
2590b725ae77Skettenis     case '&':
2591b725ae77Skettenis     case '^':
2592b725ae77Skettenis     case '~':
2593b725ae77Skettenis     case '!':
2594b725ae77Skettenis     case '@':
2595b725ae77Skettenis     case '<':
2596b725ae77Skettenis     case '>':
2597b725ae77Skettenis     case '[':
2598b725ae77Skettenis     case ']':
2599b725ae77Skettenis     case '?':
2600b725ae77Skettenis     case ':':
2601b725ae77Skettenis     case '=':
2602b725ae77Skettenis     case '{':
2603b725ae77Skettenis     case '}':
2604b725ae77Skettenis     symbol:
2605b725ae77Skettenis       lexptr++;
2606b725ae77Skettenis       return c;
2607b725ae77Skettenis 
2608b725ae77Skettenis     case '"':
2609b725ae77Skettenis 
2610b725ae77Skettenis       /* Build the gdb internal form of the input string in tempbuf,
2611b725ae77Skettenis 	 translating any standard C escape forms seen.  Note that the
2612b725ae77Skettenis 	 buffer is null byte terminated *only* for the convenience of
2613b725ae77Skettenis 	 debugging gdb itself and printing the buffer contents when
2614b725ae77Skettenis 	 the buffer contains no embedded nulls.  Gdb does not depend
2615b725ae77Skettenis 	 upon the buffer being null byte terminated, it uses the length
2616b725ae77Skettenis 	 string instead.  This allows gdb to handle C strings (as well
2617b725ae77Skettenis 	 as strings in other languages) with embedded null bytes */
2618b725ae77Skettenis 
2619b725ae77Skettenis       tokptr = ++tokstart;
2620b725ae77Skettenis       tempbufindex = 0;
2621b725ae77Skettenis 
2622b725ae77Skettenis       do {
2623b725ae77Skettenis 	/* Grow the static temp buffer if necessary, including allocating
2624b725ae77Skettenis 	   the first one on demand. */
2625b725ae77Skettenis 	if (tempbufindex + 1 >= tempbufsize)
2626b725ae77Skettenis 	  {
2627b725ae77Skettenis 	    tempbuf = (char *) xrealloc (tempbuf, tempbufsize += 64);
2628b725ae77Skettenis 	  }
2629b725ae77Skettenis 
2630b725ae77Skettenis 	switch (*tokptr)
2631b725ae77Skettenis 	  {
2632b725ae77Skettenis 	  case '\0':
2633b725ae77Skettenis 	  case '"':
2634b725ae77Skettenis 	    /* Do nothing, loop will terminate. */
2635b725ae77Skettenis 	    break;
2636b725ae77Skettenis 	  case '\\':
2637b725ae77Skettenis 	    tokptr++;
2638b725ae77Skettenis 	    c = parse_escape (&tokptr);
2639b725ae77Skettenis 	    if (c == -1)
2640b725ae77Skettenis 	      {
2641b725ae77Skettenis 		continue;
2642b725ae77Skettenis 	      }
2643b725ae77Skettenis 	    tempbuf[tempbufindex++] = c;
2644b725ae77Skettenis 	    break;
2645b725ae77Skettenis 	  default:
2646b725ae77Skettenis 	    tempbuf[tempbufindex++] = *tokptr++;
2647b725ae77Skettenis 	    break;
2648b725ae77Skettenis 	  }
2649b725ae77Skettenis       } while ((*tokptr != '"') && (*tokptr != '\0'));
2650b725ae77Skettenis       if (*tokptr++ != '"')
2651b725ae77Skettenis 	{
2652b725ae77Skettenis 	  error ("Unterminated string in expression.");
2653b725ae77Skettenis 	}
2654b725ae77Skettenis       tempbuf[tempbufindex] = '\0';	/* See note above */
2655b725ae77Skettenis       yylval.sval.ptr = tempbuf;
2656b725ae77Skettenis       yylval.sval.length = tempbufindex;
2657b725ae77Skettenis       lexptr = tokptr;
2658b725ae77Skettenis       return (STRING);
2659b725ae77Skettenis     }
2660b725ae77Skettenis 
2661b725ae77Skettenis   if (!(c == '_' || c == '$'
2662b725ae77Skettenis 	|| (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
2663b725ae77Skettenis     /* We must have come across a bad character (e.g. ';').  */
2664b725ae77Skettenis     error ("Invalid character '%c' in expression.", c);
2665b725ae77Skettenis 
2666b725ae77Skettenis   /* It's a name.  See how long it is.  */
2667b725ae77Skettenis   namelen = 0;
2668b725ae77Skettenis   for (c = tokstart[namelen];
2669b725ae77Skettenis        (c == '_' || c == '$' || (c >= '0' && c <= '9')
2670b725ae77Skettenis 	|| (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '<');)
2671b725ae77Skettenis     {
2672b725ae77Skettenis       /* Template parameter lists are part of the name.
2673b725ae77Skettenis 	 FIXME: This mishandles `print $a<4&&$a>3'.  */
2674b725ae77Skettenis       if (c == '<')
2675b725ae77Skettenis 	{
2676b725ae77Skettenis 	  int i = namelen;
2677b725ae77Skettenis 	  int nesting_level = 1;
2678b725ae77Skettenis 	  while (tokstart[++i])
2679b725ae77Skettenis 	    {
2680b725ae77Skettenis 	      if (tokstart[i] == '<')
2681b725ae77Skettenis 		nesting_level++;
2682b725ae77Skettenis 	      else if (tokstart[i] == '>')
2683b725ae77Skettenis 		{
2684b725ae77Skettenis 		  if (--nesting_level == 0)
2685b725ae77Skettenis 		    break;
2686b725ae77Skettenis 		}
2687b725ae77Skettenis 	    }
2688b725ae77Skettenis 	  if (tokstart[i] == '>')
2689b725ae77Skettenis 	    namelen = i;
2690b725ae77Skettenis 	  else
2691b725ae77Skettenis 	    break;
2692b725ae77Skettenis 	}
2693b725ae77Skettenis 
2694b725ae77Skettenis       /* do NOT uppercase internals because of registers !!! */
2695b725ae77Skettenis       c = tokstart[++namelen];
2696b725ae77Skettenis     }
2697b725ae77Skettenis 
2698b725ae77Skettenis   uptokstart = uptok(tokstart,namelen);
2699b725ae77Skettenis 
2700b725ae77Skettenis   /* The token "if" terminates the expression and is NOT
2701b725ae77Skettenis      removed from the input stream.  */
2702b725ae77Skettenis   if (namelen == 2 && uptokstart[0] == 'I' && uptokstart[1] == 'F')
2703b725ae77Skettenis     {
2704b725ae77Skettenis       return 0;
2705b725ae77Skettenis     }
2706b725ae77Skettenis 
2707b725ae77Skettenis   lexptr += namelen;
2708b725ae77Skettenis 
2709b725ae77Skettenis   tryname:
2710b725ae77Skettenis 
2711b725ae77Skettenis   /* Catch specific keywords.  Should be done with a data structure.  */
2712b725ae77Skettenis   switch (namelen)
2713b725ae77Skettenis     {
2714b725ae77Skettenis     case 6:
2715b725ae77Skettenis       if (DEPRECATED_STREQ (uptokstart, "OBJECT"))
2716b725ae77Skettenis 	return CLASS;
2717b725ae77Skettenis       if (DEPRECATED_STREQ (uptokstart, "RECORD"))
2718b725ae77Skettenis 	return STRUCT;
2719b725ae77Skettenis       if (DEPRECATED_STREQ (uptokstart, "SIZEOF"))
2720b725ae77Skettenis 	return SIZEOF;
2721b725ae77Skettenis       break;
2722b725ae77Skettenis     case 5:
2723b725ae77Skettenis       if (DEPRECATED_STREQ (uptokstart, "CLASS"))
2724b725ae77Skettenis 	return CLASS;
2725b725ae77Skettenis       if (DEPRECATED_STREQ (uptokstart, "FALSE"))
2726b725ae77Skettenis 	{
2727b725ae77Skettenis           yylval.lval = 0;
2728b725ae77Skettenis           return FALSEKEYWORD;
2729b725ae77Skettenis         }
2730b725ae77Skettenis       break;
2731b725ae77Skettenis     case 4:
2732b725ae77Skettenis       if (DEPRECATED_STREQ (uptokstart, "TRUE"))
2733b725ae77Skettenis 	{
2734b725ae77Skettenis           yylval.lval = 1;
2735b725ae77Skettenis   	  return TRUEKEYWORD;
2736b725ae77Skettenis         }
2737b725ae77Skettenis       if (DEPRECATED_STREQ (uptokstart, "SELF"))
2738b725ae77Skettenis         {
2739b725ae77Skettenis           /* here we search for 'this' like
2740b725ae77Skettenis              inserted in FPC stabs debug info */
2741b725ae77Skettenis 	  static const char this_name[] = "this";
2742b725ae77Skettenis 
2743b725ae77Skettenis 	  if (lookup_symbol (this_name, expression_context_block,
2744b725ae77Skettenis 			     VAR_DOMAIN, (int *) NULL,
2745b725ae77Skettenis 			     (struct symtab **) NULL))
2746b725ae77Skettenis 	    return THIS;
2747b725ae77Skettenis 	}
2748b725ae77Skettenis       break;
2749b725ae77Skettenis     default:
2750b725ae77Skettenis       break;
2751b725ae77Skettenis     }
2752b725ae77Skettenis 
2753b725ae77Skettenis   yylval.sval.ptr = tokstart;
2754b725ae77Skettenis   yylval.sval.length = namelen;
2755b725ae77Skettenis 
2756b725ae77Skettenis   if (*tokstart == '$')
2757b725ae77Skettenis     {
2758b725ae77Skettenis       /* $ is the normal prefix for pascal hexadecimal values
2759b725ae77Skettenis         but this conflicts with the GDB use for debugger variables
2760b725ae77Skettenis         so in expression to enter hexadecimal values
2761b725ae77Skettenis         we still need to use C syntax with 0xff  */
2762b725ae77Skettenis       write_dollar_variable (yylval.sval);
2763b725ae77Skettenis       return VARIABLE;
2764b725ae77Skettenis     }
2765b725ae77Skettenis 
2766b725ae77Skettenis   /* Use token-type BLOCKNAME for symbols that happen to be defined as
2767b725ae77Skettenis      functions or symtabs.  If this is not so, then ...
2768b725ae77Skettenis      Use token-type TYPENAME for symbols that happen to be defined
2769b725ae77Skettenis      currently as names of types; NAME for other symbols.
2770b725ae77Skettenis      The caller is not constrained to care about the distinction.  */
2771b725ae77Skettenis   {
2772b725ae77Skettenis     char *tmp = copy_name (yylval.sval);
2773b725ae77Skettenis     struct symbol *sym;
2774b725ae77Skettenis     int is_a_field_of_this = 0;
2775b725ae77Skettenis     int is_a_field = 0;
2776b725ae77Skettenis     int hextype;
2777b725ae77Skettenis 
2778b725ae77Skettenis 
2779b725ae77Skettenis     if (search_field && current_type)
2780b725ae77Skettenis       is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL);
2781b725ae77Skettenis     if (is_a_field)
2782b725ae77Skettenis       sym = NULL;
2783b725ae77Skettenis     else
2784b725ae77Skettenis       sym = lookup_symbol (tmp, expression_context_block,
2785b725ae77Skettenis 			   VAR_DOMAIN,
2786b725ae77Skettenis 			   &is_a_field_of_this,
2787b725ae77Skettenis 			   (struct symtab **) NULL);
2788b725ae77Skettenis     /* second chance uppercased (as Free Pascal does).  */
2789b725ae77Skettenis     if (!sym && !is_a_field_of_this && !is_a_field)
2790b725ae77Skettenis       {
2791b725ae77Skettenis        for (i = 0; i <= namelen; i++)
2792b725ae77Skettenis          {
2793b725ae77Skettenis            if ((tmp[i] >= 'a' && tmp[i] <= 'z'))
2794b725ae77Skettenis              tmp[i] -= ('a'-'A');
2795b725ae77Skettenis          }
2796b725ae77Skettenis        if (search_field && current_type)
2797b725ae77Skettenis 	 is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL);
2798b725ae77Skettenis        if (is_a_field)
2799b725ae77Skettenis 	 sym = NULL;
2800b725ae77Skettenis        else
2801b725ae77Skettenis 	 sym = lookup_symbol (tmp, expression_context_block,
2802b725ae77Skettenis                         VAR_DOMAIN,
2803b725ae77Skettenis                         &is_a_field_of_this,
2804b725ae77Skettenis                         (struct symtab **) NULL);
2805b725ae77Skettenis        if (sym || is_a_field_of_this || is_a_field)
2806b725ae77Skettenis          for (i = 0; i <= namelen; i++)
2807b725ae77Skettenis            {
2808b725ae77Skettenis              if ((tokstart[i] >= 'a' && tokstart[i] <= 'z'))
2809b725ae77Skettenis                tokstart[i] -= ('a'-'A');
2810b725ae77Skettenis            }
2811b725ae77Skettenis       }
2812b725ae77Skettenis     /* Third chance Capitalized (as GPC does).  */
2813b725ae77Skettenis     if (!sym && !is_a_field_of_this && !is_a_field)
2814b725ae77Skettenis       {
2815b725ae77Skettenis        for (i = 0; i <= namelen; i++)
2816b725ae77Skettenis          {
2817b725ae77Skettenis            if (i == 0)
2818b725ae77Skettenis              {
2819b725ae77Skettenis               if ((tmp[i] >= 'a' && tmp[i] <= 'z'))
2820b725ae77Skettenis                 tmp[i] -= ('a'-'A');
2821b725ae77Skettenis              }
2822b725ae77Skettenis            else
2823b725ae77Skettenis            if ((tmp[i] >= 'A' && tmp[i] <= 'Z'))
2824b725ae77Skettenis              tmp[i] -= ('A'-'a');
2825b725ae77Skettenis           }
2826b725ae77Skettenis        if (search_field && current_type)
2827b725ae77Skettenis 	 is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL);
2828b725ae77Skettenis        if (is_a_field)
2829b725ae77Skettenis 	 sym = NULL;
2830b725ae77Skettenis        else
2831b725ae77Skettenis 	 sym = lookup_symbol (tmp, expression_context_block,
2832b725ae77Skettenis                          VAR_DOMAIN,
2833b725ae77Skettenis                          &is_a_field_of_this,
2834b725ae77Skettenis                          (struct symtab **) NULL);
2835b725ae77Skettenis        if (sym || is_a_field_of_this || is_a_field)
2836b725ae77Skettenis           for (i = 0; i <= namelen; i++)
2837b725ae77Skettenis             {
2838b725ae77Skettenis               if (i == 0)
2839b725ae77Skettenis                 {
2840b725ae77Skettenis                   if ((tokstart[i] >= 'a' && tokstart[i] <= 'z'))
2841b725ae77Skettenis                     tokstart[i] -= ('a'-'A');
2842b725ae77Skettenis                 }
2843b725ae77Skettenis               else
2844b725ae77Skettenis                 if ((tokstart[i] >= 'A' && tokstart[i] <= 'Z'))
2845b725ae77Skettenis                   tokstart[i] -= ('A'-'a');
2846b725ae77Skettenis             }
2847b725ae77Skettenis       }
2848b725ae77Skettenis 
2849b725ae77Skettenis     if (is_a_field)
2850b725ae77Skettenis       {
2851b725ae77Skettenis 	tempbuf = (char *) xrealloc (tempbuf, namelen + 1);
2852b725ae77Skettenis 	strncpy (tempbuf, tokstart, namelen); tempbuf [namelen] = 0;
2853b725ae77Skettenis 	yylval.sval.ptr = tempbuf;
2854b725ae77Skettenis 	yylval.sval.length = namelen;
2855b725ae77Skettenis 	return FIELDNAME;
2856b725ae77Skettenis       }
2857b725ae77Skettenis     /* Call lookup_symtab, not lookup_partial_symtab, in case there are
2858b725ae77Skettenis        no psymtabs (coff, xcoff, or some future change to blow away the
2859b725ae77Skettenis        psymtabs once once symbols are read).  */
2860b725ae77Skettenis     if ((sym && SYMBOL_CLASS (sym) == LOC_BLOCK) ||
2861b725ae77Skettenis         lookup_symtab (tmp))
2862b725ae77Skettenis       {
2863b725ae77Skettenis 	yylval.ssym.sym = sym;
2864b725ae77Skettenis 	yylval.ssym.is_a_field_of_this = is_a_field_of_this;
2865b725ae77Skettenis 	return BLOCKNAME;
2866b725ae77Skettenis       }
2867b725ae77Skettenis     if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
2868b725ae77Skettenis         {
2869b725ae77Skettenis #if 1
2870b725ae77Skettenis 	  /* Despite the following flaw, we need to keep this code enabled.
2871b725ae77Skettenis 	     Because we can get called from check_stub_method, if we don't
2872b725ae77Skettenis 	     handle nested types then it screws many operations in any
2873b725ae77Skettenis 	     program which uses nested types.  */
2874b725ae77Skettenis 	  /* In "A::x", if x is a member function of A and there happens
2875b725ae77Skettenis 	     to be a type (nested or not, since the stabs don't make that
2876b725ae77Skettenis 	     distinction) named x, then this code incorrectly thinks we
2877b725ae77Skettenis 	     are dealing with nested types rather than a member function.  */
2878b725ae77Skettenis 
2879b725ae77Skettenis 	  char *p;
2880b725ae77Skettenis 	  char *namestart;
2881b725ae77Skettenis 	  struct symbol *best_sym;
2882b725ae77Skettenis 
2883b725ae77Skettenis 	  /* Look ahead to detect nested types.  This probably should be
2884b725ae77Skettenis 	     done in the grammar, but trying seemed to introduce a lot
2885b725ae77Skettenis 	     of shift/reduce and reduce/reduce conflicts.  It's possible
2886b725ae77Skettenis 	     that it could be done, though.  Or perhaps a non-grammar, but
2887b725ae77Skettenis 	     less ad hoc, approach would work well.  */
2888b725ae77Skettenis 
2889b725ae77Skettenis 	  /* Since we do not currently have any way of distinguishing
2890b725ae77Skettenis 	     a nested type from a non-nested one (the stabs don't tell
2891b725ae77Skettenis 	     us whether a type is nested), we just ignore the
2892b725ae77Skettenis 	     containing type.  */
2893b725ae77Skettenis 
2894b725ae77Skettenis 	  p = lexptr;
2895b725ae77Skettenis 	  best_sym = sym;
2896b725ae77Skettenis 	  while (1)
2897b725ae77Skettenis 	    {
2898b725ae77Skettenis 	      /* Skip whitespace.  */
2899b725ae77Skettenis 	      while (*p == ' ' || *p == '\t' || *p == '\n')
2900b725ae77Skettenis 		++p;
2901b725ae77Skettenis 	      if (*p == ':' && p[1] == ':')
2902b725ae77Skettenis 		{
2903b725ae77Skettenis 		  /* Skip the `::'.  */
2904b725ae77Skettenis 		  p += 2;
2905b725ae77Skettenis 		  /* Skip whitespace.  */
2906b725ae77Skettenis 		  while (*p == ' ' || *p == '\t' || *p == '\n')
2907b725ae77Skettenis 		    ++p;
2908b725ae77Skettenis 		  namestart = p;
2909b725ae77Skettenis 		  while (*p == '_' || *p == '$' || (*p >= '0' && *p <= '9')
2910b725ae77Skettenis 			 || (*p >= 'a' && *p <= 'z')
2911b725ae77Skettenis 			 || (*p >= 'A' && *p <= 'Z'))
2912b725ae77Skettenis 		    ++p;
2913b725ae77Skettenis 		  if (p != namestart)
2914b725ae77Skettenis 		    {
2915b725ae77Skettenis 		      struct symbol *cur_sym;
2916b725ae77Skettenis 		      /* As big as the whole rest of the expression, which is
2917b725ae77Skettenis 			 at least big enough.  */
2918b725ae77Skettenis 		      char *ncopy = alloca (strlen (tmp)+strlen (namestart)+3);
2919b725ae77Skettenis 		      char *tmp1;
2920b725ae77Skettenis 
2921b725ae77Skettenis 		      tmp1 = ncopy;
2922b725ae77Skettenis 		      memcpy (tmp1, tmp, strlen (tmp));
2923b725ae77Skettenis 		      tmp1 += strlen (tmp);
2924b725ae77Skettenis 		      memcpy (tmp1, "::", 2);
2925b725ae77Skettenis 		      tmp1 += 2;
2926b725ae77Skettenis 		      memcpy (tmp1, namestart, p - namestart);
2927b725ae77Skettenis 		      tmp1[p - namestart] = '\0';
2928b725ae77Skettenis 		      cur_sym = lookup_symbol (ncopy, expression_context_block,
2929b725ae77Skettenis 					       VAR_DOMAIN, (int *) NULL,
2930b725ae77Skettenis 					       (struct symtab **) NULL);
2931b725ae77Skettenis 		      if (cur_sym)
2932b725ae77Skettenis 			{
2933b725ae77Skettenis 			  if (SYMBOL_CLASS (cur_sym) == LOC_TYPEDEF)
2934b725ae77Skettenis 			    {
2935b725ae77Skettenis 			      best_sym = cur_sym;
2936b725ae77Skettenis 			      lexptr = p;
2937b725ae77Skettenis 			    }
2938b725ae77Skettenis 			  else
2939b725ae77Skettenis 			    break;
2940b725ae77Skettenis 			}
2941b725ae77Skettenis 		      else
2942b725ae77Skettenis 			break;
2943b725ae77Skettenis 		    }
2944b725ae77Skettenis 		  else
2945b725ae77Skettenis 		    break;
2946b725ae77Skettenis 		}
2947b725ae77Skettenis 	      else
2948b725ae77Skettenis 		break;
2949b725ae77Skettenis 	    }
2950b725ae77Skettenis 
2951b725ae77Skettenis 	  yylval.tsym.type = SYMBOL_TYPE (best_sym);
2952b725ae77Skettenis #else /* not 0 */
2953b725ae77Skettenis 	  yylval.tsym.type = SYMBOL_TYPE (sym);
2954b725ae77Skettenis #endif /* not 0 */
2955b725ae77Skettenis 	  return TYPENAME;
2956b725ae77Skettenis         }
2957*11efff7fSkettenis     yylval.tsym.type
2958*11efff7fSkettenis       = language_lookup_primitive_type_by_name (current_language,
2959*11efff7fSkettenis 						current_gdbarch, tmp);
2960*11efff7fSkettenis     if (yylval.tsym.type != NULL)
2961b725ae77Skettenis       return TYPENAME;
2962b725ae77Skettenis 
2963b725ae77Skettenis     /* Input names that aren't symbols but ARE valid hex numbers,
2964b725ae77Skettenis        when the input radix permits them, can be names or numbers
2965b725ae77Skettenis        depending on the parse.  Note we support radixes > 16 here.  */
2966b725ae77Skettenis     if (!sym &&
2967b725ae77Skettenis         ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10) ||
2968b725ae77Skettenis          (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
2969b725ae77Skettenis       {
2970b725ae77Skettenis  	YYSTYPE newlval;	/* Its value is ignored.  */
2971b725ae77Skettenis 	hextype = parse_number (tokstart, namelen, 0, &newlval);
2972b725ae77Skettenis 	if (hextype == INT)
2973b725ae77Skettenis 	  {
2974b725ae77Skettenis 	    yylval.ssym.sym = sym;
2975b725ae77Skettenis 	    yylval.ssym.is_a_field_of_this = is_a_field_of_this;
2976b725ae77Skettenis 	    return NAME_OR_INT;
2977b725ae77Skettenis 	  }
2978b725ae77Skettenis       }
2979b725ae77Skettenis 
2980b725ae77Skettenis     free(uptokstart);
2981b725ae77Skettenis     /* Any other kind of symbol */
2982b725ae77Skettenis     yylval.ssym.sym = sym;
2983b725ae77Skettenis     yylval.ssym.is_a_field_of_this = is_a_field_of_this;
2984b725ae77Skettenis     return NAME;
2985b725ae77Skettenis   }
2986b725ae77Skettenis }
2987b725ae77Skettenis 
2988b725ae77Skettenis void
yyerror(msg)2989b725ae77Skettenis yyerror (msg)
2990b725ae77Skettenis      char *msg;
2991b725ae77Skettenis {
2992b725ae77Skettenis   if (prev_lexptr)
2993b725ae77Skettenis     lexptr = prev_lexptr;
2994b725ae77Skettenis 
2995b725ae77Skettenis   error ("A %s in expression, near `%s'.", (msg ? msg : "error"), lexptr);
2996b725ae77Skettenis }
2997*11efff7fSkettenis 
2998*11efff7fSkettenis 
2999