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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.3/] [gdb/] [p-exp.y] - Blame information for rev 1765

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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