OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-6.8/] [gdb/] [objc-exp.y] - Blame information for rev 24

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 24 jeremybenn
/* YACC parser for C expressions, for GDB.
2
 
3
   Copyright (C) 1986, 1989, 1990, 1991, 1993, 1994, 2002, 2006, 2007, 2008
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 ( and  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 
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 (void);
112
 
113
static int
114
yylex (void);
115
 
116
void
117
yyerror (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 (char *, int, int, YYSTYPE *);
155
%}
156
 
157
%type  exp exp1 type_exp start variable qualified_name lcurly
158
%type  rcurly
159
%type  type typebase
160
%type  nonempty_typelist
161
/* %type  block */
162
 
163
/* Fancy type parsing.  */
164
%type  func_mod direct_abs_decl abs_decl
165
%type  ptype
166
%type  array_mod
167
 
168
%token  INT
169
%token  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  STRING
179
%token  NSSTRING                /* ObjC Foundation "NSString" literal */
180
%token  SELECTOR                /* ObjC "@selector" pseudo-operator   */
181
%token  NAME /* BLOCKNAME defined below to give it higher precedence. */
182
%token  TYPENAME
183
%token  CLASSNAME       /* ObjC Class name */
184
%type  name
185
%type  name_not_typename
186
%type  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  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  VARIABLE
204
 
205
%token  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  BLOCKNAME
225
%type  block
226
%left COLONCOLON
227
 
228
 
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 (strcmp (type_name_no_tag (type), $4.ptr) != 0)
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
        ;
862
 
863
typebase  /* Implements (approximately): (type-qualifier)* type-specifier.  */
864
        :       TYPENAME
865
                        { $$ = $1.type; }
866
        |       CLASSNAME
867
                        {
868
                          if ($1.type == NULL)
869
                            error ("No symbol \"%s\" in current context.",
870
                                   copy_name($1.stoken));
871
                          else
872
                            $$ = $1.type;
873
                        }
874
        |       INT_KEYWORD
875
                        { $$ = builtin_type_int; }
876
        |       LONG
877
                        { $$ = builtin_type_long; }
878
        |       SHORT
879
                        { $$ = builtin_type_short; }
880
        |       LONG INT_KEYWORD
881
                        { $$ = builtin_type_long; }
882
        |       UNSIGNED LONG INT_KEYWORD
883
                        { $$ = builtin_type_unsigned_long; }
884
        |       LONG LONG
885
                        { $$ = builtin_type_long_long; }
886
        |       LONG LONG INT_KEYWORD
887
                        { $$ = builtin_type_long_long; }
888
        |       UNSIGNED LONG LONG
889
                        { $$ = builtin_type_unsigned_long_long; }
890
        |       UNSIGNED LONG LONG INT_KEYWORD
891
                        { $$ = builtin_type_unsigned_long_long; }
892
        |       SHORT INT_KEYWORD
893
                        { $$ = builtin_type_short; }
894
        |       UNSIGNED SHORT INT_KEYWORD
895
                        { $$ = builtin_type_unsigned_short; }
896
        |       DOUBLE_KEYWORD
897
                        { $$ = builtin_type_double; }
898
        |       LONG DOUBLE_KEYWORD
899
                        { $$ = builtin_type_long_double; }
900
        |       STRUCT name
901
                        { $$ = lookup_struct (copy_name ($2),
902
                                              expression_context_block); }
903
        |       CLASS name
904
                        { $$ = lookup_struct (copy_name ($2),
905
                                              expression_context_block); }
906
        |       UNION name
907
                        { $$ = lookup_union (copy_name ($2),
908
                                             expression_context_block); }
909
        |       ENUM name
910
                        { $$ = lookup_enum (copy_name ($2),
911
                                            expression_context_block); }
912
        |       UNSIGNED typename
913
                        { $$ = lookup_unsigned_typename (TYPE_NAME($2.type)); }
914
        |       UNSIGNED
915
                        { $$ = builtin_type_unsigned_int; }
916
        |       SIGNED_KEYWORD typename
917
                        { $$ = lookup_signed_typename (TYPE_NAME($2.type)); }
918
        |       SIGNED_KEYWORD
919
                        { $$ = builtin_type_int; }
920
        |       TEMPLATE name '<' type '>'
921
                        { $$ = lookup_template_type(copy_name($2), $4,
922
                                                    expression_context_block);
923
                        }
924
        /* "const" and "volatile" are curently ignored.  A type
925
           qualifier after the type is handled in the ptype rule.  I
926
           think these could be too.  */
927
        |       CONST_KEYWORD typebase { $$ = $2; }
928
        |       VOLATILE_KEYWORD typebase { $$ = $2; }
929
        ;
