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

Subversion Repositories or1k

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1181 sfurman
/* YACC parser for Ada expressions, for GDB.
2
   Copyright (C) 1986, 1989, 1990, 1991, 1993, 1994, 1997, 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
20
 
21
/* Parse an Ada expression from text in a string,
22
   and return the result as a  struct expression  pointer.
23
   That structure contains arithmetic operations in reverse polish,
24
   with constants represented by operations that are followed by special data.
25
   See expression.h for the details of the format.
26
   What is important here is that it can be built up sequentially
27
   during the process of parsing; the lower levels of the tree always
28
   come first in the result.
29
 
30
   malloc's and realloc's in this file are transformed to
31
   xmalloc and xrealloc respectively by the same sed command in the
32
   makefile that remaps any other malloc/realloc inserted by the parser
33
   generator.  Doing this with #defines and trying to control the interaction
34
   with include files ( and  for example) just became
35
   too messy, particularly when such includes can be inserted at random
36
   times by the parser generator.  */
37
 
38
%{
39
 
40
#include "defs.h"
41
#include 
42
#include 
43
#include "expression.h"
44
#include "value.h"
45
#include "parser-defs.h"
46
#include "language.h"
47
#include "ada-lang.h"
48
#include "bfd.h" /* Required by objfiles.h.  */
49
#include "symfile.h" /* Required by objfiles.h.  */
50
#include "objfiles.h" /* For have_full_symbols and have_partial_symbols */
51
#include "frame.h"
52
 
53
/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
54
   as well as gratuitiously global symbol names, so we can have multiple
55
   yacc generated parsers in gdb.  These are only the variables
56
   produced by yacc.  If other parser generators (bison, byacc, etc) produce
57
   additional global names that conflict at link time, then those parser
58
   generators need to be fixed instead of adding those names to this list. */
59
 
60
/* NOTE: This is clumsy, especially since BISON and FLEX provide --prefix
61
   options.  I presume we are maintaining it to accommodate systems
62
   without BISON?  (PNH) */
63
 
64
#define yymaxdepth ada_maxdepth
65
#define yyparse _ada_parse      /* ada_parse calls this after  initialization */
66
#define yylex   ada_lex
67
#define yyerror ada_error
68
#define yylval  ada_lval
69
#define yychar  ada_char
70
#define yydebug ada_debug
71
#define yypact  ada_pact
72
#define yyr1    ada_r1
73
#define yyr2    ada_r2
74
#define yydef   ada_def
75
#define yychk   ada_chk
76
#define yypgo   ada_pgo
77
#define yyact   ada_act
78
#define yyexca  ada_exca
79
#define yyerrflag ada_errflag
80
#define yynerrs ada_nerrs
81
#define yyps    ada_ps
82
#define yypv    ada_pv
83
#define yys     ada_s
84
#define yy_yys  ada_yys
85
#define yystate ada_state
86
#define yytmp   ada_tmp
87
#define yyv     ada_v
88
#define yy_yyv  ada_yyv
89
#define yyval   ada_val
90
#define yylloc  ada_lloc
91
#define yyreds  ada_reds                /* With YYDEBUG defined */
92
#define yytoks  ada_toks                /* With YYDEBUG defined */
93
#define yyname  ada_name                /* With YYDEBUG defined */
94
#define yyrule  ada_rule                /* With YYDEBUG defined */
95
 
96
#ifndef YYDEBUG
97
#define YYDEBUG 1               /* Default to yydebug support */
98
#endif
99
 
100
#define YYFPRINTF parser_fprintf
101
 
102
struct name_info {
103
  struct symbol* sym;
104
  struct minimal_symbol* msym;
105
  struct block* block;
106
  struct stoken stoken;
107
};
108
 
109
/* If expression is in the context of TYPE'(...), then TYPE, else
110
 * NULL. */
111
static struct type* type_qualifier;
112
 
113
int yyparse (void);
114
 
115
static int yylex (void);
116
 
117
void yyerror (char *);
118
 
119
static struct stoken string_to_operator (struct stoken);
120
 
121
static void write_attribute_call0 (enum ada_attribute);
122
 
123
static void write_attribute_call1 (enum ada_attribute, LONGEST);
124
 
125
static void write_attribute_calln (enum ada_attribute, int);
126
 
127
static void write_object_renaming (struct block*, struct symbol*);
128
 
129
static void write_var_from_name (struct block*, struct name_info);
130
 
131
static LONGEST
132
convert_char_literal (struct type*, LONGEST);
133
%}
134
 
135
%union
136
  {
137
    LONGEST lval;
138
    struct {
139
      LONGEST val;
140
      struct type *type;
141
    } typed_val;
142
    struct {
143
      DOUBLEST dval;
144
      struct type *type;
145
    } typed_val_float;
146
    struct type *tval;
147
    struct stoken sval;
148
    struct name_info ssym;
149
    int voidval;
150
    struct block *bval;
151
    struct internalvar *ivar;
152
 
153
  }
