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