930
 
931
typename:       TYPENAME
932
        |       INT_KEYWORD
933
                {
934
                  $$.stoken.ptr = "int";
935
                  $$.stoken.length = 3;
936
                  $$.type = builtin_type_int;
937
                }
938
        |       LONG
939
                {
940
                  $$.stoken.ptr = "long";
941
                  $$.stoken.length = 4;
942
                  $$.type = builtin_type_long;
943
                }
944
        |       SHORT
945
                {
946
                  $$.stoken.ptr = "short";
947
                  $$.stoken.length = 5;
948
                  $$.type = builtin_type_short;
949
                }
950
        ;
951
 
952
nonempty_typelist
953
        :       type
954
                { $$ = (struct type **) malloc (sizeof (struct type *) * 2);
955
                  $$[0] = 1;    /* Number of types in vector.  */
956
                  $$[1] = $1;
957
                }
958
        |       nonempty_typelist ',' type
959
                { int len = sizeof (struct type *) * (++($1[0]) + 1);
960
                  $$ = (struct type **) realloc ((char *) $1, len);
961
                  $$[$$[0]] = $3;
962
                }
963
        ;
964
 
965
name    :       NAME        { $$ = $1.stoken; }
966
        |       BLOCKNAME   { $$ = $1.stoken; }
967
        |       TYPENAME    { $$ = $1.stoken; }
968
        |       CLASSNAME   { $$ = $1.stoken; }
969
        |       NAME_OR_INT { $$ = $1.stoken; }
970
        ;
971
 
972
name_not_typename :     NAME
973
        |       BLOCKNAME
974
/* These would be useful if name_not_typename was useful, but it is
975
   just a fake for "variable", so these cause reduce/reduce conflicts
976
   because the parser can't tell whether NAME_OR_INT is a
977
   name_not_typename (=variable, =exp) or just an exp.  If
978
   name_not_typename was ever used in an lvalue context where only a
979
   name could occur, this might be useful.  */
980
/*      | NAME_OR_INT */
981
        ;
982
 
983
%%
984
 
985
/* Take care of parsing a number (anything that starts with a digit).
986
   Set yylval and return the token type; update lexptr.  LEN is the
987
   number of characters in it.  */
988
 
989
/*** Needs some error checking for the float case.  ***/
990
 
991
static int
992
parse_number (p, len, parsed_float, putithere)
993
     char *p;
994
     int len;
995
     int parsed_float;
996
     YYSTYPE *putithere;