154
 
155
%type  exp exp1 simple_exp start variable
156
%type  type
157
 
158
%token  INT NULL_PTR CHARLIT
159
%token  FLOAT
160
%token  TYPENAME
161
%token  BLOCKNAME
162
 
163
/* Both NAME and TYPENAME tokens represent symbols in the input,
164
   and both convey their data as strings.
165
   But a TYPENAME is a string that happens to be defined as a typedef
166
   or builtin type name (such as int or char)
167
   and a NAME is any other symbol.
168
   Contexts where this distinction is not important can use the
169
   nonterminal "name", which matches either NAME or TYPENAME.  */
170
 
171
%token  STRING
172
%token  NAME DOT_ID OBJECT_RENAMING
173
%type  block
174
%type  arglist tick_arglist
175
 
176
%type  save_qualifier
177
 
178
%token DOT_ALL
179
 
180
/* Special type cases, put in to allow the parser to distinguish different
181
   legal basetypes.  */
182
%token  LAST REGNAME
183
 
184
%token  INTERNAL_VARIABLE
185
 
186
%nonassoc ASSIGN
187
%left _AND_ OR XOR THEN ELSE
188
%left '=' NOTEQUAL '<' '>' LEQ GEQ IN DOTDOT
189
%left '@'
190
%left '+' '-' '&'
191
%left UNARY
192
%left '*' '/' MOD REM
193
%right STARSTAR ABS NOT
194
 /* The following are right-associative only so that reductions at this
195
    precedence have lower precedence than '.' and '('. The syntax still
196
    forces a.b.c, e.g., to be LEFT-associated. */
197
%right TICK_ACCESS TICK_ADDRESS TICK_FIRST TICK_LAST TICK_LENGTH
198
%right TICK_MAX TICK_MIN TICK_MODULUS
199
%right TICK_POS TICK_RANGE TICK_SIZE TICK_TAG TICK_VAL
200
%right '.' '(' '[' DOT_ID DOT_ALL
201
 
202
%token ARROW NEW
203
 
204
 
205
%%
206
 
207
start   :       exp1
208
        |       type    { write_exp_elt_opcode (OP_TYPE);
209
                          write_exp_elt_type ($1);
210
                          write_exp_elt_opcode (OP_TYPE); }
211
        ;
212
 
213
/* Expressions, including the sequencing operator.  */
214
exp1    :       exp
215
        |       exp1 ';' exp
216
                        { write_exp_elt_opcode (BINOP_COMMA); }
217
        ;
218
 
219
/* Expressions, not including the sequencing operator.  */
220
simple_exp :    simple_exp DOT_ALL
221
                        { write_exp_elt_opcode (UNOP_IND); }
222
        ;
223
 
224
simple_exp :    simple_exp DOT_ID
225
                        { write_exp_elt_opcode (STRUCTOP_STRUCT);
226
                          write_exp_string ($2.stoken);
227
                          write_exp_elt_opcode (STRUCTOP_STRUCT);
228
                          }
229
        ;
230
 
231
simple_exp :    simple_exp '(' arglist ')'
232
                        {
233
                          write_exp_elt_opcode (OP_FUNCALL);
234
                          write_exp_elt_longcst ($3);
235
                          write_exp_elt_opcode (OP_FUNCALL);
236
                        }
237
        ;
238
 
239
simple_exp :    type '(' exp ')'
240
                        {
241
                          write_exp_elt_opcode (UNOP_CAST);
242
                          write_exp_elt_type ($1);
243
                          write_exp_elt_opcode (UNOP_CAST);
244
                        }
245
        ;
246
 
247
simple_exp :    type '\'' save_qualifier { type_qualifier = $1; } '(' exp ')'
248
                        {
249
                          /*                      write_exp_elt_opcode (UNOP_QUAL); */
250
                          /* FIXME: UNOP_QUAL should be defined in expression.h */
251
                          write_exp_elt_type ($1);
252
                          /* write_exp_elt_opcode (UNOP_QUAL); */
253
                          /* FIXME: UNOP_QUAL should be defined in expression.h */
254
                          type_qualifier = $3;
255
                        }
256
        ;
257
 
258
save_qualifier :        { $$ = type_qualifier; }
259
 
260
simple_exp :
261
                simple_exp '(' exp DOTDOT exp ')'
262
                        { write_exp_elt_opcode (TERNOP_SLICE); }
263
        ;
264
 
265
simple_exp :    '(' exp1 ')'    { }
266
        ;
267
 
268
simple_exp :    variable
269
        ;
270
 
271
simple_exp:     REGNAME /* GDB extension */
272
                        { write_exp_elt_opcode (OP_REGISTER);
273
                          write_exp_elt_longcst ((LONGEST) $1);
274
                          write_exp_elt_opcode (OP_REGISTER);
275
                        }
