* sim/cris/hw/rv-n-cris/irq6.ms: New test.
[platform/upstream/binutils.git] / gdb / objc-exp.y
1 /* YACC parser for C expressions, for GDB.
2
3    Copyright (C) 1986, 1989, 1990, 1991, 1993, 1994, 2002, 2006
4    Free Software Foundation, Inc.
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street, Fifth Floor,
19    Boston, MA 02110-1301, USA.  */
20
21 /* Parse a C expression from text in a string, and return the result
22    as a struct expression pointer.  That structure contains arithmetic
23    operations in reverse polish, with constants represented by
24    operations that are followed by special data.  See expression.h for
25    the details of the format.  What is important here is that it can
26    be built up sequentially during the process of parsing; the lower
27    levels of the tree always come first in the result.
28
29    Note that malloc's and realloc's in this file are transformed to
30    xmalloc and xrealloc respectively by the same sed command in the
31    makefile that remaps any other malloc/realloc inserted by the
32    parser generator.  Doing this with #defines and trying to control
33    the interaction with include files (<malloc.h> and <stdlib.h> for
34    example) just became too messy, particularly when such includes can
35    be inserted at random times by the parser generator.  */
36    
37 %{
38
39 #include "defs.h"
40 #include "gdb_string.h"
41 #include <ctype.h>
42 #include "expression.h"
43
44 #include "objc-lang.h"  /* For objc language constructs.  */
45
46 #include "value.h"
47 #include "parser-defs.h"
48 #include "language.h"
49 #include "c-lang.h"
50 #include "bfd.h" /* Required by objfiles.h.  */
51 #include "symfile.h" /* Required by objfiles.h.  */
52 #include "objfiles.h" /* For have_full_symbols and have_partial_symbols.  */
53 #include "top.h"
54 #include "completer.h" /* For skip_quoted().  */
55 #include "block.h"
56
57 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror,
58    etc), as well as gratuitiously global symbol names, so we can have
59    multiple yacc generated parsers in gdb.  Note that these are only
60    the variables produced by yacc.  If other parser generators (bison,
61    byacc, etc) produce additional global names that conflict at link
62    time, then those parser generators need to be fixed instead of
63    adding those names to this list.  */
64
65 #define yymaxdepth      objc_maxdepth
66 #define yyparse         objc_parse
67 #define yylex           objc_lex
68 #define yyerror         objc_error
69 #define yylval          objc_lval
70 #define yychar          objc_char
71 #define yydebug         objc_debug
72 #define yypact          objc_pact       
73 #define yyr1            objc_r1                 
74 #define yyr2            objc_r2                 
75 #define yydef           objc_def                
76 #define yychk           objc_chk                
77 #define yypgo           objc_pgo                
78 #define yyact           objc_act                
79 #define yyexca          objc_exca
80 #define yyerrflag       objc_errflag
81 #define yynerrs         objc_nerrs
82 #define yyps            objc_ps
83 #define yypv            objc_pv
84 #define yys             objc_s
85 #define yy_yys          objc_yys
86 #define yystate         objc_state
87 #define yytmp           objc_tmp
88 #define yyv             objc_v
89 #define yy_yyv          objc_yyv
90 #define yyval           objc_val
91 #define yylloc          objc_lloc
92 #define yyreds          objc_reds               /* With YYDEBUG defined */
93 #define yytoks          objc_toks               /* With YYDEBUG defined */
94 #define yyname          objc_name               /* With YYDEBUG defined */
95 #define yyrule          objc_rule               /* With YYDEBUG defined */
96 #define yylhs           objc_yylhs
97 #define yylen           objc_yylen
98 #define yydefred        objc_yydefred
99 #define yydgoto         objc_yydgoto
100 #define yysindex        objc_yysindex
101 #define yyrindex        objc_yyrindex
102 #define yygindex        objc_yygindex
103 #define yytable         objc_yytable
104 #define yycheck         objc_yycheck
105
106 #ifndef YYDEBUG
107 #define YYDEBUG 0               /* Default to no yydebug support.  */
108 #endif
109
110 int
111 yyparse PARAMS ((void));
112
113 static int
114 yylex PARAMS ((void));
115
116 void
117 yyerror PARAMS ((char *));
118
119 %}
120
121 /* Although the yacc "value" of an expression is not used,
122    since the result is stored in the structure being created,
123    other node types do have values.  */
124
125 %union
126   {
127     LONGEST lval;
128     struct {
129       LONGEST val;
130       struct type *type;
131     } typed_val_int;
132     struct {
133       DOUBLEST dval;
134       struct type *type;
135     } typed_val_float;
136     struct symbol *sym;
137     struct type *tval;
138     struct stoken sval;
139     struct ttype tsym;
140     struct symtoken ssym;
141     int voidval;
142     struct block *bval;
143     enum exp_opcode opcode;
144     struct internalvar *ivar;
145     struct objc_class_str class;
146
147     struct type **tvec;
148     int *ivec;
149   }
150
151 %{
152 /* YYSTYPE gets defined by %union.  */
153 static int
154 parse_number PARAMS ((char *, int, int, YYSTYPE *));
155 %}
156
157 %type <voidval> exp exp1 type_exp start variable qualified_name lcurly
158 %type <lval> rcurly
159 %type <tval> type typebase
160 %type <tvec> nonempty_typelist
161 /* %type <bval> block */
162
163 /* Fancy type parsing.  */
164 %type <voidval> func_mod direct_abs_decl abs_decl
165 %type <tval> ptype
166 %type <lval> array_mod
167
168 %token <typed_val_int> INT
169 %token <typed_val_float> FLOAT
170
171 /* Both NAME and TYPENAME tokens represent symbols in the input, and
172    both convey their data as strings.  But a TYPENAME is a string that
173    happens to be defined as a typedef or builtin type name (such as
174    int or char) and a NAME is any other symbol.  Contexts where this
175    distinction is not important can use the nonterminal "name", which
176    matches either NAME or TYPENAME.  */
177
178 %token <sval> STRING
179 %token <sval> NSSTRING          /* ObjC Foundation "NSString" literal */
180 %token <sval> SELECTOR          /* ObjC "@selector" pseudo-operator   */
181 %token <ssym> NAME /* BLOCKNAME defined below to give it higher precedence. */
182 %token <tsym> TYPENAME
183 %token <class> CLASSNAME        /* ObjC Class name */
184 %type <sval> name
185 %type <ssym> name_not_typename
186 %type <tsym> typename
187
188 /* A NAME_OR_INT is a symbol which is not known in the symbol table,
189    but which would parse as a valid number in the current input radix.
190    E.g. "c" when input_radix==16.  Depending on the parse, it will be
191    turned into a name or into a number.  */
192
193 %token <ssym> NAME_OR_INT 
194
195 %token STRUCT CLASS UNION ENUM SIZEOF UNSIGNED COLONCOLON 
196 %token TEMPLATE
197 %token ERROR
198
199 /* Special type cases, put in to allow the parser to distinguish
200    different legal basetypes.  */
201 %token SIGNED_KEYWORD LONG SHORT INT_KEYWORD CONST_KEYWORD VOLATILE_KEYWORD DOUBLE_KEYWORD
202
203 %token <voidval> VARIABLE
204
205 %token <opcode> ASSIGN_MODIFY
206
207 %left ','
208 %left ABOVE_COMMA
209 %right '=' ASSIGN_MODIFY
210 %right '?'
211 %left OROR
212 %left ANDAND
213 %left '|'
214 %left '^'
215 %left '&'
216 %left EQUAL NOTEQUAL
217 %left '<' '>' LEQ GEQ
218 %left LSH RSH
219 %left '@'
220 %left '+' '-'
221 %left '*' '/' '%'
222 %right UNARY INCREMENT DECREMENT
223 %right ARROW '.' '[' '('
224 %token <ssym> BLOCKNAME 
225 %type <bval> block
226 %left COLONCOLON
227
228 \f
229 %%
230
231 start   :       exp1
232         |       type_exp
233         ;
234
235 type_exp:       type
236                         { write_exp_elt_opcode(OP_TYPE);
237                           write_exp_elt_type($1);
238                           write_exp_elt_opcode(OP_TYPE);}
239         ;
240
241 /* Expressions, including the comma operator.  */
242 exp1    :       exp
243         |       exp1 ',' exp
244                         { write_exp_elt_opcode (BINOP_COMMA); }
245         ;
246
247 /* Expressions, not including the comma operator.  */
248 exp     :       '*' exp    %prec UNARY
249                         { write_exp_elt_opcode (UNOP_IND); }
250         ;
251
252 exp     :       '&' exp    %prec UNARY
253                         { write_exp_elt_opcode (UNOP_ADDR); }
254         ;
255
256 exp     :       '-' exp    %prec UNARY
257                         { write_exp_elt_opcode (UNOP_NEG); }
258         ;
259
260 exp     :       '!' exp    %prec UNARY
261                         { write_exp_elt_opcode (UNOP_LOGICAL_NOT); }
262         ;
263
264 exp     :       '~' exp    %prec UNARY
265                         { write_exp_elt_opcode (UNOP_COMPLEMENT); }
266         ;
267
268 exp     :       INCREMENT exp    %prec UNARY
269                         { write_exp_elt_opcode (UNOP_PREINCREMENT); }
270         ;
271
272 exp     :       DECREMENT exp    %prec UNARY
273                         { write_exp_elt_opcode (UNOP_PREDECREMENT); }
274         ;
275
276 exp     :       exp INCREMENT    %prec UNARY
277                         { write_exp_elt_opcode (UNOP_POSTINCREMENT); }
278         ;
279
280 exp     :       exp DECREMENT    %prec UNARY
281                         { write_exp_elt_opcode (UNOP_POSTDECREMENT); }
282         ;
283
284 exp     :       SIZEOF exp       %prec UNARY
285                         { write_exp_elt_opcode (UNOP_SIZEOF); }
286         ;
287
288 exp     :       exp ARROW name
289                         { write_exp_elt_opcode (STRUCTOP_PTR);
290                           write_exp_string ($3);
291                           write_exp_elt_opcode (STRUCTOP_PTR); }
292         ;
293
294 exp     :       exp ARROW qualified_name
295                         { /* exp->type::name becomes exp->*(&type::name) */
296                           /* Note: this doesn't work if name is a
297                              static member!  FIXME */
298                           write_exp_elt_opcode (UNOP_ADDR);
299                           write_exp_elt_opcode (STRUCTOP_MPTR); }
300         ;
301 exp     :       exp ARROW '*' exp
302                         { write_exp_elt_opcode (STRUCTOP_MPTR); }
303         ;
304
305 exp     :       exp '.' name
306                         { write_exp_elt_opcode (STRUCTOP_STRUCT);
307                           write_exp_string ($3);
308                           write_exp_elt_opcode (STRUCTOP_STRUCT); }
309         ;
310
311
312 exp     :       exp '.' qualified_name
313                         { /* exp.type::name becomes exp.*(&type::name) */
314                           /* Note: this doesn't work if name is a
315                              static member!  FIXME */
316                           write_exp_elt_opcode (UNOP_ADDR);
317                           write_exp_elt_opcode (STRUCTOP_MEMBER); }
318         ;
319
320 exp     :       exp '.' '*' exp
321                         { write_exp_elt_opcode (STRUCTOP_MEMBER); }
322         ;
323
324 exp     :       exp '[' exp1 ']'
325                         { write_exp_elt_opcode (BINOP_SUBSCRIPT); }
326         ;
327 /*
328  * The rules below parse ObjC message calls of the form:
329  *      '[' target selector {':' argument}* ']'
330  */
331
332 exp     :       '[' TYPENAME
333                         {
334                           CORE_ADDR class;
335
336                           class = lookup_objc_class (copy_name ($2.stoken));
337                           if (class == 0)
338                             error ("%s is not an ObjC Class", 
339                                    copy_name ($2.stoken));
340                           write_exp_elt_opcode (OP_LONG);
341                           write_exp_elt_type (builtin_type_int);
342                           write_exp_elt_longcst ((LONGEST) class);
343                           write_exp_elt_opcode (OP_LONG);
344                           start_msglist();
345                         }
346                 msglist ']'
347                         { write_exp_elt_opcode (OP_OBJC_MSGCALL);
348                           end_msglist();
349                           write_exp_elt_opcode (OP_OBJC_MSGCALL); 
350                         }
351         ;
352
353 exp     :       '[' CLASSNAME
354                         {
355                           write_exp_elt_opcode (OP_LONG);
356                           write_exp_elt_type (builtin_type_int);
357                           write_exp_elt_longcst ((LONGEST) $2.class);
358                           write_exp_elt_opcode (OP_LONG);
359                           start_msglist();
360                         }
361                 msglist ']'
362                         { write_exp_elt_opcode (OP_OBJC_MSGCALL);
363                           end_msglist();
364                           write_exp_elt_opcode (OP_OBJC_MSGCALL); 
365                         }
366         ;
367
368 exp     :       '[' exp
369                         { start_msglist(); }
370                 msglist ']'
371                         { write_exp_elt_opcode (OP_OBJC_MSGCALL);
372                           end_msglist();
373                           write_exp_elt_opcode (OP_OBJC_MSGCALL); 
374                         }
375         ;
376
377 msglist :       name
378                         { add_msglist(&$1, 0); }
379         |       msgarglist
380         ;
381
382 msgarglist :    msgarg
383         |       msgarglist msgarg
384         ;
385
386 msgarg  :       name ':' exp
387                         { add_msglist(&$1, 1); }
388         |       ':' exp /* Unnamed arg.  */
389                         { add_msglist(0, 1);   }
390         |       ',' exp /* Variable number of args.  */
391                         { add_msglist(0, 0);   }
392         ;
393
394 exp     :       exp '(' 
395                         /* This is to save the value of arglist_len
396                            being accumulated by an outer function call.  */
397                         { start_arglist (); }
398                 arglist ')'     %prec ARROW
399                         { write_exp_elt_opcode (OP_FUNCALL);
400                           write_exp_elt_longcst ((LONGEST) end_arglist ());
401                           write_exp_elt_opcode (OP_FUNCALL); }
402         ;
403
404 lcurly  :       '{'
405                         { start_arglist (); }
406         ;
407
408 arglist :
409         ;
410
411 arglist :       exp
412                         { arglist_len = 1; }
413         ;
414
415 arglist :       arglist ',' exp   %prec ABOVE_COMMA
416                         { arglist_len++; }
417         ;
418
419 rcurly  :       '}'
420                         { $$ = end_arglist () - 1; }
421         ;
422 exp     :       lcurly arglist rcurly   %prec ARROW
423                         { write_exp_elt_opcode (OP_ARRAY);
424                           write_exp_elt_longcst ((LONGEST) 0);
425                           write_exp_elt_longcst ((LONGEST) $3);
426                           write_exp_elt_opcode (OP_ARRAY); }
427         ;
428
429 exp     :       lcurly type rcurly exp  %prec UNARY
430                         { write_exp_elt_opcode (UNOP_MEMVAL);
431                           write_exp_elt_type ($2);
432                           write_exp_elt_opcode (UNOP_MEMVAL); }
433         ;
434
435 exp     :       '(' type ')' exp  %prec UNARY
436                         { write_exp_elt_opcode (UNOP_CAST);
437                           write_exp_elt_type ($2);
438                           write_exp_elt_opcode (UNOP_CAST); }
439         ;
440
441 exp     :       '(' exp1 ')'
442                         { }
443         ;
444
445 /* Binary operators in order of decreasing precedence.  */
446
447 exp     :       exp '@' exp
448                         { write_exp_elt_opcode (BINOP_REPEAT); }
449         ;
450
451 exp     :       exp '*' exp
452                         { write_exp_elt_opcode (BINOP_MUL); }
453         ;
454
455 exp     :       exp '/' exp
456                         { write_exp_elt_opcode (BINOP_DIV); }
457         ;
458
459 exp     :       exp '%' exp
460                         { write_exp_elt_opcode (BINOP_REM); }
461         ;
462
463 exp     :       exp '+' exp
464                         { write_exp_elt_opcode (BINOP_ADD); }
465         ;
466
467 exp     :       exp '-' exp
468                         { write_exp_elt_opcode (BINOP_SUB); }
469         ;
470
471 exp     :       exp LSH exp
472                         { write_exp_elt_opcode (BINOP_LSH); }
473         ;
474
475 exp     :       exp RSH exp
476                         { write_exp_elt_opcode (BINOP_RSH); }
477         ;
478
479 exp     :       exp EQUAL exp
480                         { write_exp_elt_opcode (BINOP_EQUAL); }
481         ;
482
483 exp     :       exp NOTEQUAL exp
484                         { write_exp_elt_opcode (BINOP_NOTEQUAL); }
485         ;
486
487 exp     :       exp LEQ exp
488                         { write_exp_elt_opcode (BINOP_LEQ); }
489         ;
490
491 exp     :       exp GEQ exp
492                         { write_exp_elt_opcode (BINOP_GEQ); }
493         ;
494
495 exp     :       exp '<' exp
496                         { write_exp_elt_opcode (BINOP_LESS); }
497         ;
498
499 exp     :       exp '>' exp
500                         { write_exp_elt_opcode (BINOP_GTR); }
501         ;
502
503 exp     :       exp '&' exp
504                         { write_exp_elt_opcode (BINOP_BITWISE_AND); }
505         ;
506
507 exp     :       exp '^' exp
508                         { write_exp_elt_opcode (BINOP_BITWISE_XOR); }
509         ;
510
511 exp     :       exp '|' exp
512                         { write_exp_elt_opcode (BINOP_BITWISE_IOR); }
513         ;
514
515 exp     :       exp ANDAND exp
516                         { write_exp_elt_opcode (BINOP_LOGICAL_AND); }
517         ;
518
519 exp     :       exp OROR exp
520                         { write_exp_elt_opcode (BINOP_LOGICAL_OR); }
521         ;
522
523 exp     :       exp '?' exp ':' exp     %prec '?'
524                         { write_exp_elt_opcode (TERNOP_COND); }
525         ;
526                           
527 exp     :       exp '=' exp
528                         { write_exp_elt_opcode (BINOP_ASSIGN); }
529         ;
530
531 exp     :       exp ASSIGN_MODIFY exp
532                         { write_exp_elt_opcode (BINOP_ASSIGN_MODIFY);
533                           write_exp_elt_opcode ($2);
534                           write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); }
535         ;
536
537 exp     :       INT
538                         { write_exp_elt_opcode (OP_LONG);
539                           write_exp_elt_type ($1.type);
540                           write_exp_elt_longcst ((LONGEST)($1.val));
541                           write_exp_elt_opcode (OP_LONG); }
542         ;
543
544 exp     :       NAME_OR_INT
545                         { YYSTYPE val;
546                           parse_number ($1.stoken.ptr, $1.stoken.length, 0, &val);
547                           write_exp_elt_opcode (OP_LONG);
548                           write_exp_elt_type (val.typed_val_int.type);
549                           write_exp_elt_longcst ((LONGEST)val.typed_val_int.val);
550                           write_exp_elt_opcode (OP_LONG);
551                         }
552         ;
553
554
555 exp     :       FLOAT
556                         { write_exp_elt_opcode (OP_DOUBLE);
557                           write_exp_elt_type ($1.type);
558                           write_exp_elt_dblcst ($1.dval);
559                           write_exp_elt_opcode (OP_DOUBLE); }
560         ;
561
562 exp     :       variable
563         ;
564
565 exp     :       VARIABLE
566                         /* Already written by write_dollar_variable.  */
567         ;
568
569 exp     :       SELECTOR 
570                         {
571                           write_exp_elt_opcode (OP_OBJC_SELECTOR);
572                           write_exp_string ($1);
573                           write_exp_elt_opcode (OP_OBJC_SELECTOR); }
574         ;
575
576 exp     :       SIZEOF '(' type ')'     %prec UNARY
577                         { write_exp_elt_opcode (OP_LONG);
578                           write_exp_elt_type (builtin_type_int);
579                           CHECK_TYPEDEF ($3);
580                           write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3));
581                           write_exp_elt_opcode (OP_LONG); }
582         ;
583
584 exp     :       STRING
585                         { /* C strings are converted into array
586                              constants with an explicit null byte
587                              added at the end.  Thus the array upper
588                              bound is the string length.  There is no
589                              such thing in C as a completely empty
590                              string.  */
591                           char *sp = $1.ptr; int count = $1.length;
592                           while (count-- > 0)
593                             {
594                               write_exp_elt_opcode (OP_LONG);
595                               write_exp_elt_type (builtin_type_char);
596                               write_exp_elt_longcst ((LONGEST)(*sp++));
597                               write_exp_elt_opcode (OP_LONG);
598                             }
599                           write_exp_elt_opcode (OP_LONG);
600                           write_exp_elt_type (builtin_type_char);
601                           write_exp_elt_longcst ((LONGEST)'\0');
602                           write_exp_elt_opcode (OP_LONG);
603                           write_exp_elt_opcode (OP_ARRAY);
604                           write_exp_elt_longcst ((LONGEST) 0);
605                           write_exp_elt_longcst ((LONGEST) ($1.length));
606                           write_exp_elt_opcode (OP_ARRAY); }
607         ;
608
609 exp     :       NSSTRING        /* ObjC NextStep NSString constant
610                                  * of the form '@' '"' string '"'.
611                                  */
612                         { write_exp_elt_opcode (OP_OBJC_NSSTRING);
613                           write_exp_string ($1);
614                           write_exp_elt_opcode (OP_OBJC_NSSTRING); }
615         ;
616
617 block   :       BLOCKNAME
618                         {
619                           if ($1.sym != 0)
620                               $$ = SYMBOL_BLOCK_VALUE ($1.sym);
621                           else
622                             {
623                               struct symtab *tem =
624                                   lookup_symtab (copy_name ($1.stoken));
625                               if (tem)
626                                 $$ = BLOCKVECTOR_BLOCK (BLOCKVECTOR (tem), STATIC_BLOCK);
627                               else
628                                 error ("No file or function \"%s\".",
629                                        copy_name ($1.stoken));
630                             }
631                         }
632         ;
633
634 block   :       block COLONCOLON name
635                         { struct symbol *tem
636                             = lookup_symbol (copy_name ($3), $1,
637                                              VAR_DOMAIN, (int *) NULL,
638                                              (struct symtab **) NULL);
639                           if (!tem || SYMBOL_CLASS (tem) != LOC_BLOCK)
640                             error ("No function \"%s\" in specified context.",
641                                    copy_name ($3));
642                           $$ = SYMBOL_BLOCK_VALUE (tem); }
643         ;
644
645 variable:       block COLONCOLON name
646                         { struct symbol *sym;
647                           sym = lookup_symbol (copy_name ($3), $1,
648                                                VAR_DOMAIN, (int *) NULL,
649                                                (struct symtab **) NULL);
650                           if (sym == 0)
651                             error ("No symbol \"%s\" in specified context.",
652                                    copy_name ($3));
653
654                           write_exp_elt_opcode (OP_VAR_VALUE);
655                           /* block_found is set by lookup_symbol.  */
656                           write_exp_elt_block (block_found);
657                           write_exp_elt_sym (sym);
658                           write_exp_elt_opcode (OP_VAR_VALUE); }
659         ;
660
661 qualified_name: typebase COLONCOLON name
662                         {
663                           struct type *type = $1;
664                           if (TYPE_CODE (type) != TYPE_CODE_STRUCT
665                               && TYPE_CODE (type) != TYPE_CODE_UNION)
666                             error ("`%s' is not defined as an aggregate type.",
667                                    TYPE_NAME (type));
668
669                           write_exp_elt_opcode (OP_SCOPE);
670                           write_exp_elt_type (type);
671                           write_exp_string ($3);
672                           write_exp_elt_opcode (OP_SCOPE);
673                         }
674         |       typebase COLONCOLON '~' name
675                         {
676                           struct type *type = $1;
677                           struct stoken tmp_token;
678                           if (TYPE_CODE (type) != TYPE_CODE_STRUCT
679                               && TYPE_CODE (type) != TYPE_CODE_UNION)
680                             error ("`%s' is not defined as an aggregate type.",
681                                    TYPE_NAME (type));
682
683                           if (!DEPRECATED_STREQ (type_name_no_tag (type), $4.ptr))
684                             error ("invalid destructor `%s::~%s'",
685                                    type_name_no_tag (type), $4.ptr);
686
687                           tmp_token.ptr = (char*) alloca ($4.length + 2);
688                           tmp_token.length = $4.length + 1;
689                           tmp_token.ptr[0] = '~';
690                           memcpy (tmp_token.ptr+1, $4.ptr, $4.length);
691                           tmp_token.ptr[tmp_token.length] = 0;
692                           write_exp_elt_opcode (OP_SCOPE);
693                           write_exp_elt_type (type);
694                           write_exp_string (tmp_token);
695                           write_exp_elt_opcode (OP_SCOPE);
696                         }
697         ;
698
699 variable:       qualified_name
700         |       COLONCOLON name
701                         {
702                           char *name = copy_name ($2);
703                           struct symbol *sym;
704                           struct minimal_symbol *msymbol;
705
706                           sym =
707                             lookup_symbol (name, (const struct block *) NULL,
708                                            VAR_DOMAIN, (int *) NULL,
709                                            (struct symtab **) NULL);
710                           if (sym)
711                             {
712                               write_exp_elt_opcode (OP_VAR_VALUE);
713                               write_exp_elt_block (NULL);
714                               write_exp_elt_sym (sym);
715                               write_exp_elt_opcode (OP_VAR_VALUE);
716                               break;
717                             }
718
719                           msymbol = lookup_minimal_symbol (name, NULL, NULL);
720                           if (msymbol != NULL)
721                             {
722                               write_exp_msymbol (msymbol,
723                                                  lookup_function_type (builtin_type_int),
724                                                  builtin_type_int);
725                             }
726                           else
727                             if (!have_full_symbols () && !have_partial_symbols ())
728                               error ("No symbol table is loaded.  Use the \"file\" command.");
729                             else
730                               error ("No symbol \"%s\" in current context.", name);
731                         }
732         ;
733
734 variable:       name_not_typename
735                         { struct symbol *sym = $1.sym;
736
737                           if (sym)
738                             {
739                               if (symbol_read_needs_frame (sym))
740                                 {
741                                   if (innermost_block == 0 ||
742                                       contained_in (block_found, 
743                                                     innermost_block))
744                                     innermost_block = block_found;
745                                 }
746
747                               write_exp_elt_opcode (OP_VAR_VALUE);
748                               /* We want to use the selected frame, not
749                                  another more inner frame which happens to
750                                  be in the same block.  */
751                               write_exp_elt_block (NULL);
752                               write_exp_elt_sym (sym);
753                               write_exp_elt_opcode (OP_VAR_VALUE);
754                             }
755                           else if ($1.is_a_field_of_this)
756                             {
757                               /* C++/ObjC: it hangs off of `this'/'self'.  
758                                  Must not inadvertently convert from a 
759                                  method call to data ref.  */
760                               if (innermost_block == 0 || 
761                                   contained_in (block_found, innermost_block))
762                                 innermost_block = block_found;
763                               write_exp_elt_opcode (OP_OBJC_SELF);
764                               write_exp_elt_opcode (OP_OBJC_SELF);
765                               write_exp_elt_opcode (STRUCTOP_PTR);
766                               write_exp_string ($1.stoken);
767                               write_exp_elt_opcode (STRUCTOP_PTR);
768                             }
769                           else
770                             {
771                               struct minimal_symbol *msymbol;
772                               char *arg = copy_name ($1.stoken);
773
774                               msymbol =
775                                 lookup_minimal_symbol (arg, NULL, NULL);
776                               if (msymbol != NULL)
777                                 {
778                                   write_exp_msymbol (msymbol,
779                                                      lookup_function_type (builtin_type_int),
780                                                      builtin_type_int);
781                                 }
782                               else if (!have_full_symbols () && 
783                                        !have_partial_symbols ())
784                                 error ("No symbol table is loaded.  Use the \"file\" command.");
785                               else
786                                 error ("No symbol \"%s\" in current context.",
787                                        copy_name ($1.stoken));
788                             }
789                         }
790         ;
791
792
793 ptype   :       typebase
794         /* "const" and "volatile" are curently ignored.  A type
795            qualifier before the type is currently handled in the
796            typebase rule.  The reason for recognizing these here
797            (shift/reduce conflicts) might be obsolete now that some
798            pointer to member rules have been deleted.  */
799         |       typebase CONST_KEYWORD
800         |       typebase VOLATILE_KEYWORD
801         |       typebase abs_decl
802                 { $$ = follow_types ($1); }
803         |       typebase CONST_KEYWORD abs_decl
804                 { $$ = follow_types ($1); }
805         |       typebase VOLATILE_KEYWORD abs_decl
806                 { $$ = follow_types ($1); }
807         ;
808
809 abs_decl:       '*'
810                         { push_type (tp_pointer); $$ = 0; }
811         |       '*' abs_decl
812                         { push_type (tp_pointer); $$ = $2; }
813         |       '&'
814                         { push_type (tp_reference); $$ = 0; }
815         |       '&' abs_decl
816                         { push_type (tp_reference); $$ = $2; }
817         |       direct_abs_decl
818         ;
819
820 direct_abs_decl: '(' abs_decl ')'
821                         { $$ = $2; }
822         |       direct_abs_decl array_mod
823                         {
824                           push_type_int ($2);
825                           push_type (tp_array);
826                         }
827         |       array_mod
828                         {
829                           push_type_int ($1);
830                           push_type (tp_array);
831                           $$ = 0;
832                         }
833
834         |       direct_abs_decl func_mod
835                         { push_type (tp_function); }
836         |       func_mod
837                         { push_type (tp_function); }
838         ;
839
840 array_mod:      '[' ']'
841                         { $$ = -1; }
842         |       '[' INT ']'
843                         { $$ = $2.val; }
844         ;
845
846 func_mod:       '(' ')'
847                         { $$ = 0; }
848         |       '(' nonempty_typelist ')'
849                         { free ($2); $$ = 0; }
850         ;
851
852 /* We used to try to recognize more pointer to member types here, but
853    that didn't work (shift/reduce conflicts meant that these rules
854    never got executed).  The problem is that
855      int (foo::bar::baz::bizzle)
856    is a function type but
857      int (foo::bar::baz::bizzle::*)
858    is a pointer to member type.  Stroustrup loses again!  */
859
860 type    :       ptype
861         |       typebase COLONCOLON '*'
862                         { $$ = lookup_member_type (builtin_type_int, $1); }
863         ;
864
865 typebase  /* Implements (approximately): (type-qualifier)* type-specifier.  */
866         :       TYPENAME
867                         { $$ = $1.type; }
868         |       CLASSNAME
869                         {
870                           if ($1.type == NULL)
871                             error ("No symbol \"%s\" in current context.", 
872                                    copy_name($1.stoken));
873                           else
874                             $$ = $1.type;
875                         }
876         |       INT_KEYWORD
877                         { $$ = builtin_type_int; }
878         |       LONG
879                         { $$ = builtin_type_long; }
880         |       SHORT
881                         { $$ = builtin_type_short; }
882         |       LONG INT_KEYWORD
883                         { $$ = builtin_type_long; }
884         |       UNSIGNED LONG INT_KEYWORD
885                         { $$ = builtin_type_unsigned_long; }
886         |       LONG LONG
887                         { $$ = builtin_type_long_long; }
888         |       LONG LONG INT_KEYWORD
889                         { $$ = builtin_type_long_long; }
890         |       UNSIGNED LONG LONG
891                         { $$ = builtin_type_unsigned_long_long; }
892         |       UNSIGNED LONG LONG INT_KEYWORD
893                         { $$ = builtin_type_unsigned_long_long; }
894         |       SHORT INT_KEYWORD
895                         { $$ = builtin_type_short; }
896         |       UNSIGNED SHORT INT_KEYWORD
897                         { $$ = builtin_type_unsigned_short; }
898         |       DOUBLE_KEYWORD
899                         { $$ = builtin_type_double; }
900         |       LONG DOUBLE_KEYWORD
901                         { $$ = builtin_type_long_double; }
902         |       STRUCT name
903                         { $$ = lookup_struct (copy_name ($2),
904                                               expression_context_block); }
905         |       CLASS name
906                         { $$ = lookup_struct (copy_name ($2),
907                                               expression_context_block); }
908         |       UNION name
909                         { $$ = lookup_union (copy_name ($2),
910                                              expression_context_block); }
911         |       ENUM name
912                         { $$ = lookup_enum (copy_name ($2),
913                                             expression_context_block); }
914         |       UNSIGNED typename
915                         { $$ = lookup_unsigned_typename (TYPE_NAME($2.type)); }
916         |       UNSIGNED
917                         { $$ = builtin_type_unsigned_int; }
918         |       SIGNED_KEYWORD typename
919                         { $$ = lookup_signed_typename (TYPE_NAME($2.type)); }
920         |       SIGNED_KEYWORD
921                         { $$ = builtin_type_int; }
922         |       TEMPLATE name '<' type '>'
923                         { $$ = lookup_template_type(copy_name($2), $4,
924                                                     expression_context_block);
925                         }
926         /* "const" and "volatile" are curently ignored.  A type
927            qualifier after the type is handled in the ptype rule.  I
928            think these could be too.  */
929         |       CONST_KEYWORD typebase { $$ = $2; }
930         |       VOLATILE_KEYWORD typebase { $$ = $2; }
931         ;
932
933 typename:       TYPENAME
934         |       INT_KEYWORD
935                 {
936                   $$.stoken.ptr = "int";
937                   $$.stoken.length = 3;
938                   $$.type = builtin_type_int;
939                 }
940         |       LONG
941                 {
942                   $$.stoken.ptr = "long";
943                   $$.stoken.length = 4;
944                   $$.type = builtin_type_long;
945                 }
946         |       SHORT
947                 {
948                   $$.stoken.ptr = "short";
949                   $$.stoken.length = 5;
950                   $$.type = builtin_type_short;
951                 }
952         ;
953
954 nonempty_typelist
955         :       type
956                 { $$ = (struct type **) malloc (sizeof (struct type *) * 2);
957                   $<ivec>$[0] = 1;      /* Number of types in vector.  */
958                   $$[1] = $1;
959                 }
960         |       nonempty_typelist ',' type
961                 { int len = sizeof (struct type *) * (++($<ivec>1[0]) + 1);
962                   $$ = (struct type **) realloc ((char *) $1, len);
963                   $$[$<ivec>$[0]] = $3;
964                 }
965         ;
966
967 name    :       NAME        { $$ = $1.stoken; }
968         |       BLOCKNAME   { $$ = $1.stoken; }
969         |       TYPENAME    { $$ = $1.stoken; }
970         |       CLASSNAME   { $$ = $1.stoken; }
971         |       NAME_OR_INT { $$ = $1.stoken; }
972         ;
973
974 name_not_typename :     NAME
975         |       BLOCKNAME
976 /* These would be useful if name_not_typename was useful, but it is
977    just a fake for "variable", so these cause reduce/reduce conflicts
978    because the parser can't tell whether NAME_OR_INT is a
979    name_not_typename (=variable, =exp) or just an exp.  If
980    name_not_typename was ever used in an lvalue context where only a
981    name could occur, this might be useful.  */
982 /*      | NAME_OR_INT */
983         ;
984
985 %%
986
987 /* Take care of parsing a number (anything that starts with a digit).
988    Set yylval and return the token type; update lexptr.  LEN is the
989    number of characters in it.  */
990
991 /*** Needs some error checking for the float case.  ***/
992
993 static int
994 parse_number (p, len, parsed_float, putithere)
995      char *p;
996      int len;
997      int parsed_float;
998      YYSTYPE *putithere;
999 {
1000   /* FIXME: Shouldn't these be unsigned?  We don't deal with negative
1001      values here, and we do kind of silly things like cast to
1002      unsigned.  */
1003   LONGEST n = 0;
1004   LONGEST prevn = 0;
1005   unsigned LONGEST un;
1006
1007   int i = 0;
1008   int c;
1009   int base = input_radix;
1010   int unsigned_p = 0;
1011
1012   /* Number of "L" suffixes encountered.  */
1013   int long_p = 0;
1014
1015   /* We have found a "L" or "U" suffix.  */
1016   int found_suffix = 0;
1017
1018   unsigned LONGEST high_bit;
1019   struct type *signed_type;
1020   struct type *unsigned_type;
1021
1022   if (parsed_float)
1023     {
1024       char c;
1025
1026       /* It's a float since it contains a point or an exponent.  */
1027
1028       sscanf (p, DOUBLEST_SCAN_FORMAT "%c",
1029               &putithere->typed_val_float.dval, &c);
1030
1031       /* See if it has `f' or `l' suffix (float or long double).  */
1032
1033       c = tolower (p[len - 1]);
1034
1035       if (c == 'f')
1036         putithere->typed_val_float.type = builtin_type_float;
1037       else if (c == 'l')
1038         putithere->typed_val_float.type = builtin_type_long_double;
1039       else if (isdigit (c) || c == '.')
1040         putithere->typed_val_float.type = builtin_type_double;
1041       else
1042         return ERROR;
1043
1044       return FLOAT;
1045     }
1046
1047   /* Handle base-switching prefixes 0x, 0t, 0d, and 0.  */
1048   if (p[0] == '0')
1049     switch (p[1])
1050       {
1051       case 'x':
1052       case 'X':
1053         if (len >= 3)
1054           {
1055             p += 2;
1056             base = 16;
1057             len -= 2;
1058           }
1059         break;
1060
1061       case 't':
1062       case 'T':
1063       case 'd':
1064       case 'D':
1065         if (len >= 3)
1066           {
1067             p += 2;
1068             base = 10;
1069             len -= 2;
1070           }
1071         break;
1072
1073       default:
1074         base = 8;
1075         break;
1076       }
1077
1078   while (len-- > 0)
1079     {
1080       c = *p++;
1081       if (c >= 'A' && c <= 'Z')
1082         c += 'a' - 'A';
1083       if (c != 'l' && c != 'u')
1084         n *= base;
1085       if (c >= '0' && c <= '9')
1086         {
1087           if (found_suffix)
1088             return ERROR;
1089           n += i = c - '0';
1090         }
1091       else
1092         {
1093           if (base > 10 && c >= 'a' && c <= 'f')
1094             {
1095               if (found_suffix)
1096                 return ERROR;
1097               n += i = c - 'a' + 10;
1098             }
1099           else if (c == 'l')
1100             {
1101               ++long_p;
1102               found_suffix = 1;
1103             }
1104           else if (c == 'u')
1105             {
1106               unsigned_p = 1;
1107               found_suffix = 1;
1108             }
1109           else
1110             return ERROR;       /* Char not a digit.  */
1111         }
1112       if (i >= base)
1113         return ERROR;           /* Invalid digit in this base.  */
1114
1115       /* Portably test for overflow (only works for nonzero values, so
1116          make a second check for zero).  FIXME: Can't we just make n
1117          and prevn unsigned and avoid this?  */
1118       if (c != 'l' && c != 'u' && (prevn >= n) && n != 0)
1119         unsigned_p = 1;         /* Try something unsigned.  */
1120
1121       /* Portably test for unsigned overflow.
1122          FIXME: This check is wrong; for example it doesn't find 
1123          overflow on 0x123456789 when LONGEST is 32 bits.  */
1124       if (c != 'l' && c != 'u' && n != 0)
1125         {       
1126           if ((unsigned_p && (unsigned LONGEST) prevn >= (unsigned LONGEST) n))
1127             error ("Numeric constant too large.");
1128         }
1129       prevn = n;
1130     }
1131
1132   /* An integer constant is an int, a long, or a long long.  An L
1133      suffix forces it to be long; an LL suffix forces it to be long
1134      long.  If not forced to a larger size, it gets the first type of
1135      the above that it fits in.  To figure out whether it fits, we
1136      shift it right and see whether anything remains.  Note that we
1137      can't shift sizeof (LONGEST) * HOST_CHAR_BIT bits or more in one
1138      operation, because many compilers will warn about such a shift
1139      (which always produces a zero result).  Sometimes TARGET_INT_BIT
1140      or TARGET_LONG_BIT will be that big, sometimes not.  To deal with
1141      the case where it is we just always shift the value more than
1142      once, with fewer bits each time.  */
1143
1144   un = (unsigned LONGEST)n >> 2;
1145   if (long_p == 0
1146       && (un >> (TARGET_INT_BIT - 2)) == 0)
1147     {
1148       high_bit = ((unsigned LONGEST)1) << (TARGET_INT_BIT-1);
1149
1150       /* A large decimal (not hex or octal) constant (between INT_MAX
1151          and UINT_MAX) is a long or unsigned long, according to ANSI,
1152          never an unsigned int, but this code treats it as unsigned
1153          int.  This probably should be fixed.  GCC gives a warning on
1154          such constants.  */
1155
1156       unsigned_type = builtin_type_unsigned_int;
1157       signed_type = builtin_type_int;
1158     }
1159   else if (long_p <= 1
1160            && (un >> (TARGET_LONG_BIT - 2)) == 0)
1161     {
1162       high_bit = ((unsigned LONGEST)1) << (TARGET_LONG_BIT-1);
1163       unsigned_type = builtin_type_unsigned_long;
1164       signed_type = builtin_type_long;
1165     }
1166   else
1167     {
1168       high_bit = (((unsigned LONGEST)1)
1169                   << (TARGET_LONG_LONG_BIT - 32 - 1)
1170                   << 16
1171                   << 16);
1172       if (high_bit == 0)
1173         /* A long long does not fit in a LONGEST.  */
1174         high_bit =
1175           (unsigned LONGEST)1 << (sizeof (LONGEST) * HOST_CHAR_BIT - 1);
1176       unsigned_type = builtin_type_unsigned_long_long;
1177       signed_type = builtin_type_long_long;
1178     }
1179
1180    putithere->typed_val_int.val = n;
1181
1182    /* If the high bit of the worked out type is set then this number
1183       has to be unsigned.  */
1184
1185    if (unsigned_p || (n & high_bit)) 
1186      {
1187        putithere->typed_val_int.type = unsigned_type;
1188      }
1189    else 
1190      {
1191        putithere->typed_val_int.type = signed_type;
1192      }
1193
1194    return INT;
1195 }
1196
1197 struct token
1198 {
1199   char *operator;
1200   int token;
1201   enum exp_opcode opcode;
1202 };
1203
1204 static const struct token tokentab3[] =
1205   {
1206     {">>=", ASSIGN_MODIFY, BINOP_RSH},
1207     {"<<=", ASSIGN_MODIFY, BINOP_LSH}
1208   };
1209
1210 static const struct token tokentab2[] =
1211   {
1212     {"+=", ASSIGN_MODIFY, BINOP_ADD},
1213     {"-=", ASSIGN_MODIFY, BINOP_SUB},
1214     {"*=", ASSIGN_MODIFY, BINOP_MUL},
1215     {"/=", ASSIGN_MODIFY, BINOP_DIV},
1216     {"%=", ASSIGN_MODIFY, BINOP_REM},
1217     {"|=", ASSIGN_MODIFY, BINOP_BITWISE_IOR},
1218     {"&=", ASSIGN_MODIFY, BINOP_BITWISE_AND},
1219     {"^=", ASSIGN_MODIFY, BINOP_BITWISE_XOR},
1220     {"++", INCREMENT, BINOP_END},
1221     {"--", DECREMENT, BINOP_END},
1222     {"->", ARROW, BINOP_END},
1223     {"&&", ANDAND, BINOP_END},
1224     {"||", OROR, BINOP_END},
1225     {"::", COLONCOLON, BINOP_END},
1226     {"<<", LSH, BINOP_END},
1227     {">>", RSH, BINOP_END},
1228     {"==", EQUAL, BINOP_END},
1229     {"!=", NOTEQUAL, BINOP_END},
1230     {"<=", LEQ, BINOP_END},
1231     {">=", GEQ, BINOP_END}
1232   };
1233
1234 /* Read one token, getting characters through lexptr.  */
1235
1236 static int
1237 yylex ()
1238 {
1239   int c, tokchr;
1240   int namelen;
1241   unsigned int i;
1242   char *tokstart;
1243   char *tokptr;
1244   int tempbufindex;
1245   static char *tempbuf;
1246   static int tempbufsize;
1247   
1248  retry:
1249
1250   tokstart = lexptr;
1251   /* See if it is a special token of length 3.  */
1252   for (i = 0; i < sizeof tokentab3 / sizeof tokentab3[0]; i++)
1253     if (DEPRECATED_STREQN (tokstart, tokentab3[i].operator, 3))
1254       {
1255         lexptr += 3;
1256         yylval.opcode = tokentab3[i].opcode;
1257         return tokentab3[i].token;
1258       }
1259
1260   /* See if it is a special token of length 2.  */
1261   for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++)
1262     if (DEPRECATED_STREQN (tokstart, tokentab2[i].operator, 2))
1263       {
1264         lexptr += 2;
1265         yylval.opcode = tokentab2[i].opcode;
1266         return tokentab2[i].token;
1267       }
1268
1269   c = 0;
1270   switch (tokchr = *tokstart)
1271     {
1272     case 0:
1273       return 0;
1274
1275     case ' ':
1276     case '\t':
1277     case '\n':
1278       lexptr++;
1279       goto retry;
1280
1281     case '\'':
1282       /* We either have a character constant ('0' or '\177' for
1283          example) or we have a quoted symbol reference ('foo(int,int)'
1284          in C++ for example).  */
1285       lexptr++;
1286       c = *lexptr++;
1287       if (c == '\\')
1288         c = parse_escape (&lexptr);
1289       else if (c == '\'')
1290         error ("Empty character constant.");
1291
1292       yylval.typed_val_int.val = c;
1293       yylval.typed_val_int.type = builtin_type_char;
1294
1295       c = *lexptr++;
1296       if (c != '\'')
1297         {
1298           namelen = skip_quoted (tokstart) - tokstart;
1299           if (namelen > 2)
1300             {
1301               lexptr = tokstart + namelen;
1302               if (lexptr[-1] != '\'')
1303                 error ("Unmatched single quote.");
1304               namelen -= 2;
1305               tokstart++;
1306               goto tryname;
1307             }
1308           error ("Invalid character constant.");
1309         }
1310       return INT;
1311
1312     case '(':
1313       paren_depth++;
1314       lexptr++;
1315       return '(';
1316
1317     case ')':
1318       if (paren_depth == 0)
1319         return 0;
1320       paren_depth--;
1321       lexptr++;
1322       return ')';
1323
1324     case ',':
1325       if (comma_terminates && paren_depth == 0)
1326         return 0;
1327       lexptr++;
1328       return ',';
1329
1330     case '.':
1331       /* Might be a floating point number.  */
1332       if (lexptr[1] < '0' || lexptr[1] > '9')
1333         goto symbol;            /* Nope, must be a symbol.  */
1334       /* FALL THRU into number case.  */
1335
1336     case '0':
1337     case '1':
1338     case '2':
1339     case '3':
1340     case '4':
1341     case '5':
1342     case '6':
1343     case '7':
1344     case '8':
1345     case '9':
1346       {
1347         /* It's a number.  */
1348         int got_dot = 0, got_e = 0, toktype = FLOAT;
1349         /* Initialize toktype to anything other than ERROR.  */
1350         char *p = tokstart;
1351         int hex = input_radix > 10;
1352         int local_radix = input_radix;
1353         if (tokchr == '0' && (p[1] == 'x' || p[1] == 'X'))
1354           {
1355             p += 2;
1356             hex = 1;
1357             local_radix = 16;
1358           }
1359         else if (tokchr == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D'))
1360           {
1361             p += 2;
1362             hex = 0;
1363             local_radix = 10;
1364           }
1365
1366         for (;; ++p)
1367           {
1368             /* This test includes !hex because 'e' is a valid hex digit
1369                and thus does not indicate a floating point number when
1370                the radix is hex.  */
1371
1372             if (!hex && (*p == 'e' || *p == 'E'))
1373               if (got_e)
1374                 toktype = ERROR;        /* Only one 'e' in a float.  */
1375               else
1376                 got_e = 1;
1377             /* This test does not include !hex, because a '.' always
1378                indicates a decimal floating point number regardless of
1379                the radix.  */
1380             else if (*p == '.')
1381               if (got_dot)
1382                 toktype = ERROR;        /* Only one '.' in a float.  */
1383               else
1384                 got_dot = 1;
1385             else if (got_e && (p[-1] == 'e' || p[-1] == 'E') &&
1386                     (*p == '-' || *p == '+'))
1387               /* This is the sign of the exponent, not the end of the
1388                  number.  */
1389               continue;
1390             /* Always take decimal digits; parse_number handles radix
1391                error.  */
1392             else if (*p >= '0' && *p <= '9')
1393               continue;
1394             /* We will take letters only if hex is true, and only up
1395                to what the input radix would permit.  FSF was content
1396                to rely on parse_number to validate; but it leaks.  */
1397             else if (*p >= 'a' && *p <= 'z') 
1398               {
1399                 if (!hex || *p >= ('a' + local_radix - 10))
1400                   toktype = ERROR;
1401               }
1402             else if (*p >= 'A' && *p <= 'Z') 
1403               {
1404                 if (!hex || *p >= ('A' + local_radix - 10))
1405                   toktype = ERROR;
1406               }
1407             else break;
1408           }
1409         if (toktype != ERROR)
1410           toktype = parse_number (tokstart, p - tokstart, 
1411                                   got_dot | got_e, &yylval);
1412         if (toktype == ERROR)
1413           {
1414             char *err_copy = (char *) alloca (p - tokstart + 1);
1415
1416             memcpy (err_copy, tokstart, p - tokstart);
1417             err_copy[p - tokstart] = 0;
1418             error ("Invalid number \"%s\".", err_copy);
1419           }
1420         lexptr = p;
1421         return toktype;
1422       }
1423
1424     case '+':
1425     case '-':
1426     case '*':
1427     case '/':
1428     case '%':
1429     case '|':
1430     case '&':
1431     case '^':
1432     case '~':
1433     case '!':
1434 #if 0
1435     case '@':           /* Moved out below.  */
1436 #endif
1437     case '<':
1438     case '>':
1439     case '[':
1440     case ']':
1441     case '?':
1442     case ':':
1443     case '=':
1444     case '{':
1445     case '}':
1446     symbol:
1447       lexptr++;
1448       return tokchr;
1449
1450     case '@':
1451       if (strncmp(tokstart, "@selector", 9) == 0)
1452         {
1453           tokptr = strchr(tokstart, '(');
1454           if (tokptr == NULL)
1455             {
1456               error ("Missing '(' in @selector(...)");
1457             }
1458           tempbufindex = 0;
1459           tokptr++;     /* Skip the '('.  */
1460           do {
1461             /* Grow the static temp buffer if necessary, including
1462                allocating the first one on demand.  */
1463             if (tempbufindex + 1 >= tempbufsize)
1464               {
1465                 tempbuf = (char *) realloc (tempbuf, tempbufsize += 64);
1466               }
1467             tempbuf[tempbufindex++] = *tokptr++;
1468           } while ((*tokptr != ')') && (*tokptr != '\0'));
1469           if (*tokptr++ != ')')
1470             {
1471               error ("Missing ')' in @selector(...)");
1472             }
1473           tempbuf[tempbufindex] = '\0';
1474           yylval.sval.ptr = tempbuf;
1475           yylval.sval.length = tempbufindex;
1476           lexptr = tokptr;
1477           return SELECTOR;
1478         }
1479       if (tokstart[1] != '"')
1480         {
1481           lexptr++;
1482           return tokchr;
1483         }
1484       /* ObjC NextStep NSString constant: fall thru and parse like
1485          STRING.  */
1486       tokstart++;
1487
1488     case '"':
1489
1490       /* Build the gdb internal form of the input string in tempbuf,
1491          translating any standard C escape forms seen.  Note that the
1492          buffer is null byte terminated *only* for the convenience of
1493          debugging gdb itself and printing the buffer contents when
1494          the buffer contains no embedded nulls.  Gdb does not depend
1495          upon the buffer being null byte terminated, it uses the
1496          length string instead.  This allows gdb to handle C strings
1497          (as well as strings in other languages) with embedded null
1498          bytes.  */
1499
1500       tokptr = ++tokstart;
1501       tempbufindex = 0;
1502
1503       do {
1504         /* Grow the static temp buffer if necessary, including
1505            allocating the first one on demand.  */
1506         if (tempbufindex + 1 >= tempbufsize)
1507           {
1508             tempbuf = (char *) realloc (tempbuf, tempbufsize += 64);
1509           }
1510         switch (*tokptr)
1511           {
1512           case '\0':
1513           case '"':
1514             /* Do nothing, loop will terminate.  */
1515             break;
1516           case '\\':
1517             tokptr++;
1518             c = parse_escape (&tokptr);
1519             if (c == -1)
1520               {
1521                 continue;
1522               }
1523             tempbuf[tempbufindex++] = c;
1524             break;
1525           default:
1526             tempbuf[tempbufindex++] = *tokptr++;
1527             break;
1528           }
1529       } while ((*tokptr != '"') && (*tokptr != '\0'));
1530       if (*tokptr++ != '"')
1531         {
1532           error ("Unterminated string in expression.");
1533         }
1534       tempbuf[tempbufindex] = '\0';     /* See note above.  */
1535       yylval.sval.ptr = tempbuf;
1536       yylval.sval.length = tempbufindex;
1537       lexptr = tokptr;
1538       return (tokchr == '@' ? NSSTRING : STRING);
1539     }
1540
1541   if (!(tokchr == '_' || tokchr == '$' || 
1542        (tokchr >= 'a' && tokchr <= 'z') || (tokchr >= 'A' && tokchr <= 'Z')))
1543     /* We must have come across a bad character (e.g. ';').  */
1544     error ("Invalid character '%c' in expression.", c);
1545
1546   /* It's a name.  See how long it is.  */
1547   namelen = 0;
1548   for (c = tokstart[namelen];
1549        (c == '_' || c == '$' || (c >= '0' && c <= '9')
1550         || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '<');)
1551     {
1552        if (c == '<')
1553          {
1554            int i = namelen;
1555            while (tokstart[++i] && tokstart[i] != '>');
1556            if (tokstart[i] == '>')
1557              namelen = i;
1558           }
1559        c = tokstart[++namelen];
1560      }
1561
1562   /* The token "if" terminates the expression and is NOT 
1563      removed from the input stream.  */
1564   if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f')
1565     {
1566       return 0;
1567     }
1568
1569   lexptr += namelen;
1570
1571   tryname:
1572
1573   /* Catch specific keywords.  Should be done with a data structure.  */
1574   switch (namelen)
1575     {
1576     case 8:
1577       if (DEPRECATED_STREQN (tokstart, "unsigned", 8))
1578         return UNSIGNED;
1579       if (current_language->la_language == language_cplus
1580           && strncmp (tokstart, "template", 8) == 0)
1581         return TEMPLATE;
1582       if (DEPRECATED_STREQN (tokstart, "volatile", 8))
1583         return VOLATILE_KEYWORD;
1584       break;
1585     case 6:
1586       if (DEPRECATED_STREQN (tokstart, "struct", 6))
1587         return STRUCT;
1588       if (DEPRECATED_STREQN (tokstart, "signed", 6))
1589         return SIGNED_KEYWORD;
1590       if (DEPRECATED_STREQN (tokstart, "sizeof", 6))      
1591         return SIZEOF;
1592       if (DEPRECATED_STREQN (tokstart, "double", 6))      
1593         return DOUBLE_KEYWORD;
1594       break;
1595     case 5:
1596       if ((current_language->la_language == language_cplus)
1597           && strncmp (tokstart, "class", 5) == 0)
1598         return CLASS;
1599       if (DEPRECATED_STREQN (tokstart, "union", 5))
1600         return UNION;
1601       if (DEPRECATED_STREQN (tokstart, "short", 5))
1602         return SHORT;
1603       if (DEPRECATED_STREQN (tokstart, "const", 5))
1604         return CONST_KEYWORD;
1605       break;
1606     case 4:
1607       if (DEPRECATED_STREQN (tokstart, "enum", 4))
1608         return ENUM;
1609       if (DEPRECATED_STREQN (tokstart, "long", 4))
1610         return LONG;
1611       break;
1612     case 3:
1613       if (DEPRECATED_STREQN (tokstart, "int", 3))
1614         return INT_KEYWORD;
1615       break;
1616     default:
1617       break;
1618     }
1619
1620   yylval.sval.ptr = tokstart;
1621   yylval.sval.length = namelen;
1622
1623   if (*tokstart == '$')
1624     {
1625       write_dollar_variable (yylval.sval);
1626       return VARIABLE;
1627     }
1628
1629   /* Use token-type BLOCKNAME for symbols that happen to be defined as
1630      functions or symtabs.  If this is not so, then ...
1631      Use token-type TYPENAME for symbols that happen to be defined
1632      currently as names of types; NAME for other symbols.
1633      The caller is not constrained to care about the distinction.  */
1634   {
1635     char *tmp = copy_name (yylval.sval);
1636     struct symbol *sym;
1637     int is_a_field_of_this = 0, *need_this;
1638     int hextype;
1639
1640     if (current_language->la_language == language_cplus ||
1641         current_language->la_language == language_objc)
1642       need_this = &is_a_field_of_this;
1643     else
1644       need_this = (int *) NULL;
1645
1646     sym = lookup_symbol (tmp, expression_context_block,
1647                          VAR_DOMAIN,
1648                          need_this,
1649                          (struct symtab **) NULL);
1650     /* Call lookup_symtab, not lookup_partial_symtab, in case there
1651        are no psymtabs (coff, xcoff, or some future change to blow
1652        away the psymtabs once symbols are read).  */
1653     if ((sym && SYMBOL_CLASS (sym) == LOC_BLOCK) ||
1654         lookup_symtab (tmp))
1655       {
1656         yylval.ssym.sym = sym;
1657         yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1658         return BLOCKNAME;
1659       }
1660     if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
1661         {
1662 #if 1
1663           /* Despite the following flaw, we need to keep this code
1664              enabled.  Because we can get called from
1665              check_stub_method, if we don't handle nested types then
1666              it screws many operations in any program which uses
1667              nested types.  */
1668           /* In "A::x", if x is a member function of A and there
1669              happens to be a type (nested or not, since the stabs
1670              don't make that distinction) named x, then this code
1671              incorrectly thinks we are dealing with nested types
1672              rather than a member function.  */
1673
1674           char *p;
1675           char *namestart;
1676           struct symbol *best_sym;
1677
1678           /* Look ahead to detect nested types.  This probably should
1679              be done in the grammar, but trying seemed to introduce a
1680              lot of shift/reduce and reduce/reduce conflicts.  It's
1681              possible that it could be done, though.  Or perhaps a
1682              non-grammar, but less ad hoc, approach would work well.  */
1683
1684           /* Since we do not currently have any way of distinguishing
1685              a nested type from a non-nested one (the stabs don't tell
1686              us whether a type is nested), we just ignore the
1687              containing type.  */
1688
1689           p = lexptr;
1690           best_sym = sym;
1691           while (1)
1692             {
1693               /* Skip whitespace.  */
1694               while (*p == ' ' || *p == '\t' || *p == '\n')
1695                 ++p;
1696               if (*p == ':' && p[1] == ':')
1697                 {
1698                   /* Skip the `::'.  */
1699                   p += 2;
1700                   /* Skip whitespace.  */
1701                   while (*p == ' ' || *p == '\t' || *p == '\n')
1702                     ++p;
1703                   namestart = p;
1704                   while (*p == '_' || *p == '$' || (*p >= '0' && *p <= '9')
1705                          || (*p >= 'a' && *p <= 'z')
1706                          || (*p >= 'A' && *p <= 'Z'))
1707                     ++p;
1708                   if (p != namestart)
1709                     {
1710                       struct symbol *cur_sym;
1711                       /* As big as the whole rest of the expression,
1712                          which is at least big enough.  */
1713                       char *ncopy = alloca (strlen (tmp) +
1714                                             strlen (namestart) + 3);
1715                       char *tmp1;
1716
1717                       tmp1 = ncopy;
1718                       memcpy (tmp1, tmp, strlen (tmp));
1719                       tmp1 += strlen (tmp);
1720                       memcpy (tmp1, "::", 2);
1721                       tmp1 += 2;
1722                       memcpy (tmp1, namestart, p - namestart);
1723                       tmp1[p - namestart] = '\0';
1724                       cur_sym = lookup_symbol (ncopy, 
1725                                                expression_context_block,
1726                                                VAR_DOMAIN, (int *) NULL,
1727                                                (struct symtab **) NULL);
1728                       if (cur_sym)
1729                         {
1730                           if (SYMBOL_CLASS (cur_sym) == LOC_TYPEDEF)
1731                             {
1732                               best_sym = cur_sym;
1733                               lexptr = p;
1734                             }
1735                           else
1736                             break;
1737                         }
1738                       else
1739                         break;
1740                     }
1741                   else
1742                     break;
1743                 }
1744               else
1745                 break;
1746             }
1747
1748           yylval.tsym.type = SYMBOL_TYPE (best_sym);
1749 #else /* not 0 */
1750           yylval.tsym.type = SYMBOL_TYPE (sym);
1751 #endif /* not 0 */
1752           return TYPENAME;
1753         }
1754     yylval.tsym.type
1755       = language_lookup_primitive_type_by_name (current_language,
1756                                                 current_gdbarch, tmp);
1757     if (yylval.tsym.type != NULL)
1758       return TYPENAME;
1759
1760     /* See if it's an ObjC classname.  */
1761     if (!sym)
1762       {
1763         CORE_ADDR Class = lookup_objc_class(tmp);
1764         if (Class)
1765           {
1766             yylval.class.class = Class;
1767             if ((sym = lookup_struct_typedef (tmp, 
1768                                               expression_context_block, 
1769                                               1)))
1770               yylval.class.type = SYMBOL_TYPE (sym);
1771             return CLASSNAME;
1772           }
1773       }
1774
1775     /* Input names that aren't symbols but ARE valid hex numbers,
1776        when the input radix permits them, can be names or numbers
1777        depending on the parse.  Note we support radixes > 16 here.  */
1778     if (!sym && 
1779         ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10) ||
1780          (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
1781       {
1782         YYSTYPE newlval;        /* Its value is ignored.  */
1783         hextype = parse_number (tokstart, namelen, 0, &newlval);
1784         if (hextype == INT)
1785           {
1786             yylval.ssym.sym = sym;
1787             yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1788             return NAME_OR_INT;
1789           }
1790       }
1791
1792     /* Any other kind of symbol.  */
1793     yylval.ssym.sym = sym;
1794     yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1795     return NAME;
1796   }
1797 }
1798
1799 void
1800 yyerror (msg)
1801      char *msg;
1802 {
1803   if (*lexptr == '\0')
1804     error("A %s near end of expression.",  (msg ? msg : "error"));
1805   else
1806     error ("A %s in expression, near `%s'.", (msg ? msg : "error"), 
1807            lexptr);
1808 }