997
{
998
  /* FIXME: Shouldn't these be unsigned?  We don't deal with negative
999
     values here, and we do kind of silly things like cast to
1000
     unsigned.  */
1001
  LONGEST n = 0;
1002
  LONGEST prevn = 0;
1003
  unsigned LONGEST un;
1004
 
1005
  int i = 0;
1006
  int c;
1007
  int base = input_radix;
1008
  int unsigned_p = 0;
1009
 
1010
  /* Number of "L" suffixes encountered.  */
1011
  int long_p = 0;
1012
 
1013
  /* We have found a "L" or "U" suffix.  */
1014
  int found_suffix = 0;
1015
 
1016
  unsigned LONGEST high_bit;
1017
  struct type *signed_type;
1018
  struct type *unsigned_type;
1019
 
1020
  if (parsed_float)
1021
    {
1022
      char c;
1023
 
1024
      /* It's a float since it contains a point or an exponent.  */
1025
 
1026
      sscanf (p, "%" DOUBLEST_SCAN_FORMAT "%c",
1027
              &putithere->typed_val_float.dval, &c);
1028
 
1029
      /* See if it has `f' or `l' suffix (float or long double).  */
1030
 
1031
      c = tolower (p[len - 1]);
1032
 
1033
      if (c == 'f')
1034
        putithere->typed_val_float.type = builtin_type_float;
1035
      else if (c == 'l')
1036
        putithere->typed_val_float.type = builtin_type_long_double;
1037
      else if (isdigit (c) || c == '.')
1038
        putithere->typed_val_float.type = builtin_type_double;
1039
      else
1040
        return ERROR;
1041
 
1042
      return FLOAT;
1043
    }
1044
 
1045
  /* Handle base-switching prefixes 0x, 0t, 0d, and 0.  */
1046
  if (p[0] == '0')
1047
    switch (p[1])
1048
      {
1049
      case 'x':
1050
      case 'X':
1051
        if (len >= 3)
1052
          {
1053
            p += 2;
1054
            base = 16;
1055
            len -= 2;
1056
          }
1057
        break;
1058
 
1059
      case 't':
1060
      case 'T':
1061
      case 'd':
1062
      case 'D':
1063
        if (len >= 3)
1064
          {
1065
            p += 2;
1066
            base = 10;
1067
            len -= 2;
1068
          }
1069
        break;
1070
 
1071
      default:
1072
        base = 8;
1073
        break;
1074
      }
1075
 
1076
  while (len-- > 0)
1077
    {
1078
      c = *p++;
1079
      if (c >= 'A' && c <= 'Z')
1080
        c += 'a' - 'A';
1081
      if (c != 'l' && c != 'u')
1082
        n *= base;
1083
      if (c >= '0' && c <= '9')
1084
        {
1085
          if (found_suffix)
1086
            return ERROR;
1087
          n += i = c - '0';
1088
        }
1089
      else
1090
        {
1091
          if (base > 10 && c >= 'a' && c <= 'f')
1092
            {
1093
              if (found_suffix)
1094
                return ERROR;
1095
              n += i = c - 'a' + 10;
1096
            }
1097
          else if (c == 'l')
1098
            {
1099
              ++long_p;
1100
              found_suffix = 1;
1101
            }
1102
          else if (c == 'u')
1103
            {
1104
              unsigned_p = 1;
1105
              found_suffix = 1;
1106
            }
1107
          else
1108
            return ERROR;       /* Char not a digit.  */
1109
        }
1110
      if (i >= base)
1111
        return ERROR;           /* Invalid digit in this base.  */
1112
 
1113
      /* Portably test for overflow (only works for nonzero values, so
1114
         make a second check for zero).  FIXME: Can't we just make n
1115
         and prevn unsigned and avoid this?  */
1116
      if (c != 'l' && c != 'u' && (prevn >= n) && n != 0)
1117
        unsigned_p = 1;         /* Try something unsigned.  */
1118
 
1119
      /* Portably test for unsigned overflow.
1120
         FIXME: This check is wrong; for example it doesn't find
1121
         overflow on 0x123456789 when LONGEST is 32 bits.  */
1122
      if (c != 'l' && c != 'u' && n != 0)
1123
        {
1124
          if ((unsigned_p && (unsigned LONGEST) prevn >= (unsigned LONGEST) n))
1125
            error ("Numeric constant too large.");
1126
        }
1127
      prevn = n;
1128
    }
1129
 
1130
  /* An integer constant is an int, a long, or a long long.  An L
1131
     suffix forces it to be long; an LL suffix forces it to be long
1132
     long.  If not forced to a larger size, it gets the first type of
1133
     the above that it fits in.  To figure out whether it fits, we
1134
     shift it right and see whether anything remains.  Note that we
1135
     can't shift sizeof (LONGEST) * HOST_CHAR_BIT bits or more in one
1136
     operation, because many compilers will warn about such a shift
1137
     (which always produces a zero result).  Sometimes gdbarch_int_bit
1138
     or gdbarch_long_int will be that big, sometimes not.  To deal with
1139
     the case where it is we just always shift the value more than
1140
     once, with fewer bits each time.  */
1141
 
1142
  un = (unsigned LONGEST)n >> 2;
1143
  if (long_p == 0
1144
      && (un >> (gdbarch_int_bit (current_gdbarch) - 2)) == 0)
1145
    {
1146
      high_bit = ((unsigned LONGEST)1) << (gdbarch_int_bit (current_gdbarch) - 1);
1147
 
1148
      /* A large decimal (not hex or octal) constant (between INT_MAX
1149
         and UINT_MAX) is a long or unsigned long, according to ANSI,
1150
         never an unsigned int, but this code treats it as unsigned
1151
         int.  This probably should be fixed.  GCC gives a warning on
1152
         such constants.  */
1153
 
1154
      unsigned_type = builtin_type_unsigned_int;
1155
      signed_type = builtin_type_int;
1156
    }
1157
  else if (long_p <= 1
1158
           && (un >> (gdbarch_long_bit (current_gdbarch) - 2)) == 0)
1159
    {
1160
      high_bit = ((unsigned LONGEST)1) << (gdbarch_long_bit (current_gdbarch) - 1);
1161
      unsigned_type = builtin_type_unsigned_long;
1162
      signed_type = builtin_type_long;
1163
    }
1164
  else
1165
    {
1166
      high_bit = (((unsigned LONGEST)1)
1167
                  << (gdbarch_long_long_bit (current_gdbarch) - 32 - 1)
1168
                  << 16
1169
                  << 16);
1170
      if (high_bit == 0)
1171
        /* A long long does not fit in a LONGEST.  */
1172
        high_bit =
1173
          (unsigned LONGEST)1 << (sizeof (LONGEST) * HOST_CHAR_BIT - 1);
1174
      unsigned_type = builtin_type_unsigned_long_long;
1175
      signed_type = builtin_type_long_long;
1176
    }
1177
 
1178
   putithere->typed_val_int.val = n;
1179
 
1180
   /* If the high bit of the worked out type is set then this number
1181
      has to be unsigned.  */
1182
 
1183
   if (unsigned_p || (n & high_bit))
1184
     {
1185
       putithere->typed_val_int.type = unsigned_type;
1186
     }
1187
   else
1188
     {
1189
       putithere->typed_val_int.type = signed_type;
1190
     }
1191
 
1192
   return INT;
1193
}
1194
 