276
        ;
277
 
278
simple_exp:     INTERNAL_VARIABLE /* GDB extension */
279
                        { write_exp_elt_opcode (OP_INTERNALVAR);
280
                          write_exp_elt_intern ($1);
281
                          write_exp_elt_opcode (OP_INTERNALVAR);
282
                        }
283
        ;
284
 
285
 
286
exp     :       simple_exp
287
        ;
288
 
289
simple_exp:     LAST
290
                        { write_exp_elt_opcode (OP_LAST);
291
                          write_exp_elt_longcst ((LONGEST) $1);
292
                          write_exp_elt_opcode (OP_LAST);
293
                         }
294
        ;
295
 
296
exp     :       exp ASSIGN exp   /* Extension for convenience */
297
                        { write_exp_elt_opcode (BINOP_ASSIGN); }
298
        ;
299
 
300
exp     :       '-' exp    %prec UNARY
301
                        { write_exp_elt_opcode (UNOP_NEG); }
302
        ;
303
 
304
exp     :       '+' exp    %prec UNARY
305
                        { write_exp_elt_opcode (UNOP_PLUS); }
306
        ;
307
 
308
exp     :       NOT exp    %prec UNARY
309
                        { write_exp_elt_opcode (UNOP_LOGICAL_NOT); }
310
        ;
311
 
312
exp     :       ABS exp    %prec UNARY
313
                        { write_exp_elt_opcode (UNOP_ABS); }
314
        ;
315
 
316
arglist :               { $$ = 0; }
317
        ;
318
 
319
arglist :       exp
320
                        { $$ = 1; }
321
        |       any_name ARROW exp
322
                        { $$ = 1; }
323
        |       arglist ',' exp
324
                        { $$ = $1 + 1; }
325
        |       arglist ',' any_name ARROW exp
326
                        { $$ = $1 + 1; }
327
        ;
328
 
329
exp     :       '{' type '}' exp  %prec '.'
330
                /* GDB extension */
331
                        { write_exp_elt_opcode (UNOP_MEMVAL);
332
                          write_exp_elt_type ($2);
333
                          write_exp_elt_opcode (UNOP_MEMVAL);
334
                        }
335
        ;
336
 
337
/* Binary operators in order of decreasing precedence.  */
338
 
339
exp     :       exp STARSTAR exp
340
                        { write_exp_elt_opcode (BINOP_EXP); }
341
        ;
342
 
343
exp     :       exp '*' exp
344
                        { write_exp_elt_opcode (BINOP_MUL); }
345
        ;
346
 
347
exp     :       exp '/' exp
348
                        { write_exp_elt_opcode (BINOP_DIV); }
349
        ;
350
 
351
exp     :       exp REM exp /* May need to be fixed to give correct Ada REM */
352
                        { write_exp_elt_opcode (BINOP_REM); }
353
        ;
354
 
355
exp     :       exp MOD exp
356
                        { write_exp_elt_opcode (BINOP_MOD); }
357
        ;
358
 
359
exp     :       exp '@' exp     /* GDB extension */
360
                        { write_exp_elt_opcode (BINOP_REPEAT); }
361
        ;
362
 
363
exp     :       exp '+' exp
364
                        { write_exp_elt_opcode (BINOP_ADD); }
365
        ;
366
 
367
exp     :       exp '&' exp
368
                        { write_exp_elt_opcode (BINOP_CONCAT); }
369
        ;
370
 
371
exp     :       exp '-' exp
372
                        { write_exp_elt_opcode (BINOP_SUB); }
373
        ;
374
 
375
exp     :       exp '=' exp
376
                        { write_exp_elt_opcode (BINOP_EQUAL); }
377
        ;
378
 
379
exp     :       exp NOTEQUAL exp
380
                        { write_exp_elt_opcode (BINOP_NOTEQUAL); }
381
        ;
382
 
383
exp     :       exp LEQ exp
384
                        { write_exp_elt_opcode (BINOP_LEQ); }
385
        ;
386
 
387
exp     :       exp IN exp DOTDOT exp
388
                        { /*write_exp_elt_opcode (TERNOP_MBR); */ }
389
                          /* FIXME: TERNOP_MBR should be defined in
390
                             expression.h */
391
        |       exp IN exp TICK_RANGE tick_arglist
392
                        { /*write_exp_elt_opcode (BINOP_MBR); */
393
                          /* FIXME: BINOP_MBR should be defined in expression.h */
394
                          write_exp_elt_longcst ((LONGEST) $5);
395
                          /*write_exp_elt_opcode (BINOP_MBR); */
396
                        }
397
        |       exp IN TYPENAME         %prec TICK_ACCESS
