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