1195
struct token
1196
{
1197
  char *operator;
1198
  int token;
1199
  enum exp_opcode opcode;
1200
};
1201
 
1202
static const struct token tokentab3[] =
1203
  {
1204
    {">>=", ASSIGN_MODIFY, BINOP_RSH},
1205
    {"<<=", ASSIGN_MODIFY, BINOP_LSH}
1206
  };
1207
 
1208
static const struct token tokentab2[] =
1209
  {
1210
    {"+=", ASSIGN_MODIFY, BINOP_ADD},
1211
    {"-=", ASSIGN_MODIFY, BINOP_SUB},
1212
    {"*=", ASSIGN_MODIFY, BINOP_MUL},
1213
    {"/=", ASSIGN_MODIFY, BINOP_DIV},
1214
    {"%=", ASSIGN_MODIFY, BINOP_REM},
1215
    {"|=", ASSIGN_MODIFY, BINOP_BITWISE_IOR},
1216
    {"&=", ASSIGN_MODIFY, BINOP_BITWISE_AND},
1217
    {"^=", ASSIGN_MODIFY, BINOP_BITWISE_XOR},
1218
    {"++", INCREMENT, BINOP_END},
1219
    {"--", DECREMENT, BINOP_END},
1220
    {"->", ARROW, BINOP_END},
1221
    {"&&", ANDAND, BINOP_END},
1222
    {"||", OROR, BINOP_END},
1223
    {"::", COLONCOLON, BINOP_END},
1224
    {"<<", LSH, BINOP_END},
1225
    {">>", RSH, BINOP_END},
1226
    {"==", EQUAL, BINOP_END},
1227
    {"!=", NOTEQUAL, BINOP_END},
1228
    {"<=", LEQ, BINOP_END},
1229
    {">=", GEQ, BINOP_END}
1230
  };
1231
 
1232
/* Read one token, getting characters through lexptr.  */
1233
 
1234
static int
1235
yylex ()
1236
{
1237
  int c, tokchr;
1238
  int namelen;
1239
  unsigned int i;
1240
  char *tokstart;
1241
  char *tokptr;
1242
  int tempbufindex;
1243
  static char *tempbuf;
1244
  static int tempbufsize;
1245
 
1246
 retry:
1247
 
1248
  tokstart = lexptr;
1249
  /* See if it is a special token of length 3.  */
1250
  for (i = 0; i < sizeof tokentab3 / sizeof tokentab3[0]; i++)
1251
    if (strncmp (tokstart, tokentab3[i].operator, 3) == 0)
1252
      {
1253
        lexptr += 3;
1254
        yylval.opcode = tokentab3[i].opcode;
1255
        return tokentab3[i].token;
1256
      }
1257
 
1258
  /* See if it is a special token of length 2.  */
1259
  for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++)
1260
    if (strncmp (tokstart, tokentab2[i].operator, 2) == 0)
1261
      {
1262
        lexptr += 2;
1263
        yylval.opcode = tokentab2[i].opcode;
1264
        return tokentab2[i].token;
1265
      }
1266
 
1267
  c = 0;
1268
  switch (tokchr = *tokstart)