398
                        { /*write_exp_elt_opcode (UNOP_MBR); */
399
                          /* FIXME: UNOP_QUAL should be defined in expression.h */
400
                          write_exp_elt_type ($3);
401
                          /*                      write_exp_elt_opcode (UNOP_MBR); */
402
                          /* FIXME: UNOP_MBR should be defined in expression.h */
403
                        }
404
        |       exp NOT IN exp DOTDOT exp
405
                        { /*write_exp_elt_opcode (TERNOP_MBR); */
406
                          /* FIXME: TERNOP_MBR should be defined in expression.h */
407
                          write_exp_elt_opcode (UNOP_LOGICAL_NOT);
408
                        }
409
        |       exp NOT IN exp TICK_RANGE tick_arglist
410
                        { /* write_exp_elt_opcode (BINOP_MBR); */
411
                          /* FIXME: BINOP_MBR should be defined in expression.h */
412
                          write_exp_elt_longcst ((LONGEST) $6);
413
                          /*write_exp_elt_opcode (BINOP_MBR);*/
414
                          /* FIXME: BINOP_MBR should be defined in expression.h */
415
                          write_exp_elt_opcode (UNOP_LOGICAL_NOT);
416
                        }
417
        |       exp NOT IN TYPENAME     %prec TICK_ACCESS
418
                        { /*write_exp_elt_opcode (UNOP_MBR);*/
419
                          /* FIXME: UNOP_MBR should be defined in expression.h */
420
                          write_exp_elt_type ($4);
421
                          /*                      write_exp_elt_opcode (UNOP_MBR);*/
422
                          /* FIXME: UNOP_MBR should be defined in expression.h */
423
                          write_exp_elt_opcode (UNOP_LOGICAL_NOT);
424
                        }
425
        ;
426
 
427
exp     :       exp GEQ exp
428
                        { write_exp_elt_opcode (BINOP_GEQ); }
429
        ;
430
 
431
exp     :       exp '<' exp
432
                        { write_exp_elt_opcode (BINOP_LESS); }
433
        ;
434
 
435
exp     :       exp '>' exp
436
                        { write_exp_elt_opcode (BINOP_GTR); }
437
        ;
438
 
439
exp     :       exp _AND_ exp  /* Fix for Ada elementwise AND. */
440
                        { write_exp_elt_opcode (BINOP_BITWISE_AND); }
441
        ;
442
 
443
exp     :       exp _AND_ THEN exp      %prec _AND_
444
                        { write_exp_elt_opcode (BINOP_LOGICAL_AND); }
445
        ;
446
 
447
exp     :       exp OR exp     /* Fix for Ada elementwise OR */
448
                        { write_exp_elt_opcode (BINOP_BITWISE_IOR); }
449
        ;
450
 
451
exp     :       exp OR ELSE exp
452
                        { write_exp_elt_opcode (BINOP_LOGICAL_OR); }
453
        ;
454
 
455
exp     :       exp XOR exp    /* Fix for Ada elementwise XOR */
456
                        { write_exp_elt_opcode (BINOP_BITWISE_XOR); }
457
        ;
458
 
459
simple_exp :    simple_exp TICK_ACCESS
460
                        { write_exp_elt_opcode (UNOP_ADDR); }
461
        |       simple_exp TICK_ADDRESS
462
                        { write_exp_elt_opcode (UNOP_ADDR);
463
                          write_exp_elt_opcode (UNOP_CAST);
464
                          write_exp_elt_type (builtin_type_ada_system_address);
465
                          write_exp_elt_opcode (UNOP_CAST);
466
                        }
467
        |       simple_exp TICK_FIRST tick_arglist
468
                        { write_attribute_call1 (ATR_FIRST, $3); }
469
        |       simple_exp TICK_LAST tick_arglist
470
                        { write_attribute_call1 (ATR_LAST, $3); }
471
        |       simple_exp TICK_LENGTH tick_arglist
472
                        { write_attribute_call1 (ATR_LENGTH, $3); }
473
        |       simple_exp TICK_SIZE
474
                        { write_attribute_call0 (ATR_SIZE); }
475
        |       simple_exp TICK_TAG
476
                        { write_attribute_call0 (ATR_TAG); }
477
        |       opt_type_prefix TICK_MIN '(' exp ',' exp ')'
478
                        { write_attribute_calln (ATR_MIN, 2); }
479
        |       opt_type_prefix TICK_MAX '(' exp ',' exp ')'
480
                        { write_attribute_calln (ATR_MAX, 2); }
481
        |       opt_type_prefix TICK_POS '(' exp ')'
482
                        { write_attribute_calln (ATR_POS, 1); }
483
        |       type_prefix TICK_FIRST tick_arglist
484
                        { write_attribute_call1 (ATR_FIRST, $3); }
485
        |       type_prefix TICK_LAST tick_arglist
486
                        { write_attribute_call1 (ATR_LAST, $3); }
487
        |       type_prefix TICK_LENGTH tick_arglist
488
                        { write_attribute_call1 (ATR_LENGTH, $3); }
489
        |       type_prefix TICK_VAL '(' exp ')'
490
                        { write_attribute_calln (ATR_VAL, 1); }
491
        |       type_prefix TICK_MODULUS
492
                        { write_attribute_call0 (ATR_MODULUS); }
493
        ;
494
 
495
tick_arglist :                  %prec '('
496
                        { $$ = 1; }
497
        |       '(' INT ')'
498
                        { $$ = $2.val; }
499
        ;
500
 
501
type_prefix :
502
                TYPENAME
503
                        { write_exp_elt_opcode (OP_TYPE);
504
                          write_exp_elt_type ($1);
505
                          write_exp_elt_opcode (OP_TYPE); }
506
        ;
507
 
508
opt_type_prefix :
509
                type_prefix
510
        |       /* EMPTY */
511
                        { write_exp_elt_opcode (OP_TYPE);
512
                          write_exp_elt_type (builtin_type_void);
513
                          write_exp_elt_opcode (OP_TYPE); }
514
        ;
515
 
516
 
517
exp     :       INT
518
                        { write_exp_elt_opcode (OP_LONG);
519
                          write_exp_elt_type ($1.type);
520
                          write_exp_elt_longcst ((LONGEST)($1.val));
521
                          write_exp_elt_opcode (OP_LONG);
522
                        }
523
        ;
524
 
525
exp     :       CHARLIT
526
                        { write_exp_elt_opcode (OP_LONG);
527
                          if (type_qualifier == NULL)
528
                            write_exp_elt_type ($1.type);
529
                          else
530
                            write_exp_elt_type (type_qualifier);
531
                          write_exp_elt_longcst
532
                            (convert_char_literal (type_qualifier, $1.val));
533
                          write_exp_elt_opcode (OP_LONG);
534
                        }
535
 
536
 
537
exp     :       FLOAT
538
                        { write_exp_elt_opcode (OP_DOUBLE);
539
                          write_exp_elt_type ($1.type);
540
                          write_exp_elt_dblcst ($1.dval);
541
                          write_exp_elt_opcode (OP_DOUBLE);
542
                        }
543
        ;
544
 
545
exp     :       NULL_PTR
546
                        { write_exp_elt_opcode (OP_LONG);
547
                          write_exp_elt_type (builtin_type_int);
548
                          write_exp_elt_longcst ((LONGEST)(0));
549
                          write_exp_elt_opcode (OP_LONG);
550
                         }
551
 
552
exp     :       STRING
553
                        { /* Ada strings are converted into array constants
554
                             a lower bound of 1.  Thus, the array upper bound
555
                             is the string length. */
556
                          char *sp = $1.ptr; int count;
557
                          if ($1.length == 0)
558
                            { /* One dummy character for the type */
559
                              write_exp_elt_opcode (OP_LONG);
560
                              write_exp_elt_type (builtin_type_ada_char);
561
                              write_exp_elt_longcst ((LONGEST)(0));
562
                              write_exp_elt_opcode (OP_LONG);
563
                            }
564
                          for (count = $1.length; count > 0; count -= 1)
565
                            {
566
                              write_exp_elt_opcode (OP_LONG);
567
                              write_exp_elt_type (builtin_type_ada_char);
568
                              write_exp_elt_longcst ((LONGEST)(*sp));
569
                              sp += 1;
570
                              write_exp_elt_opcode (OP_LONG);
571
                            }
572
                          write_exp_elt_opcode (OP_ARRAY);
573
                          write_exp_elt_longcst ((LONGEST) 1);
574
                          write_exp_elt_longcst ((LONGEST) ($1.length));
575
                          write_exp_elt_opcode (OP_ARRAY);
576
                         }
577
        ;
578
 
579
exp     :       NEW TYPENAME
580
                        { error ("NEW not implemented."); }
581
        ;
582
 
583
variable:       NAME            { write_var_from_name (NULL, $1); }
584
        |       block NAME      /* GDB extension */
585
                                { write_var_from_name ($1, $2); }
586
        |       OBJECT_RENAMING { write_object_renaming (NULL, $1.sym); }
587
        |       block OBJECT_RENAMING
588
                                { write_object_renaming ($1, $2.sym); }
589
        ;
590
 
591
any_name :      NAME            { }
592
        |       TYPENAME        { }
593
        |       OBJECT_RENAMING { }
594
        ;
595
 
596
block   :       BLOCKNAME  /* GDB extension */
597
                        { $$ = $1; }
598
        |       block BLOCKNAME /* GDB extension */
599
                        { $$ = $2; }
600
        ;
601
 
602
 
603
type    :       TYPENAME        { $$ = $1; }
604
        |       block TYPENAME  { $$ = $2; }
605
        |       TYPENAME TICK_ACCESS
606
                                { $$ = lookup_pointer_type ($1); }