1269
    {
1270
    case 0:
1271
      return 0;
1272
 
1273
    case ' ':
1274
    case '\t':
1275
    case '\n':
1276
      lexptr++;
1277
      goto retry;
1278
 
1279
    case '\'':
1280
      /* We either have a character constant ('0' or '\177' for
1281
         example) or we have a quoted symbol reference ('foo(int,int)'
1282
         in C++ for example).  */
1283
      lexptr++;
1284
      c = *lexptr++;
1285
      if (c == '\\')
1286
        c = parse_escape (&lexptr);
1287
      else if (c == '\'')
1288
        error ("Empty character constant.");
1289
 
1290
      yylval.typed_val_int.val = c;
1291
      yylval.typed_val_int.type = builtin_type_char;
1292
 
1293
      c = *lexptr++;
1294
      if (c != '\'')
1295
        {
1296
          namelen = skip_quoted (tokstart) - tokstart;
1297
          if (namelen > 2)
1298
            {
1299
              lexptr = tokstart + namelen;
1300
              if (lexptr[-1] != '\'')
1301
                error ("Unmatched single quote.");
1302
              namelen -= 2;
1303
              tokstart++;
1304
              goto tryname;
1305
            }
1306
          error ("Invalid character constant.");
1307
        }
1308
      return INT;
1309
 
1310
    case '(':
1311
      paren_depth++;
1312
      lexptr++;
1313
      return '(';
1314
 
1315
    case ')':
1316
      if (paren_depth == 0)
1317
        return 0;
1318
      paren_depth--;
1319
      lexptr++;
1320
      return ')';
1321
 
1322
    case ',':
1323
      if (comma_terminates && paren_depth == 0)
1324
        return 0;
1325
      lexptr++;
1326
      return ',';
1327
 
1328
    case '.':
1329
      /* Might be a floating point number.  */
1330
      if (lexptr[1] < '0' || lexptr[1] > '9')
1331
        goto symbol;            /* Nope, must be a symbol.  */
1332
      /* FALL THRU into number case.  */
1333
 
1334
    case '0':
1335
    case '1':
1336
    case '2':
1337
    case '3':
1338
    case '4':
1339
    case '5':
1340
    case '6':
1341
    case '7':
1342
    case '8':
1343
    case '9':
1344
      {
1345
        /* It's a number.  */
1346
        int got_dot = 0, got_e = 0, toktype = FLOAT;
1347
        /* Initialize toktype to anything other than ERROR.  */
1348
        char *p = tokstart;
1349
        int hex = input_radix > 10;
1350
        int local_radix = input_radix;
1351
        if (tokchr == '0' && (p[1] == 'x' || p[1] == 'X'))
1352
          {
1353
            p += 2;
1354
            hex = 1;
1355
            local_radix = 16;
1356
          }
1357
        else if (tokchr == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D'))
1358
          {
1359
            p += 2;
1360
            hex = 0;
1361
            local_radix = 10;
1362
          }
1363
 
1364
        for (;; ++p)
1365
          {
1366
            /* This test includes !hex because 'e' is a valid hex digit
1367
               and thus does not indicate a floating point number when
1368
               the radix is hex.  */
1369
 
1370
            if (!hex && (*p == 'e' || *p == 'E'))
1371
              if (got_e)
1372
                toktype = ERROR;        /* Only one 'e' in a float.  */
1373
              else
1374
                got_e = 1;
1375
            /* This test does not include !hex, because a '.' always
1376
               indicates a decimal floating point number regardless of
1377
               the radix.  */
1378
            else if (*p == '.')
1379
              if (got_dot)
1380
                toktype = ERROR;        /* Only one '.' in a float.  */
1381
              else
1382
                got_dot = 1;
1383
            else if (got_e && (p[-1] == 'e' || p[-1] == 'E') &&
1384
                    (*p == '-' || *p == '+'))
1385
              /* This is the sign of the exponent, not the end of the
1386
                 number.  */
1387
              continue;
1388
            /* Always take decimal digits; parse_number handles radix
1389
               error.  */
1390
            else if (*p >= '0' && *p <= '9')
1391
              continue;
1392
            /* We will take letters only if hex is true, and only up
1393
               to what the input radix would permit.  FSF was content
1394
               to rely on parse_number to validate; but it leaks.  */
1395
            else if (*p >= 'a' && *p <= 'z')
1396
              {
1397
                if (!hex || *p >= ('a' + local_radix - 10))
1398
                  toktype = ERROR;
1399
              }
1400
            else if (*p >= 'A' && *p <= 'Z')
1401
              {
1402
                if (!hex || *p >= ('A' + local_radix - 10))
1403
                  toktype = ERROR;
1404
              }
1405
            else break;
1406
          }
1407
        if (toktype != ERROR)
1408
          toktype = parse_number (tokstart, p - tokstart,
1409
                                  got_dot | got_e, &yylval);
1410
        if (toktype == ERROR)
1411
          {
1412
            char *err_copy = (char *) alloca (p - tokstart + 1);
1413
 
1414
            memcpy (err_copy, tokstart, p - tokstart);
1415
            err_copy[p - tokstart] = 0;
1416
            error ("Invalid number \"%s\".", err_copy);
1417
          }
1418
        lexptr = p;
1419
        return toktype;
1420
      }
1421
 
1422
    case '+':
1423
    case '-':
1424
    case '*':
1425
    case '/':
1426
    case '%':
1427
    case '|':
1428
    case '&':
1429
    case '^':
1430
    case '~':
1431
    case '!':
1432
#if 0
1433
    case '@':           /* Moved out below.  */
1434
#endif
1435
    case '<':
1436
    case '>':
1437
    case '[':
1438
    case ']':
1439
    case '?':
1440
    case ':':
1441
    case '=':
1442
    case '{':
1443
    case '}':
1444
    symbol:
1445
      lexptr++;
1446
      return tokchr;
1447
 
1448
    case '@':
1449
      if (strncmp(tokstart, "@selector", 9) == 0)
1450
        {
1451
          tokptr = strchr(tokstart, '(');
1452
          if (tokptr == NULL)
1453
            {
1454
              error ("Missing '(' in @selector(...)");
1455
            }
1456
          tempbufindex = 0;
1457
          tokptr++;     /* Skip the '('.  */
1458
          do {
1459
            /* Grow the static temp buffer if necessary, including
1460
               allocating the first one on demand.  */
1461
            if (tempbufindex + 1 >= tempbufsize)
1462
              {
1463
                tempbuf = (char *) realloc (tempbuf, tempbufsize += 64);
1464
              }
1465
            tempbuf[tempbufindex++] = *tokptr++;
1466
          } while ((*tokptr != ')') && (*tokptr != '\0'));
1467
          if (*tokptr++ != ')')
1468
            {
1469
              error ("Missing ')' in @selector(...)");
1470
            }
1471
          tempbuf[tempbufindex] = '\0';
1472
          yylval.sval.ptr = tempbuf;
1473
          yylval.sval.length = tempbufindex;
1474
          lexptr = tokptr;
1475
          return SELECTOR;
1476
        }
1477
      if (tokstart[1] != '"')
1478
        {
1479
          lexptr++;
1480
          return tokchr;
1481
        }
1482
      /* ObjC NextStep NSString constant: fall thru and parse like
1483
         STRING.  */
1484
      tokstart++;
1485
 
1486
    case '"':
1487
 
1488
      /* Build the gdb internal form of the input string in tempbuf,
1489
         translating any standard C escape forms seen.  Note that the
1490
         buffer is null byte terminated *only* for the convenience of
1491
         debugging gdb itself and printing the buffer contents when
1492
         the buffer contains no embedded nulls.  Gdb does not depend
1493
         upon the buffer being null byte terminated, it uses the
1494
         length string instead.  This allows gdb to handle C strings
1495
         (as well as strings in other languages) with embedded null
1496
         bytes.  */
1497
 
1498
      tokptr = ++tokstart;
1499
      tempbufindex = 0;
1500
 
1501
      do {
1502
        /* Grow the static temp buffer if necessary, including
1503
           allocating the first one on demand.  */
1504
        if (tempbufindex + 1 >= tempbufsize)
1505
          {
1506
            tempbuf = (char *) realloc (tempbuf, tempbufsize += 64);
1507
          }
1508
        switch (*tokptr)
1509
          {
1510
          case '\0':
1511
          case '"':
1512
            /* Do nothing, loop will terminate.  */
1513
            break;
1514
          case '\\':
1515
            tokptr++;
1516
            c = parse_escape (&tokptr);
1517
            if (c == -1)
1518
              {
1519
                continue;
1520
              }
1521
            tempbuf[tempbufindex++] = c;
1522
            break;
1523
          default:
1524
            tempbuf[tempbufindex++] = *tokptr++;
1525
            break;
1526
          }
1527
      } while ((*tokptr != '"') && (*tokptr != '\0'));
1528
      if (*tokptr++ != '"')
1529
        {
1530
          error ("Unterminated string in expression.");
1531
        }
1532
      tempbuf[tempbufindex] = '\0';     /* See note above.  */
1533
      yylval.sval.ptr = tempbuf;
1534
      yylval.sval.length = tempbufindex;
1535
      lexptr = tokptr;
1536
      return (tokchr == '@' ? NSSTRING : STRING);
1537
    }
1538
 
1539
  if (!(tokchr == '_' || tokchr == '$' ||
1540
       (tokchr >= 'a' && tokchr <= 'z') || (tokchr >= 'A' && tokchr <= 'Z')))
1541
    /* We must have come across a bad character (e.g. ';').  */
1542
    error ("Invalid character '%c' in expression.", c);
1543
 
1544
  /* It's a name.  See how long it is.  */
1545
  namelen = 0;
1546
  for (c = tokstart[namelen];
1547
       (c == '_' || c == '$' || (c >= '0' && c <= '9')
1548
        || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '<');)
1549
    {
1550
       if (c == '<')
1551
         {
1552
           int i = namelen;
1553
           while (tokstart[++i] && tokstart[i] != '>');
1554
           if (tokstart[i] == '>')
1555
             namelen = i;
1556
          }
1557
       c = tokstart[++namelen];
1558
     }
1559
 
1560
  /* The token "if" terminates the expression and is NOT
1561
     removed from the input stream.  */
1562
  if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f')
1563
    {
1564
      return 0;
1565
    }
1566
 
1567
  lexptr += namelen;
1568
 
1569
  tryname:
1570
 
1571
  /* Catch specific keywords.  Should be done with a data structure.  */
1572
  switch (namelen)
1573
    {
1574
    case 8:
1575
      if (strncmp (tokstart, "unsigned", 8) == 0)
1576
        return UNSIGNED;
1577
      if (current_language->la_language == language_cplus
1578
          && strncmp (tokstart, "template", 8) == 0)
1579
        return TEMPLATE;
1580
      if (strncmp (tokstart, "volatile", 8) == 0)
1581
        return VOLATILE_KEYWORD;
1582
      break;
1583
    case 6:
1584
      if (strncmp (tokstart, "struct", 6) == 0)
1585
        return STRUCT;
1586
      if (strncmp (tokstart, "signed", 6) == 0)
1587
        return SIGNED_KEYWORD;
1588
      if (strncmp (tokstart, "sizeof", 6) == 0)
1589
        return SIZEOF;
1590
      if (strncmp (tokstart, "double", 6) == 0)
1591
        return DOUBLE_KEYWORD;
1592
      break;
1593
    case 5:
1594
      if ((current_language->la_language == language_cplus)
1595
          && strncmp (tokstart, "class", 5) == 0)
1596
        return CLASS;
1597
      if (strncmp (tokstart, "union", 5) == 0)
1598
        return UNION;
1599
      if (strncmp (tokstart, "short", 5) == 0)
1600
        return SHORT;
1601
      if (strncmp (tokstart, "const", 5) == 0)
1602
        return CONST_KEYWORD;
1603
      break;
1604
    case 4:
1605
      if (strncmp (tokstart, "enum", 4) == 0)
1606
        return ENUM;
1607
      if (strncmp (tokstart, "long", 4) == 0)
1608
        return LONG;
1609
      break;
1610
    case 3:
1611
      if (strncmp (tokstart, "int", 3) == 0)
1612
        return INT_KEYWORD;
1613
      break;
1614
    default:
1615
      break;
1616
    }
1617
 
1618
  yylval.sval.ptr = tokstart;
1619
  yylval.sval.length = namelen;
1620
 
1621
  if (*tokstart == '$')
1622
    {
1623
      write_dollar_variable (yylval.sval);
1624
      return VARIABLE;
1625
    }
1626
 
1627
  /* Use token-type BLOCKNAME for symbols that happen to be defined as
1628
     functions or symtabs.  If this is not so, then ...
1629
     Use token-type TYPENAME for symbols that happen to be defined
1630
     currently as names of types; NAME for other symbols.
1631
     The caller is not constrained to care about the distinction.  */
1632
  {
1633
    char *tmp = copy_name (yylval.sval);
1634
    struct symbol *sym;
1635
    int is_a_field_of_this = 0, *need_this;
1636
    int hextype;
1637
 
1638
    if (current_language->la_language == language_cplus ||
1639
        current_language->la_language == language_objc)
1640
      need_this = &is_a_field_of_this;
1641
    else
1642
      need_this = (int *) NULL;
1643
 
1644
    sym = lookup_symbol (tmp, expression_context_block,
1645
                         VAR_DOMAIN,
1646
                         need_this,
1647
                         (struct symtab **) NULL);
1648
    /* Call lookup_symtab, not lookup_partial_symtab, in case there
1649
       are no psymtabs (coff, xcoff, or some future change to blow
1650
       away the psymtabs once symbols are read).  */
1651
    if ((sym && SYMBOL_CLASS (sym) == LOC_BLOCK) ||
1652
        lookup_symtab (tmp))
1653
      {
1654
        yylval.ssym.sym = sym;
1655
        yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1656
        return BLOCKNAME;
1657
      }
1658
    if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
1659
        {
1660
#if 1
1661
          /* Despite the following flaw, we need to keep this code
1662
             enabled.  Because we can get called from
1663
             check_stub_method, if we don't handle nested types then
1664
             it screws many operations in any program which uses
1665
             nested types.  */
1666
          /* In "A::x", if x is a member function of A and there
1667
             happens to be a type (nested or not, since the stabs
1668
             don't make that distinction) named x, then this code
1669
             incorrectly thinks we are dealing with nested types
1670
             rather than a member function.  */
1671
 
1672
          char *p;
1673
          char *namestart;
1674
          struct symbol *best_sym;
1675
 
1676
          /* Look ahead to detect nested types.  This probably should
1677
             be done in the grammar, but trying seemed to introduce a
1678
             lot of shift/reduce and reduce/reduce conflicts.  It's
1679
             possible that it could be done, though.  Or perhaps a
1680
             non-grammar, but less ad hoc, approach would work well.  */
1681
 
1682
          /* Since we do not currently have any way of distinguishing
1683
             a nested type from a non-nested one (the stabs don't tell
1684
             us whether a type is nested), we just ignore the
1685
             containing type.  */
1686
 
1687
          p = lexptr;
1688
          best_sym = sym;
1689
          while (1)
1690
            {
1691
              /* Skip whitespace.  */
1692
              while (*p == ' ' || *p == '\t' || *p == '\n')
1693
                ++p;
1694
              if (*p == ':' && p[1] == ':')
1695
                {
1696
                  /* Skip the `::'.  */
1697
                  p += 2;
1698
                  /* Skip whitespace.  */
1699
                  while (*p == ' ' || *p == '\t' || *p == '\n')
1700
                    ++p;
1701
                  namestart = p;
1702
                  while (*p == '_' || *p == '$' || (*p >= '0' && *p <= '9')
1703
                         || (*p >= 'a' && *p <= 'z')
1704
                         || (*p >= 'A' && *p <= 'Z'))
1705
                    ++p;
1706
                  if (p != namestart)
1707
                    {
1708
                      struct symbol *cur_sym;
1709
                      /* As big as the whole rest of the expression,
1710
                         which is at least big enough.  */
1711
                      char *ncopy = alloca (strlen (tmp) +
1712
                                            strlen (namestart) + 3);
1713
                      char *tmp1;
1714
 
1715
                      tmp1 = ncopy;
1716
                      memcpy (tmp1, tmp, strlen (tmp));
1717
                      tmp1 += strlen (tmp);
1718
                      memcpy (tmp1, "::", 2);
1719
                      tmp1 += 2;
1720
                      memcpy (tmp1, namestart, p - namestart);
1721
                      tmp1[p - namestart] = '\0';
1722
                      cur_sym = lookup_symbol (ncopy,
1723
                                               expression_context_block,
1724
                                               VAR_DOMAIN, (int *) NULL,
1725
                                               (struct symtab **) NULL);
1726
                      if (cur_sym)
1727
                        {
1728
                          if (SYMBOL_CLASS (cur_sym) == LOC_TYPEDEF)
1729
                            {
1730
                              best_sym = cur_sym;
1731
                              lexptr = p;
1732
                            }
1733
                          else
1734
                            break;
1735
                        }
1736
                      else
1737
                        break;
1738
                    }
1739
                  else
1740
                    break;
1741
                }
1742
              else
1743
                break;
1744
            }
1745
 
1746
          yylval.tsym.type = SYMBOL_TYPE (best_sym);
1747
#else /* not 0 */
1748
          yylval.tsym.type = SYMBOL_TYPE (sym);
1749
#endif /* not 0 */
1750
          return TYPENAME;
1751
        }
1752
    yylval.tsym.type
1753
      = language_lookup_primitive_type_by_name (current_language,
1754
                                                current_gdbarch, tmp);
1755
    if (yylval.tsym.type != NULL)
1756
      return TYPENAME;
1757
 
1758
    /* See if it's an ObjC classname.  */
1759
    if (!sym)
1760
      {
1761
        CORE_ADDR Class = lookup_objc_class(tmp);
1762
        if (Class)
1763
          {
1764
            yylval.class.class = Class;
1765
            if ((sym = lookup_struct_typedef (tmp,
1766
                                              expression_context_block,
1767
                                              1)))
1768
              yylval.class.type = SYMBOL_TYPE (sym);
1769
            return CLASSNAME;
1770
          }
1771
      }
1772
 
1773
    /* Input names that aren't symbols but ARE valid hex numbers,
1774
       when the input radix permits them, can be names or numbers
1775
       depending on the parse.  Note we support radixes > 16 here.  */
1776
    if (!sym &&
1777
        ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10) ||
1778
         (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
1779
      {
1780
        YYSTYPE newlval;        /* Its value is ignored.  */
1781
        hextype = parse_number (tokstart, namelen, 0, &newlval);
1782
        if (hextype == INT)
1783
          {
1784
            yylval.ssym.sym = sym;
1785
            yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1786
            return NAME_OR_INT;
1787
          }
1788
      }
1789
 
1790
    /* Any other kind of symbol.  */
1791
    yylval.ssym.sym = sym;
1792
    yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1793
    return NAME;
1794
  }
1795
}
1796
 
1797
void
1798
yyerror (msg)
1799
     char *msg;
1800
{
1801
  if (*lexptr == '\0')
1802
    error("A %s near end of expression.",  (msg ? msg : "error"));
1803
  else
1804
    error ("A %s in expression, near `%s'.", (msg ? msg : "error"),
1805
           lexptr);
1806
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.