607
        |       block TYPENAME TICK_ACCESS
608
                                { $$ = lookup_pointer_type ($2); }
609
        ;
610
 
611
/* Some extensions borrowed from C, for the benefit of those who find they
612
   can't get used to Ada notation in GDB. */
613
 
614
exp     :       '*' exp         %prec '.'
615
                        { write_exp_elt_opcode (UNOP_IND); }
616
        |       '&' exp         %prec '.'
617
                        { write_exp_elt_opcode (UNOP_ADDR); }
618
        |       exp '[' exp ']'
619
                        { write_exp_elt_opcode (BINOP_SUBSCRIPT); }
620
        ;
621
 
622
%%
623
 
624
/* yylex defined in ada-lex.c: Reads one token, getting characters */
625
/* through lexptr.  */
626
 
627
/* Remap normal flex interface names (yylex) as well as gratuitiously */
628
/* global symbol names, so we can have multiple flex-generated parsers */
629
/* in gdb.  */
630
 
631
/* (See note above on previous definitions for YACC.) */
632
 
633
#define yy_create_buffer ada_yy_create_buffer
634
#define yy_delete_buffer ada_yy_delete_buffer
635
#define yy_init_buffer ada_yy_init_buffer
636
#define yy_load_buffer_state ada_yy_load_buffer_state
637
#define yy_switch_to_buffer ada_yy_switch_to_buffer
638
#define yyrestart ada_yyrestart
639
#define yytext ada_yytext
640
#define yywrap ada_yywrap
641
 
642
/* The following kludge was found necessary to prevent conflicts between */
643
/* defs.h and non-standard stdlib.h files.  */
644
#define qsort __qsort__dummy
645
#include "ada-lex.c"
646
 
647
int
648
ada_parse ()
649
{
650
  lexer_init (yyin);            /* (Re-)initialize lexer. */
651
  left_block_context = NULL;
652
  type_qualifier = NULL;
653
 
654
  return _ada_parse ();
655
}
656
 
657
void
658
yyerror (msg)
659
     char *msg;
660
{
661
  error ("A %s in expression, near `%s'.", (msg ? msg : "error"), lexptr);
662
}
663
 
664
/* The operator name corresponding to operator symbol STRING (adds
665
   quotes and maps to lower-case).  Destroys the previous contents of
666
   the array pointed to by STRING.ptr.  Error if STRING does not match
667
   a valid Ada operator.  Assumes that STRING.ptr points to a
668
   null-terminated string and that, if STRING is a valid operator
669
   symbol, the array pointed to by STRING.ptr contains at least
670
   STRING.length+3 characters. */
671
 
672
static struct stoken
673
string_to_operator (string)
674
     struct stoken string;
675
{
676
  int i;
677
 
678
  for (i = 0; ada_opname_table[i].mangled != NULL; i += 1)
679
    {
680
      if (string.length == strlen (ada_opname_table[i].demangled)-2
681
          && strncasecmp (string.ptr, ada_opname_table[i].demangled+1,
682
                          string.length) == 0)
683
        {
684
          strncpy (string.ptr, ada_opname_table[i].demangled,
685
                   string.length+2);
686
          string.length += 2;
687
          return string;
688
        }
689
    }
690
  error ("Invalid operator symbol `%s'", string.ptr);
691
}
692
 
693
/* Emit expression to access an instance of SYM, in block BLOCK (if
694
 * non-NULL), and with :: qualification ORIG_LEFT_CONTEXT. */
695
static void
696
write_var_from_sym (orig_left_context, block, sym)
697
     struct block* orig_left_context;
698
     struct block* block;
699
     struct symbol* sym;
700
{
701
  if (orig_left_context == NULL && symbol_read_needs_frame (sym))
702
    {
703
      if (innermost_block == 0 ||
704
          contained_in (block, innermost_block))
705
        innermost_block = block;
706
    }
707
 
708
  write_exp_elt_opcode (OP_VAR_VALUE);
709
  /* We want to use the selected frame, not another more inner frame
710
     which happens to be in the same block */
711
  write_exp_elt_block (NULL);
712
  write_exp_elt_sym (sym);
713
  write_exp_elt_opcode (OP_VAR_VALUE);
714
}
715
 
716
/* Emit expression to access an instance of NAME. */
717
static void
718
write_var_from_name (orig_left_context, name)
719
     struct block* orig_left_context;
720
     struct name_info name;
721
{
722
  if (name.msym != NULL)
723
    {
724
      write_exp_msymbol (name.msym,
725
                         lookup_function_type (builtin_type_int),
726
                         builtin_type_int);
727
    }
728
  else if (name.sym == NULL)
729
    {
730
      /* Multiple matches: record name and starting block for later
731
         resolution by ada_resolve. */
732
      /*      write_exp_elt_opcode (OP_UNRESOLVED_VALUE); */
733
      /* FIXME: OP_UNRESOLVED_VALUE should be defined in expression.h */
734
      write_exp_elt_block (name.block);
735
      /*      write_exp_elt_name (name.stoken.ptr); */
736
      /* FIXME: write_exp_elt_name should be defined in defs.h, located in parse.c */
737
      /*      write_exp_elt_opcode (OP_UNRESOLVED_VALUE); */
738
      /* FIXME: OP_UNRESOLVED_VALUE should be defined in expression.h */
739
    }
740
  else
741
    write_var_from_sym (orig_left_context, name.block, name.sym);
742
}
743
 
744
/* Write a call on parameterless attribute ATR.  */
745
 
746
static void
747
write_attribute_call0 (atr)
748
     enum ada_attribute atr;
749
{
750
  /*  write_exp_elt_opcode (OP_ATTRIBUTE); */
751
  /* FIXME: OP_ATTRIBUTE should be defined in expression.h */
752
  write_exp_elt_longcst ((LONGEST) 0);
753
  write_exp_elt_longcst ((LONGEST) atr);
754
  /*  write_exp_elt_opcode (OP_ATTRIBUTE); */
755
  /* FIXME: OP_ATTRIBUTE should be defined in expression.h */
756
}
757
 
758
/* Write a call on an attribute ATR with one constant integer
759
 * parameter. */
760
 
761
static void
762
write_attribute_call1 (atr, arg)
763
     enum ada_attribute atr;
764
     LONGEST arg;
765
{
766
  write_exp_elt_opcode (OP_LONG);
767
  write_exp_elt_type (builtin_type_int);
768
  write_exp_elt_longcst (arg);
769
  write_exp_elt_opcode (OP_LONG);
770
  /*write_exp_elt_opcode (OP_ATTRIBUTE);*/
771
  /* FIXME: OP_ATTRIBUTE should be defined in expression.h */
772
  write_exp_elt_longcst ((LONGEST) 1);
773
  write_exp_elt_longcst ((LONGEST) atr);
774
  /*write_exp_elt_opcode (OP_ATTRIBUTE);*/
775
  /* FIXME: OP_ATTRIBUTE should be defined in expression.h */
776
}
777
 
778
/* Write a call on an attribute ATR with N parameters, whose code must have
779
 * been generated previously. */
780
 
781
static void
782
write_attribute_calln (atr, n)
783
     enum ada_attribute atr;
784
     int n;
785
{
786
  /*write_exp_elt_opcode (OP_ATTRIBUTE);*/
787
  /* FIXME: OP_ATTRIBUTE should be defined in expression.h */
788
  write_exp_elt_longcst ((LONGEST) n);
789
  write_exp_elt_longcst ((LONGEST) atr);
790
  /*  write_exp_elt_opcode (OP_ATTRIBUTE);*/
791
  /* FIXME: OP_ATTRIBUTE should be defined in expression.h */
792
}
793
 
794
/* Emit expression corresponding to the renamed object designated by
795
 * the type RENAMING, which must be the referent of an object renaming
796
 * type, in the context of ORIG_LEFT_CONTEXT (?). */
797
static void
798
write_object_renaming (orig_left_context, renaming)
799
     struct block* orig_left_context;
800
     struct symbol* renaming;
801
{
802
  const char* qualification = SYMBOL_NAME (renaming);
803
  const char* simple_tail;
804
  const char* expr = TYPE_FIELD_NAME (SYMBOL_TYPE (renaming), 0);
805
  const char* suffix;
806
  char* name;
807
  struct symbol* sym;
808
  enum { SIMPLE_INDEX, LOWER_BOUND, UPPER_BOUND } slice_state;
809
 
810
  /* if orig_left_context is null, then use the currently selected
811
     block, otherwise we might fail our symbol lookup below */
812
  if (orig_left_context == NULL)
813
    orig_left_context = get_selected_block (NULL);
814
 
815
  for (simple_tail = qualification + strlen (qualification);
816
       simple_tail != qualification; simple_tail -= 1)
817
    {
818
      if (*simple_tail == '.')
819
        {
820
          simple_tail += 1;
821
          break;
822
        }
823
      else if (STREQN (simple_tail, "__", 2))
824
        {
825
          simple_tail += 2;
826
          break;
827
        }
828
    }
829
 
830
  suffix = strstr (expr, "___XE");
831
  if (suffix == NULL)
832
    goto BadEncoding;
833
 
834
  name = (char*) malloc (suffix - expr + 1);
835
  /*  add_name_string_cleanup (name); */
836
  /* FIXME: add_name_string_cleanup should be defined in
837
     parser-defs.h, implemented in parse.c */
838
  strncpy (name, expr, suffix-expr);
839
  name[suffix-expr] = '\000';
840
  sym = lookup_symbol (name, orig_left_context, VAR_NAMESPACE, 0, NULL);
841
  /*  if (sym == NULL)
842
    error ("Could not find renamed variable: %s", ada_demangle (name));
843
  */
844
  /* FIXME: ada_demangle should be defined in defs.h, implemented in ada-lang.c */
845
  write_var_from_sym (orig_left_context, block_found, sym);
846
 
847
  suffix += 5;
848
  slice_state = SIMPLE_INDEX;
849
  while (*suffix == 'X')
850
    {
851
      suffix += 1;
852
 
853
      switch (*suffix) {
854
      case 'L':
855
        slice_state = LOWER_BOUND;
856
      case 'S':
857
        suffix += 1;
858
        if (isdigit (*suffix))
859
          {
860
            char* next;
861
            long val = strtol (suffix, &next, 10);
862
            if (next == suffix)
863
              goto BadEncoding;
864
            suffix = next;
865
            write_exp_elt_opcode (OP_LONG);
866
            write_exp_elt_type (builtin_type_ada_int);
867
            write_exp_elt_longcst ((LONGEST) val);
868
            write_exp_elt_opcode (OP_LONG);
869
          }
870
        else
871
          {
872
            const char* end;
873
            char* index_name;
874
            int index_len;
875
            struct symbol* index_sym;
876
 
877
            end = strchr (suffix, 'X');
878
            if (end == NULL)
879
              end = suffix + strlen (suffix);
880
 
881
            index_len = simple_tail - qualification + 2 + (suffix - end) + 1;
882
            index_name = (char*) malloc (index_len);
883
            memset (index_name, '\000', index_len);
884
            /*      add_name_string_cleanup (index_name);*/
885
            /* FIXME: add_name_string_cleanup should be defined in
886
               parser-defs.h, implemented in parse.c */
887
            strncpy (index_name, qualification, simple_tail - qualification);
888
            index_name[simple_tail - qualification] = '\000';
889
            strncat (index_name, suffix, suffix-end);
890
            suffix = end;
891
 
892
            index_sym =
893
              lookup_symbol (index_name, NULL, VAR_NAMESPACE, 0, NULL);
894
            if (index_sym == NULL)
895
              error ("Could not find %s", index_name);
896
            write_var_from_sym (NULL, block_found, sym);
897
          }
898
        if (slice_state == SIMPLE_INDEX)
899
          {
900
            write_exp_elt_opcode (OP_FUNCALL);
901
            write_exp_elt_longcst ((LONGEST) 1);
902
            write_exp_elt_opcode (OP_FUNCALL);
903
          }
904
        else if (slice_state == LOWER_BOUND)
905
          slice_state = UPPER_BOUND;
906
        else if (slice_state == UPPER_BOUND)
907
          {
908
            write_exp_elt_opcode (TERNOP_SLICE);
909
            slice_state = SIMPLE_INDEX;
910
          }
911
        break;
912
 
913
      case 'R':
914
        {
915
          struct stoken field_name;
916
          const char* end;
917
          suffix += 1;
918
 
919
          if (slice_state != SIMPLE_INDEX)
920
            goto BadEncoding;
921
          end = strchr (suffix, 'X');
922
          if (end == NULL)
923
            end = suffix + strlen (suffix);
924
          field_name.length = end - suffix;
925
          field_name.ptr = (char*) malloc (end - suffix + 1);
926
          strncpy (field_name.ptr, suffix, end - suffix);
927
          field_name.ptr[end - suffix] = '\000';
928
          suffix = end;
929
          write_exp_elt_opcode (STRUCTOP_STRUCT);
930
          write_exp_string (field_name);
931
          write_exp_elt_opcode (STRUCTOP_STRUCT);
932
          break;
933
        }
934
 
935
      default:
936
        goto BadEncoding;
937
      }
938
    }
939
  if (slice_state == SIMPLE_INDEX)
940
    return;
941
 
942
 BadEncoding:
943
  error ("Internal error in encoding of renaming declaration: %s",
944
         SYMBOL_NAME (renaming));
945
}
946
 
947
/* Convert the character literal whose ASCII value would be VAL to the
948
   appropriate value of type TYPE, if there is a translation.
949
   Otherwise return VAL.  Hence, in an enumeration type ('A', 'B'),
950
   the literal 'A' (VAL == 65), returns 0. */
951
static LONGEST
952
convert_char_literal (struct type* type, LONGEST val)
953
{
954
  char name[7];
955
  int f;
956
 
957
  if (type == NULL || TYPE_CODE (type) != TYPE_CODE_ENUM)
958
    return val;
959
  sprintf (name, "QU%02x", (int) val);
960
  for (f = 0; f < TYPE_NFIELDS (type); f += 1)
961
    {
962
      if (STREQ (name, TYPE_FIELD_NAME (type, f)))
963
        return TYPE_FIELD_BITPOS (type, f);
964
    }
965
  return val;
966
}

powered by: WebSVN 2.1.0

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