Split non-target-dependent code out of target_attach routines.
[deliverable/binutils-gdb.git] / gdb / expread.y
CommitLineData
dd3b648e
RP
1/* Parse C expressions for GDB.
2 Copyright (C) 1986, 1989, 1990, 1991 Free Software Foundation, Inc.
3
4This file is part of GDB.
5
99a7de40 6This program is free software; you can redistribute it and/or modify
dd3b648e 7it under the terms of the GNU General Public License as published by
99a7de40
JG
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
dd3b648e 10
99a7de40 11This program is distributed in the hope that it will be useful,
dd3b648e
RP
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
99a7de40
JG
17along with this program; if not, write to the Free Software
18Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
dd3b648e
RP
19\f
20/* Parse a C expression from text in a string,
21 and return the result as a struct expression pointer.
22 That structure contains arithmetic operations in reverse polish,
23 with constants represented by operations that are followed by special data.
24 See expression.h for the details of the format.
25 What is important here is that it can be built up sequentially
26 during the process of parsing; the lower levels of the tree always
27 come first in the result. */
28
29%{
30#include <stdio.h>
31#include "defs.h"
32#include "param.h"
33#include "symtab.h"
34#include "frame.h"
35#include "expression.h"
36#include "value.h"
37#include "command.h"
38
39static struct expression *expout;
40static int expout_size;
41static int expout_ptr;
42
43static int yylex ();
44static void yyerror ();
45static void write_exp_elt ();
46static void write_exp_elt_opcode ();
47static void write_exp_elt_sym ();
48static void write_exp_elt_longcst ();
49static void write_exp_elt_dblcst ();
50static void write_exp_elt_type ();
51static void write_exp_elt_intern ();
52static void write_exp_string ();
53static void start_arglist ();
54static int end_arglist ();
55static void free_funcalls ();
56static char *copy_name ();
57static int parse_number ();
58
59/* If this is nonzero, this block is used as the lexical context
60 for symbol names. */
61
62static struct block *expression_context_block;
63
64/* The innermost context required by the stack and register variables
65 we've encountered so far. */
66struct block *innermost_block;
67
68/* The block in which the most recently discovered symbol was found. */
69struct block *block_found;
70
71/* Number of arguments seen so far in innermost function call. */
72static int arglist_len;
73
74/* Data structure for saving values of arglist_len
75 for function calls whose arguments contain other function calls. */
76
77struct funcall
78 {
79 struct funcall *next;
80 int arglist_len;
81 };
82
83struct funcall *funcall_chain;
84
85/* This kind of datum is used to represent the name
86 of a symbol token. */
87
88struct stoken
89 {
90 char *ptr;
91 int length;
92 };
93
94struct ttype
95 {
96 struct stoken stoken;
97 struct type *type;
98 };
99
100struct symtoken
101 {
102 struct stoken stoken;
103 struct symbol *sym;
104 int is_a_field_of_this;
105 };
106
107/* For parsing of complicated types.
108 An array should be preceded in the list by the size of the array. */
109enum type_pieces
110 {tp_end = -1, tp_pointer, tp_reference, tp_array, tp_function};
e1ce8aa5
JK
111/* The stack can contain either an enum type_pieces or an int. */
112union type_stack_elt {
113 enum type_pieces piece;
114 int int_val;
115};
116static union type_stack_elt *type_stack;
dd3b648e
RP
117static int type_stack_depth, type_stack_size;
118
119static void push_type ();
e1ce8aa5 120static void push_type_int ();
dd3b648e 121static enum type_pieces pop_type ();
e1ce8aa5 122static int pop_type_int ();
dd3b648e
RP
123
124/* Allow debugging of parsing. */
125#define YYDEBUG 1
126%}
127
128/* Although the yacc "value" of an expression is not used,
129 since the result is stored in the structure being created,
130 other node types do have values. */
131
132%union
133 {
134 LONGEST lval;
135 unsigned LONGEST ulval;
136 double dval;
137 struct symbol *sym;
138 struct type *tval;
139 struct stoken sval;
140 struct ttype tsym;
141 struct symtoken ssym;
142 int voidval;
143 struct block *bval;
144 enum exp_opcode opcode;
145 struct internalvar *ivar;
146
147 struct type **tvec;
148 int *ivec;
149 }
150
151%type <voidval> exp exp1 start variable
152%type <tval> type typebase
153%type <tvec> nonempty_typelist
154%type <bval> block
155
156/* Fancy type parsing. */
157%type <voidval> func_mod direct_abs_decl abs_decl
158%type <tval> ptype
159%type <lval> array_mod
160
161%token <lval> INT CHAR
162%token <ulval> UINT
163%token <dval> FLOAT
164
165/* Both NAME and TYPENAME tokens represent symbols in the input,
166 and both convey their data as strings.
167 But a TYPENAME is a string that happens to be defined as a typedef
168 or builtin type name (such as int or char)
169 and a NAME is any other symbol.
170
171 Contexts where this distinction is not important can use the
172 nonterminal "name", which matches either NAME or TYPENAME. */
173
174%token <sval> STRING
175%token <ssym> NAME BLOCKNAME
176%token <tsym> TYPENAME
177%type <sval> name
178%type <ssym> name_not_typename
179%type <tsym> typename
180
181/* A NAME_OR_INT is a symbol which is not known in the symbol table,
182 but which would parse as a valid number in the current input radix.
183 E.g. "c" when input_radix==16. Depending on the parse, it will be
184 turned into a name or into a number. NAME_OR_UINT ditto. */
185
186%token <ssym> NAME_OR_INT NAME_OR_UINT
187
188%token STRUCT UNION ENUM SIZEOF UNSIGNED COLONCOLON
189%token ERROR
190
191/* Special type cases, put in to allow the parser to distinguish different
192 legal basetypes. */
193%token SIGNED LONG SHORT INT_KEYWORD
194
195%token <lval> LAST REGNAME
196
197%token <ivar> VARIABLE
198
199%token <opcode> ASSIGN_MODIFY
200
201/* C++ */
202%token THIS
203
204%left ','
205%left ABOVE_COMMA
206%right '=' ASSIGN_MODIFY
207%right '?'
208%left OR
209%left AND
210%left '|'
211%left '^'
212%left '&'
213%left EQUAL NOTEQUAL
214%left '<' '>' LEQ GEQ
215%left LSH RSH
216%left '@'
217%left '+' '-'
218%left '*' '/' '%'
219%right UNARY INCREMENT DECREMENT
220%right ARROW '.' '[' '('
221%left COLONCOLON
222\f
223%%
224
225start : exp1
226 ;
227
228/* Expressions, including the comma operator. */
229exp1 : exp
230 | exp1 ',' exp
231 { write_exp_elt_opcode (BINOP_COMMA); }
232 ;
233
234/* Expressions, not including the comma operator. */
235exp : '*' exp %prec UNARY
236 { write_exp_elt_opcode (UNOP_IND); }
237
238exp : '&' exp %prec UNARY
239 { write_exp_elt_opcode (UNOP_ADDR); }
240
241exp : '-' exp %prec UNARY
242 { write_exp_elt_opcode (UNOP_NEG); }
243 ;
244
245exp : '!' exp %prec UNARY
246 { write_exp_elt_opcode (UNOP_ZEROP); }
247 ;
248
249exp : '~' exp %prec UNARY
250 { write_exp_elt_opcode (UNOP_LOGNOT); }
251 ;
252
253exp : INCREMENT exp %prec UNARY
254 { write_exp_elt_opcode (UNOP_PREINCREMENT); }
255 ;
256
257exp : DECREMENT exp %prec UNARY
258 { write_exp_elt_opcode (UNOP_PREDECREMENT); }
259 ;
260
261exp : exp INCREMENT %prec UNARY
262 { write_exp_elt_opcode (UNOP_POSTINCREMENT); }
263 ;
264
265exp : exp DECREMENT %prec UNARY
266 { write_exp_elt_opcode (UNOP_POSTDECREMENT); }
267 ;
268
269exp : SIZEOF exp %prec UNARY
270 { write_exp_elt_opcode (UNOP_SIZEOF); }
271 ;
272
273exp : exp ARROW name
274 { write_exp_elt_opcode (STRUCTOP_PTR);
275 write_exp_string ($3);
276 write_exp_elt_opcode (STRUCTOP_PTR); }
277 ;
278
279exp : exp ARROW '*' exp
280 { write_exp_elt_opcode (STRUCTOP_MPTR); }
281 ;
282
283exp : exp '.' name
284 { write_exp_elt_opcode (STRUCTOP_STRUCT);
285 write_exp_string ($3);
286 write_exp_elt_opcode (STRUCTOP_STRUCT); }
287 ;
288
289exp : exp '.' '*' exp
290 { write_exp_elt_opcode (STRUCTOP_MEMBER); }
291 ;
292
293exp : exp '[' exp1 ']'
294 { write_exp_elt_opcode (BINOP_SUBSCRIPT); }
295 ;
296
297exp : exp '('
298 /* This is to save the value of arglist_len
299 being accumulated by an outer function call. */
300 { start_arglist (); }
301 arglist ')' %prec ARROW
302 { write_exp_elt_opcode (OP_FUNCALL);
303 write_exp_elt_longcst ((LONGEST) end_arglist ());
304 write_exp_elt_opcode (OP_FUNCALL); }
305 ;
306
307arglist :
308 ;
309
310arglist : exp
311 { arglist_len = 1; }
312 ;
313
314arglist : arglist ',' exp %prec ABOVE_COMMA
315 { arglist_len++; }
316 ;
317
318exp : '{' type '}' exp %prec UNARY
319 { write_exp_elt_opcode (UNOP_MEMVAL);
320 write_exp_elt_type ($2);
321 write_exp_elt_opcode (UNOP_MEMVAL); }
322 ;
323
324exp : '(' type ')' exp %prec UNARY
325 { write_exp_elt_opcode (UNOP_CAST);
326 write_exp_elt_type ($2);
327 write_exp_elt_opcode (UNOP_CAST); }
328 ;
329
330exp : '(' exp1 ')'
331 { }
332 ;
333
334/* Binary operators in order of decreasing precedence. */
335
336exp : exp '@' exp
337 { write_exp_elt_opcode (BINOP_REPEAT); }
338 ;
339
340exp : exp '*' exp
341 { write_exp_elt_opcode (BINOP_MUL); }
342 ;
343
344exp : exp '/' exp
345 { write_exp_elt_opcode (BINOP_DIV); }
346 ;
347
348exp : exp '%' exp
349 { write_exp_elt_opcode (BINOP_REM); }
350 ;
351
352exp : exp '+' exp
353 { write_exp_elt_opcode (BINOP_ADD); }
354 ;
355
356exp : exp '-' exp
357 { write_exp_elt_opcode (BINOP_SUB); }
358 ;
359
360exp : exp LSH exp
361 { write_exp_elt_opcode (BINOP_LSH); }
362 ;
363
364exp : exp RSH exp
365 { write_exp_elt_opcode (BINOP_RSH); }
366 ;
367
368exp : exp EQUAL exp
369 { write_exp_elt_opcode (BINOP_EQUAL); }
370 ;
371
372exp : exp NOTEQUAL exp
373 { write_exp_elt_opcode (BINOP_NOTEQUAL); }
374 ;
375
376exp : exp LEQ exp
377 { write_exp_elt_opcode (BINOP_LEQ); }
378 ;
379
380exp : exp GEQ exp
381 { write_exp_elt_opcode (BINOP_GEQ); }
382 ;
383
384exp : exp '<' exp
385 { write_exp_elt_opcode (BINOP_LESS); }
386 ;
387
388exp : exp '>' exp
389 { write_exp_elt_opcode (BINOP_GTR); }
390 ;
391
392exp : exp '&' exp
393 { write_exp_elt_opcode (BINOP_LOGAND); }
394 ;
395
396exp : exp '^' exp
397 { write_exp_elt_opcode (BINOP_LOGXOR); }
398 ;
399
400exp : exp '|' exp
401 { write_exp_elt_opcode (BINOP_LOGIOR); }
402 ;
403
404exp : exp AND exp
405 { write_exp_elt_opcode (BINOP_AND); }
406 ;
407
408exp : exp OR exp
409 { write_exp_elt_opcode (BINOP_OR); }
410 ;
411
412exp : exp '?' exp ':' exp %prec '?'
413 { write_exp_elt_opcode (TERNOP_COND); }
414 ;
415
416exp : exp '=' exp
417 { write_exp_elt_opcode (BINOP_ASSIGN); }
418 ;
419
420exp : exp ASSIGN_MODIFY exp
421 { write_exp_elt_opcode (BINOP_ASSIGN_MODIFY);
422 write_exp_elt_opcode ($2);
423 write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); }
424 ;
425
426exp : INT
427 { write_exp_elt_opcode (OP_LONG);
428 if ($1 == (int) $1 || $1 == (unsigned int) $1)
429 write_exp_elt_type (builtin_type_int);
430 else
431 write_exp_elt_type (BUILTIN_TYPE_LONGEST);
432 write_exp_elt_longcst ((LONGEST) $1);
433 write_exp_elt_opcode (OP_LONG); }
434 ;
435
436exp : NAME_OR_INT
437 { YYSTYPE val;
438 parse_number ($1.stoken.ptr, $1.stoken.length, 0, &val);
439 write_exp_elt_opcode (OP_LONG);
440 if (val.lval == (int) val.lval ||
441 val.lval == (unsigned int) val.lval)
442 write_exp_elt_type (builtin_type_int);
443 else
444 write_exp_elt_type (BUILTIN_TYPE_LONGEST);
445 write_exp_elt_longcst (val.lval);
446 write_exp_elt_opcode (OP_LONG); }
447 ;
448
449exp : UINT
450 {
451 write_exp_elt_opcode (OP_LONG);
452 if ($1 == (unsigned int) $1)
453 write_exp_elt_type (builtin_type_unsigned_int);
454 else
455 write_exp_elt_type (BUILTIN_TYPE_UNSIGNED_LONGEST);
456 write_exp_elt_longcst ((LONGEST) $1);
457 write_exp_elt_opcode (OP_LONG);
458 }
459 ;
460
461exp : NAME_OR_UINT
462 { YYSTYPE val;
463 parse_number ($1.stoken.ptr, $1.stoken.length, 0, &val);
464 write_exp_elt_opcode (OP_LONG);
465 if (val.ulval == (unsigned int) val.ulval)
466 write_exp_elt_type (builtin_type_unsigned_int);
467 else
468 write_exp_elt_type (BUILTIN_TYPE_UNSIGNED_LONGEST);
469 write_exp_elt_longcst ((LONGEST)val.ulval);
470 write_exp_elt_opcode (OP_LONG);
471 }
472 ;
473
474exp : CHAR
475 { write_exp_elt_opcode (OP_LONG);
476 write_exp_elt_type (builtin_type_char);
477 write_exp_elt_longcst ((LONGEST) $1);
478 write_exp_elt_opcode (OP_LONG); }
479 ;
480
481exp : FLOAT
482 { write_exp_elt_opcode (OP_DOUBLE);
483 write_exp_elt_type (builtin_type_double);
484 write_exp_elt_dblcst ($1);
485 write_exp_elt_opcode (OP_DOUBLE); }
486 ;
487
488exp : variable
489 ;
490
491exp : LAST
492 { write_exp_elt_opcode (OP_LAST);
493 write_exp_elt_longcst ((LONGEST) $1);
494 write_exp_elt_opcode (OP_LAST); }
495 ;
496
497exp : REGNAME
498 { write_exp_elt_opcode (OP_REGISTER);
499 write_exp_elt_longcst ((LONGEST) $1);
500 write_exp_elt_opcode (OP_REGISTER); }
501 ;
502
503exp : VARIABLE
504 { write_exp_elt_opcode (OP_INTERNALVAR);
505 write_exp_elt_intern ($1);
506 write_exp_elt_opcode (OP_INTERNALVAR); }
507 ;
508
509exp : SIZEOF '(' type ')' %prec UNARY
510 { write_exp_elt_opcode (OP_LONG);
511 write_exp_elt_type (builtin_type_int);
512 write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3));
513 write_exp_elt_opcode (OP_LONG); }
514 ;
515
516exp : STRING
517 { write_exp_elt_opcode (OP_STRING);
518 write_exp_string ($1);
519 write_exp_elt_opcode (OP_STRING); }
520 ;
521
522/* C++. */
523exp : THIS
524 { write_exp_elt_opcode (OP_THIS);
525 write_exp_elt_opcode (OP_THIS); }
526 ;
527
528/* end of C++. */
529
530block : BLOCKNAME
531 {
532 if ($1.sym != 0)
533 $$ = SYMBOL_BLOCK_VALUE ($1.sym);
534 else
535 {
536 struct symtab *tem =
537 lookup_symtab (copy_name ($1.stoken));
538 if (tem)
92a29b47
JG
539 $$ = BLOCKVECTOR_BLOCK
540 (BLOCKVECTOR (tem), STATIC_BLOCK);
dd3b648e
RP
541 else
542 error ("No file or function \"%s\".",
543 copy_name ($1.stoken));
544 }
545 }
546 ;
547
548block : block COLONCOLON name
549 { struct symbol *tem
550 = lookup_symbol (copy_name ($3), $1,
551 VAR_NAMESPACE, 0, NULL);
552 if (!tem || SYMBOL_CLASS (tem) != LOC_BLOCK)
553 error ("No function \"%s\" in specified context.",
554 copy_name ($3));
555 $$ = SYMBOL_BLOCK_VALUE (tem); }
556 ;
557
558variable: block COLONCOLON name
559 { struct symbol *sym;
560 sym = lookup_symbol (copy_name ($3), $1,
561 VAR_NAMESPACE, 0, NULL);
562 if (sym == 0)
563 error ("No symbol \"%s\" in specified context.",
564 copy_name ($3));
565 write_exp_elt_opcode (OP_VAR_VALUE);
566 write_exp_elt_sym (sym);
567 write_exp_elt_opcode (OP_VAR_VALUE); }
568 ;
569
570variable: typebase COLONCOLON name
571 {
572 struct type *type = $1;
573 if (TYPE_CODE (type) != TYPE_CODE_STRUCT
574 && TYPE_CODE (type) != TYPE_CODE_UNION)
575 error ("`%s' is not defined as an aggregate type.",
576 TYPE_NAME (type));
577
578 write_exp_elt_opcode (OP_SCOPE);
579 write_exp_elt_type (type);
580 write_exp_string ($3);
581 write_exp_elt_opcode (OP_SCOPE);
582 }
5cced184
JK
583 | typebase COLONCOLON '~' name
584 {
585 struct type *type = $1;
586 if (TYPE_CODE (type) != TYPE_CODE_STRUCT
587 && TYPE_CODE (type) != TYPE_CODE_UNION)
588 error ("`%s' is not defined as an aggregate type.",
589 TYPE_NAME (type));
590
591 if (strcmp (type_name_no_tag (type), $4.ptr))
592 error ("invalid destructor `%s::~%s'",
593 type_name_no_tag (type), $4.ptr);
594
595 write_exp_elt_opcode (OP_SCOPE);
596 write_exp_elt_type (type);
597 write_exp_string ($4);
598 write_exp_elt_opcode (OP_SCOPE);
599 write_exp_elt_opcode (UNOP_LOGNOT);
600 }
dd3b648e
RP
601 | COLONCOLON name
602 {
603 char *name = copy_name ($2);
604 struct symbol *sym;
605 int i;
606
607 sym =
608 lookup_symbol (name, 0, VAR_NAMESPACE, 0, NULL);
609 if (sym)
610 {
611 write_exp_elt_opcode (OP_VAR_VALUE);
612 write_exp_elt_sym (sym);
613 write_exp_elt_opcode (OP_VAR_VALUE);
614 break;
615 }
616 for (i = 0; i < misc_function_count; i++)
617 if (!strcmp (misc_function_vector[i].name, name))
618 break;
619
620 if (i < misc_function_count)
621 {
622 enum misc_function_type mft =
623 misc_function_vector[i].type;
624
625 write_exp_elt_opcode (OP_LONG);
626 write_exp_elt_type (builtin_type_int);
627 write_exp_elt_longcst ((LONGEST) misc_function_vector[i].address);
628 write_exp_elt_opcode (OP_LONG);
629 write_exp_elt_opcode (UNOP_MEMVAL);
630 if (mft == mf_data || mft == mf_bss)
631 write_exp_elt_type (builtin_type_int);
632 else if (mft == mf_text)
633 write_exp_elt_type (lookup_function_type (builtin_type_int));
634 else
635 write_exp_elt_type (builtin_type_char);
636 write_exp_elt_opcode (UNOP_MEMVAL);
637 }
638 else
639 if (symtab_list == 0
640 && partial_symtab_list == 0)
641 error ("No symbol table is loaded. Use the \"file\" command.");
642 else
643 error ("No symbol \"%s\" in current context.", name);
644 }
645 ;
646
647variable: name_not_typename
648 { struct symbol *sym = $1.sym;
649
650 if (sym)
651 {
652 switch (sym->class)
653 {
654 case LOC_REGISTER:
655 case LOC_ARG:
e1ce8aa5
JK
656 case LOC_REF_ARG:
657 case LOC_REGPARM:
dd3b648e
RP
658 case LOC_LOCAL:
659 case LOC_LOCAL_ARG:
660 if (innermost_block == 0 ||
661 contained_in (block_found,
662 innermost_block))
663 innermost_block = block_found;
e1ce8aa5
JK
664 case LOC_UNDEF:
665 case LOC_CONST:
666 case LOC_STATIC:
667 case LOC_TYPEDEF:
668 case LOC_LABEL:
669 case LOC_BLOCK:
e1ce8aa5
JK
670 case LOC_CONST_BYTES:
671
672 /* In this case the expression can
673 be evaluated regardless of what
674 frame we are in, so there is no
675 need to check for the
676 innermost_block. These cases are
677 listed so that gcc -Wall will
678 report types that may not have
679 been considered. */
680
681 break;
dd3b648e
RP
682 }
683 write_exp_elt_opcode (OP_VAR_VALUE);
684 write_exp_elt_sym (sym);
685 write_exp_elt_opcode (OP_VAR_VALUE);
686 }
687 else if ($1.is_a_field_of_this)
688 {
689 /* C++: it hangs off of `this'. Must
690 not inadvertently convert from a method call
691 to data ref. */
692 if (innermost_block == 0 ||
693 contained_in (block_found, innermost_block))
694 innermost_block = block_found;
695 write_exp_elt_opcode (OP_THIS);
696 write_exp_elt_opcode (OP_THIS);
697 write_exp_elt_opcode (STRUCTOP_PTR);
698 write_exp_string ($1.stoken);
699 write_exp_elt_opcode (STRUCTOP_PTR);
700 }
701 else
702 {
703 register int i;
704 register char *arg = copy_name ($1.stoken);
705
706 /* FIXME, this search is linear! At least
707 optimize the strcmp with a 1-char cmp... */
708 for (i = 0; i < misc_function_count; i++)
709 if (!strcmp (misc_function_vector[i].name, arg))
710 break;
711
712 if (i < misc_function_count)
713 {
714 enum misc_function_type mft =
715 misc_function_vector[i].type;
716
717 write_exp_elt_opcode (OP_LONG);
718 write_exp_elt_type (builtin_type_int);
719 write_exp_elt_longcst ((LONGEST) misc_function_vector[i].address);
720 write_exp_elt_opcode (OP_LONG);
721 write_exp_elt_opcode (UNOP_MEMVAL);
722 if (mft == mf_data || mft == mf_bss)
723 write_exp_elt_type (builtin_type_int);
724 else if (mft == mf_text)
725 write_exp_elt_type (lookup_function_type (builtin_type_int));
726 else
727 write_exp_elt_type (builtin_type_char);
728 write_exp_elt_opcode (UNOP_MEMVAL);
729 }
730 else if (symtab_list == 0
731 && partial_symtab_list == 0)
732 error ("No symbol table is loaded. Use the \"file\" command.");
733 else
734 error ("No symbol \"%s\" in current context.",
735 copy_name ($1.stoken));
736 }
737 }
738 ;
739
740
741ptype : typebase
742 | typebase abs_decl
743 {
744 /* This is where the interesting stuff happens. */
745 int done = 0;
746 int array_size;
747 struct type *follow_type = $1;
748
749 while (!done)
750 switch (pop_type ())
751 {
752 case tp_end:
753 done = 1;
754 break;
755 case tp_pointer:
756 follow_type = lookup_pointer_type (follow_type);
757 break;
758 case tp_reference:
759 follow_type = lookup_reference_type (follow_type);
760 break;
761 case tp_array:
e1ce8aa5 762 array_size = pop_type_int ();
dd3b648e
RP
763 if (array_size != -1)
764 follow_type = create_array_type (follow_type,
765 array_size);
766 else
767 follow_type = lookup_pointer_type (follow_type);
768 break;
769 case tp_function:
770 follow_type = lookup_function_type (follow_type);
771 break;
772 }
773 $$ = follow_type;
774 }
775 ;
776
777abs_decl: '*'
778 { push_type (tp_pointer); $$ = 0; }
779 | '*' abs_decl
780 { push_type (tp_pointer); $$ = $2; }
5cced184
JK
781 | '&'
782 { push_type (tp_reference); $$ = 0; }
783 | '&' abs_decl
784 { push_type (tp_reference); $$ = $2; }
dd3b648e
RP
785 | direct_abs_decl
786 ;
787
788direct_abs_decl: '(' abs_decl ')'
789 { $$ = $2; }
790 | direct_abs_decl array_mod
791 {
e1ce8aa5 792 push_type_int ($2);
dd3b648e
RP
793 push_type (tp_array);
794 }
795 | array_mod
796 {
e1ce8aa5 797 push_type_int ($1);
dd3b648e
RP
798 push_type (tp_array);
799 $$ = 0;
800 }
801 | direct_abs_decl func_mod
802 { push_type (tp_function); }
803 | func_mod
804 { push_type (tp_function); }
805 ;
806
807array_mod: '[' ']'
808 { $$ = -1; }
809 | '[' INT ']'
810 { $$ = $2; }
811 ;
812
813func_mod: '(' ')'
814 { $$ = 0; }
815 ;
816
817type : ptype
818 | typebase COLONCOLON '*'
819 { $$ = lookup_member_type (builtin_type_int, $1); }
820 | type '(' typebase COLONCOLON '*' ')'
821 { $$ = lookup_member_type ($1, $3); }
822 | type '(' typebase COLONCOLON '*' ')' '(' ')'
823 { $$ = lookup_member_type
824 (lookup_function_type ($1), $3); }
825 | type '(' typebase COLONCOLON '*' ')' '(' nonempty_typelist ')'
826 { $$ = lookup_member_type
827 (lookup_function_type ($1), $3);
828 free ($8); }
829 ;
830
831typebase
832 : TYPENAME
833 { $$ = $1.type; }
834 | INT_KEYWORD
835 { $$ = builtin_type_int; }
836 | LONG
837 { $$ = builtin_type_long; }
838 | SHORT
839 { $$ = builtin_type_short; }
840 | LONG INT_KEYWORD
841 { $$ = builtin_type_long; }
842 | UNSIGNED LONG INT_KEYWORD
843 { $$ = builtin_type_unsigned_long; }
5cced184
JK
844 | LONG LONG
845 { $$ = builtin_type_long_long; }
846 | LONG LONG INT_KEYWORD
847 { $$ = builtin_type_long_long; }
848 | UNSIGNED LONG LONG
849 { $$ = builtin_type_unsigned_long_long; }
850 | UNSIGNED LONG LONG INT_KEYWORD
851 { $$ = builtin_type_unsigned_long_long; }
dd3b648e
RP
852 | SHORT INT_KEYWORD
853 { $$ = builtin_type_short; }
854 | UNSIGNED SHORT INT_KEYWORD
855 { $$ = builtin_type_unsigned_short; }
856 | STRUCT name
857 { $$ = lookup_struct (copy_name ($2),
858 expression_context_block); }
859 | UNION name
860 { $$ = lookup_union (copy_name ($2),
861 expression_context_block); }
862 | ENUM name
863 { $$ = lookup_enum (copy_name ($2),
864 expression_context_block); }
865 | UNSIGNED typename
866 { $$ = lookup_unsigned_typename (TYPE_NAME($2.type)); }
867 | UNSIGNED
868 { $$ = builtin_type_unsigned_int; }
869 | SIGNED typename
870 { $$ = $2.type; }
871 | SIGNED
872 { $$ = builtin_type_int; }
873 ;
874
875typename: TYPENAME
876 | INT_KEYWORD
877 {
878 $$.stoken.ptr = "int";
879 $$.stoken.length = 3;
880 $$.type = builtin_type_int;
881 }
882 | LONG
883 {
884 $$.stoken.ptr = "long";
885 $$.stoken.length = 4;
886 $$.type = builtin_type_long;
887 }
888 | SHORT
889 {
890 $$.stoken.ptr = "short";
891 $$.stoken.length = 5;
892 $$.type = builtin_type_short;
893 }
894 ;
895
896nonempty_typelist
897 : type
898 { $$ = (struct type **)xmalloc (sizeof (struct type *) * 2);
899 $$[0] = (struct type *)0;
900 $$[1] = $1;
901 }
902 | nonempty_typelist ',' type
903 { int len = sizeof (struct type *) * ++($<ivec>1[0]);
904 $$ = (struct type **)xrealloc ($1, len);
905 $$[$<ivec>$[0]] = $3;
906 }
907 ;
908
909name : NAME { $$ = $1.stoken; }
910 | BLOCKNAME { $$ = $1.stoken; }
911 | TYPENAME { $$ = $1.stoken; }
912 | NAME_OR_INT { $$ = $1.stoken; }
913 | NAME_OR_UINT { $$ = $1.stoken; }
914 ;
915
916name_not_typename : NAME
917 | BLOCKNAME
3f2e006b
JG
918/* These would be useful if name_not_typename was useful, but it is just
919 a fake for "variable", so these cause reduce/reduce conflicts because
920 the parser can't tell whether NAME_OR_INT is a name_not_typename (=variable,
921 =exp) or just an exp. If name_not_typename was ever used in an lvalue
922 context where only a name could occur, this might be useful.
923 | NAME_OR_INT
924 | NAME_OR_UINT
925 */
dd3b648e
RP
926 ;
927
928%%
929\f
930/* Begin counting arguments for a function call,
931 saving the data about any containing call. */
932
933static void
934start_arglist ()
935{
936 register struct funcall *new = (struct funcall *) xmalloc (sizeof (struct funcall));
937
938 new->next = funcall_chain;
939 new->arglist_len = arglist_len;
940 arglist_len = 0;
941 funcall_chain = new;
942}
943
944/* Return the number of arguments in a function call just terminated,
945 and restore the data for the containing function call. */
946
947static int
948end_arglist ()
949{
950 register int val = arglist_len;
951 register struct funcall *call = funcall_chain;
952 funcall_chain = call->next;
953 arglist_len = call->arglist_len;
954 free (call);
955 return val;
956}
957
958/* Free everything in the funcall chain.
959 Used when there is an error inside parsing. */
960
961static void
962free_funcalls ()
963{
964 register struct funcall *call, *next;
965
966 for (call = funcall_chain; call; call = next)
967 {
968 next = call->next;
969 free (call);
970 }
971}
972\f
973/* This page contains the functions for adding data to the struct expression
974 being constructed. */
975
976/* Add one element to the end of the expression. */
977
978/* To avoid a bug in the Sun 4 compiler, we pass things that can fit into
979 a register through here */
980
981static void
982write_exp_elt (expelt)
983 union exp_element expelt;
984{
985 if (expout_ptr >= expout_size)
986 {
987 expout_size *= 2;
988 expout = (struct expression *) xrealloc (expout,
989 sizeof (struct expression)
990 + expout_size * sizeof (union exp_element));
991 }
992 expout->elts[expout_ptr++] = expelt;
993}
994
995static void
996write_exp_elt_opcode (expelt)
997 enum exp_opcode expelt;
998{
999 union exp_element tmp;
1000
1001 tmp.opcode = expelt;
1002
1003 write_exp_elt (tmp);
1004}
1005
1006static void
1007write_exp_elt_sym (expelt)
1008 struct symbol *expelt;
1009{
1010 union exp_element tmp;
1011
1012 tmp.symbol = expelt;
1013
1014 write_exp_elt (tmp);
1015}
1016
1017static void
1018write_exp_elt_longcst (expelt)
1019 LONGEST expelt;
1020{
1021 union exp_element tmp;
1022
1023 tmp.longconst = expelt;
1024
1025 write_exp_elt (tmp);
1026}
1027
1028static void
1029write_exp_elt_dblcst (expelt)
1030 double expelt;
1031{
1032 union exp_element tmp;
1033
1034 tmp.doubleconst = expelt;
1035
1036 write_exp_elt (tmp);
1037}
1038
1039static void
1040write_exp_elt_type (expelt)
1041 struct type *expelt;
1042{
1043 union exp_element tmp;
1044
1045 tmp.type = expelt;
1046
1047 write_exp_elt (tmp);
1048}
1049
1050static void
1051write_exp_elt_intern (expelt)
1052 struct internalvar *expelt;
1053{
1054 union exp_element tmp;
1055
1056 tmp.internalvar = expelt;
1057
1058 write_exp_elt (tmp);
1059}
1060
1061/* Add a string constant to the end of the expression.
1062 Follow it by its length in bytes, as a separate exp_element. */
1063
1064static void
1065write_exp_string (str)
1066 struct stoken str;
1067{
1068 register int len = str.length;
1069 register int lenelt
1070 = (len + sizeof (union exp_element)) / sizeof (union exp_element);
1071
1072 expout_ptr += lenelt;
1073
1074 if (expout_ptr >= expout_size)
1075 {
1076 expout_size = max (expout_size * 2, expout_ptr + 10);
1077 expout = (struct expression *)
1078 xrealloc (expout, (sizeof (struct expression)
1079 + (expout_size * sizeof (union exp_element))));
1080 }
1081 bcopy (str.ptr, (char *) &expout->elts[expout_ptr - lenelt], len);
1082 ((char *) &expout->elts[expout_ptr - lenelt])[len] = 0;
1083 write_exp_elt_longcst ((LONGEST) len);
1084}
1085\f
1086/* During parsing of a C expression, the pointer to the next character
1087 is in this variable. */
1088
1089static char *lexptr;
1090
1091/* Tokens that refer to names do so with explicit pointer and length,
1092 so they can share the storage that lexptr is parsing.
1093
1094 When it is necessary to pass a name to a function that expects
1095 a null-terminated string, the substring is copied out
1096 into a block of storage that namecopy points to.
1097
1098 namecopy is allocated once, guaranteed big enough, for each parsing. */
1099
1100static char *namecopy;
1101
1102/* Current depth in parentheses within the expression. */
1103
1104static int paren_depth;
1105
1106/* Nonzero means stop parsing on first comma (if not within parentheses). */
1107
1108static int comma_terminates;
1109
1110/* Take care of parsing a number (anything that starts with a digit).
1111 Set yylval and return the token type; update lexptr.
1112 LEN is the number of characters in it. */
1113
1114/*** Needs some error checking for the float case ***/
1115
1116static int
1117parse_number (p, len, parsed_float, putithere)
1118 register char *p;
1119 register int len;
1120 int parsed_float;
1121 YYSTYPE *putithere;
1122{
1123 register LONGEST n = 0;
1124 register int i;
1125 register int c;
1126 register int base = input_radix;
1127 int unsigned_p = 0;
1128
1129 extern double atof ();
1130
1131 if (parsed_float)
1132 {
1133 /* It's a float since it contains a point or an exponent. */
1134 putithere->dval = atof (p);
1135 return FLOAT;
1136 }
1137
1138 /* Handle base-switching prefixes 0x, 0t, 0d, 0 */
1139 if (p[0] == '0')
1140 switch (p[1])
1141 {
1142 case 'x':
1143 case 'X':
1144 if (len >= 3)
1145 {
1146 p += 2;
1147 base = 16;
1148 len -= 2;
1149 }
1150 break;
1151
1152 case 't':
1153 case 'T':
1154 case 'd':
1155 case 'D':
1156 if (len >= 3)
1157 {
1158 p += 2;
1159 base = 10;
1160 len -= 2;
1161 }
1162 break;
1163
1164 default:
1165 base = 8;
1166 break;
1167 }
1168
1169 while (len-- > 0)
1170 {
1171 c = *p++;
1172 if (c >= 'A' && c <= 'Z')
1173 c += 'a' - 'A';
1174 if (c != 'l' && c != 'u')
1175 n *= base;
1176 if (c >= '0' && c <= '9')
1177 n += i = c - '0';
1178 else
1179 {
1180 if (base > 10 && c >= 'a' && c <= 'f')
1181 n += i = c - 'a' + 10;
1182 else if (len == 0 && c == 'l')
1183 ;
1184 else if (len == 0 && c == 'u')
1185 unsigned_p = 1;
1186 else
1187 return ERROR; /* Char not a digit */
1188 }
1189 if (i >= base)
1190 return ERROR; /* Invalid digit in this base */
1191 }
1192
1193 if (unsigned_p)
1194 {
1195 putithere->ulval = n;
1196 return UINT;
1197 }
1198 else
1199 {
1200 putithere->lval = n;
1201 return INT;
1202 }
1203}
1204
1205struct token
1206{
1207 char *operator;
1208 int token;
1209 enum exp_opcode opcode;
1210};
1211
5cced184 1212const static struct token tokentab3[] =
dd3b648e
RP
1213 {
1214 {">>=", ASSIGN_MODIFY, BINOP_RSH},
1215 {"<<=", ASSIGN_MODIFY, BINOP_LSH}
1216 };
1217
5cced184 1218const static struct token tokentab2[] =
dd3b648e
RP
1219 {
1220 {"+=", ASSIGN_MODIFY, BINOP_ADD},
1221 {"-=", ASSIGN_MODIFY, BINOP_SUB},
1222 {"*=", ASSIGN_MODIFY, BINOP_MUL},
1223 {"/=", ASSIGN_MODIFY, BINOP_DIV},
1224 {"%=", ASSIGN_MODIFY, BINOP_REM},
1225 {"|=", ASSIGN_MODIFY, BINOP_LOGIOR},
1226 {"&=", ASSIGN_MODIFY, BINOP_LOGAND},
1227 {"^=", ASSIGN_MODIFY, BINOP_LOGXOR},
1228 {"++", INCREMENT, BINOP_END},
1229 {"--", DECREMENT, BINOP_END},
1230 {"->", ARROW, BINOP_END},
1231 {"&&", AND, BINOP_END},
1232 {"||", OR, BINOP_END},
1233 {"::", COLONCOLON, BINOP_END},
1234 {"<<", LSH, BINOP_END},
1235 {">>", RSH, BINOP_END},
1236 {"==", EQUAL, BINOP_END},
1237 {"!=", NOTEQUAL, BINOP_END},
1238 {"<=", LEQ, BINOP_END},
1239 {">=", GEQ, BINOP_END}
1240 };
1241
1242/* assign machine-independent names to certain registers
1243 * (unless overridden by the REGISTER_NAMES table)
1244 */
1245struct std_regs {
1246 char *name;
1247 int regnum;
1248} std_regs[] = {
1249#ifdef PC_REGNUM
1250 { "pc", PC_REGNUM },
1251#endif
1252#ifdef FP_REGNUM
1253 { "fp", FP_REGNUM },
1254#endif
1255#ifdef SP_REGNUM
1256 { "sp", SP_REGNUM },
1257#endif
1258#ifdef PS_REGNUM
1259 { "ps", PS_REGNUM },
1260#endif
1261};
1262
1263#define NUM_STD_REGS (sizeof std_regs / sizeof std_regs[0])
1264
1265/* Read one token, getting characters through lexptr. */
1266
1267static int
1268yylex ()
1269{
1270 register int c;
1271 register int namelen;
1272 register unsigned i;
1273 register char *tokstart;
1274
1275 retry:
1276
1277 tokstart = lexptr;
1278 /* See if it is a special token of length 3. */
1279 for (i = 0; i < sizeof tokentab3 / sizeof tokentab3[0]; i++)
1280 if (!strncmp (tokstart, tokentab3[i].operator, 3))
1281 {
1282 lexptr += 3;
1283 yylval.opcode = tokentab3[i].opcode;
1284 return tokentab3[i].token;
1285 }
1286
1287 /* See if it is a special token of length 2. */
1288 for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++)
1289 if (!strncmp (tokstart, tokentab2[i].operator, 2))
1290 {
1291 lexptr += 2;
1292 yylval.opcode = tokentab2[i].opcode;
1293 return tokentab2[i].token;
1294 }
1295
1296 switch (c = *tokstart)
1297 {
1298 case 0:
1299 return 0;
1300
1301 case ' ':
1302 case '\t':
1303 case '\n':
1304 lexptr++;
1305 goto retry;
1306
1307 case '\'':
1308 lexptr++;
1309 c = *lexptr++;
1310 if (c == '\\')
1311 c = parse_escape (&lexptr);
1312 yylval.lval = c;
1313 c = *lexptr++;
1314 if (c != '\'')
1315 error ("Invalid character constant.");
1316 return CHAR;
1317
1318 case '(':
1319 paren_depth++;
1320 lexptr++;
1321 return c;
1322
1323 case ')':
1324 if (paren_depth == 0)
1325 return 0;
1326 paren_depth--;
1327 lexptr++;
1328 return c;
1329
1330 case ',':
1331 if (comma_terminates && paren_depth == 0)
1332 return 0;
1333 lexptr++;
1334 return c;
1335
1336 case '.':
1337 /* Might be a floating point number. */
1338 if (lexptr[1] < '0' || lexptr[1] > '9')
1339 goto symbol; /* Nope, must be a symbol. */
1340 /* FALL THRU into number case. */
1341
1342 case '0':
1343 case '1':
1344 case '2':
1345 case '3':
1346 case '4':
1347 case '5':
1348 case '6':
1349 case '7':
1350 case '8':
1351 case '9':
1352 {
1353 /* It's a number. */
1354 int got_dot = 0, got_e = 0, toktype;
1355 register char *p = tokstart;
1356 int hex = input_radix > 10;
1357
1358 if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
1359 {
1360 p += 2;
1361 hex = 1;
1362 }
1363 else if (c == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D'))
1364 {
1365 p += 2;
1366 hex = 0;
1367 }
1368
1369 for (;; ++p)
1370 {
1371 if (!hex && !got_e && (*p == 'e' || *p == 'E'))
1372 got_dot = got_e = 1;
1373 else if (!hex && !got_dot && *p == '.')
1374 got_dot = 1;
1375 else if (got_e && (p[-1] == 'e' || p[-1] == 'E')
1376 && (*p == '-' || *p == '+'))
1377 /* This is the sign of the exponent, not the end of the
1378 number. */
1379 continue;
1380 /* We will take any letters or digits. parse_number will
1381 complain if past the radix, or if L or U are not final. */
1382 else if ((*p < '0' || *p > '9')
1383 && ((*p < 'a' || *p > 'z')
1384 && (*p < 'A' || *p > 'Z')))
1385 break;
1386 }
1387 toktype = parse_number (tokstart, p - tokstart, got_dot|got_e, &yylval);
1388 if (toktype == ERROR)
1389 {
1390 char *err_copy = (char *) alloca (p - tokstart + 1);
1391
1392 bcopy (tokstart, err_copy, p - tokstart);
1393 err_copy[p - tokstart] = 0;
1394 error ("Invalid number \"%s\".", err_copy);
1395 }
1396 lexptr = p;
1397 return toktype;
1398 }
1399
1400 case '+':
1401 case '-':
1402 case '*':
1403 case '/':
1404 case '%':
1405 case '|':
1406 case '&':
1407 case '^':
1408 case '~':
1409 case '!':
1410 case '@':
1411 case '<':
1412 case '>':
1413 case '[':
1414 case ']':
1415 case '?':
1416 case ':':
1417 case '=':
1418 case '{':
1419 case '}':
1420 symbol:
1421 lexptr++;
1422 return c;
1423
1424 case '"':
1425 for (namelen = 1; (c = tokstart[namelen]) != '"'; namelen++)
1426 if (c == '\\')
1427 {
1428 c = tokstart[++namelen];
1429 if (c >= '0' && c <= '9')
1430 {
1431 c = tokstart[++namelen];
1432 if (c >= '0' && c <= '9')
1433 c = tokstart[++namelen];
1434 }
1435 }
1436 yylval.sval.ptr = tokstart + 1;
1437 yylval.sval.length = namelen - 1;
1438 lexptr += namelen + 1;
1439 return STRING;
1440 }
1441
1442 if (!(c == '_' || c == '$'
1443 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
1444 /* We must have come across a bad character (e.g. ';'). */
1445 error ("Invalid character '%c' in expression.", c);
1446
1447 /* It's a name. See how long it is. */
1448 namelen = 0;
1449 for (c = tokstart[namelen];
1450 (c == '_' || c == '$' || (c >= '0' && c <= '9')
1451 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
1452 c = tokstart[++namelen])
1453 ;
1454
1455 /* The token "if" terminates the expression and is NOT
1456 removed from the input stream. */
1457 if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f')
1458 {
1459 return 0;
1460 }
1461
1462 lexptr += namelen;
1463
1464 /* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1)
1465 and $$digits (equivalent to $<-digits> if you could type that).
1466 Make token type LAST, and put the number (the digits) in yylval. */
1467
1468 if (*tokstart == '$')
1469 {
1470 register int negate = 0;
1471 c = 1;
1472 /* Double dollar means negate the number and add -1 as well.
1473 Thus $$ alone means -1. */
1474 if (namelen >= 2 && tokstart[1] == '$')
1475 {
1476 negate = 1;
1477 c = 2;
1478 }
1479 if (c == namelen)
1480 {
1481 /* Just dollars (one or two) */
1482 yylval.lval = - negate;
1483 return LAST;
1484 }
1485 /* Is the rest of the token digits? */
1486 for (; c < namelen; c++)
1487 if (!(tokstart[c] >= '0' && tokstart[c] <= '9'))
1488 break;
1489 if (c == namelen)
1490 {
1491 yylval.lval = atoi (tokstart + 1 + negate);
1492 if (negate)
1493 yylval.lval = - yylval.lval;
1494 return LAST;
1495 }
1496 }
1497
1498 /* Handle tokens that refer to machine registers:
1499 $ followed by a register name. */
1500
1501 if (*tokstart == '$') {
1502 for (c = 0; c < NUM_REGS; c++)
1503 if (namelen - 1 == strlen (reg_names[c])
1504 && !strncmp (tokstart + 1, reg_names[c], namelen - 1))
1505 {
1506 yylval.lval = c;
1507 return REGNAME;
1508 }
1509 for (c = 0; c < NUM_STD_REGS; c++)
1510 if (namelen - 1 == strlen (std_regs[c].name)
1511 && !strncmp (tokstart + 1, std_regs[c].name, namelen - 1))
1512 {
1513 yylval.lval = std_regs[c].regnum;
1514 return REGNAME;
1515 }
1516 }
1517 /* Catch specific keywords. Should be done with a data structure. */
1518 switch (namelen)
1519 {
1520 case 8:
1521 if (!strncmp (tokstart, "unsigned", 8))
1522 return UNSIGNED;
1523 break;
1524 case 6:
1525 if (!strncmp (tokstart, "struct", 6))
1526 return STRUCT;
1527 if (!strncmp (tokstart, "signed", 6))
1528 return SIGNED;
1529 if (!strncmp (tokstart, "sizeof", 6))
1530 return SIZEOF;
1531 break;
1532 case 5:
1533 if (!strncmp (tokstart, "union", 5))
1534 return UNION;
1535 if (!strncmp (tokstart, "short", 5))
1536 return SHORT;
1537 break;
1538 case 4:
1539 if (!strncmp (tokstart, "enum", 4))
1540 return ENUM;
1541 if (!strncmp (tokstart, "long", 4))
1542 return LONG;
1543 if (!strncmp (tokstart, "this", 4))
1544 {
1545 static const char this_name[] =
1546 { CPLUS_MARKER, 't', 'h', 'i', 's', '\0' };
1547
1548 if (lookup_symbol (this_name, expression_context_block,
1549 VAR_NAMESPACE, 0, NULL))
1550 return THIS;
1551 }
1552 break;
1553 case 3:
1554 if (!strncmp (tokstart, "int", 3))
1555 return INT_KEYWORD;
1556 break;
1557 default:
1558 break;
1559 }
1560
1561 yylval.sval.ptr = tokstart;
1562 yylval.sval.length = namelen;
1563
1564 /* Any other names starting in $ are debugger internal variables. */
1565
1566 if (*tokstart == '$')
1567 {
1568 yylval.ivar = lookup_internalvar (copy_name (yylval.sval) + 1);
1569 return VARIABLE;
1570 }
1571
1572 /* Use token-type BLOCKNAME for symbols that happen to be defined as
1573 functions or symtabs. If this is not so, then ...
1574 Use token-type TYPENAME for symbols that happen to be defined
1575 currently as names of types; NAME for other symbols.
1576 The caller is not constrained to care about the distinction. */
1577 {
1578 char *tmp = copy_name (yylval.sval);
1579 struct symbol *sym;
1580 int is_a_field_of_this = 0;
1581 int hextype;
1582
1583 sym = lookup_symbol (tmp, expression_context_block,
1584 VAR_NAMESPACE, &is_a_field_of_this, NULL);
1585 if ((sym && SYMBOL_CLASS (sym) == LOC_BLOCK) ||
1586 lookup_partial_symtab (tmp))
1587 {
1588 yylval.ssym.sym = sym;
1589 yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1590 return BLOCKNAME;
1591 }
1592 if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
1593 {
1594 yylval.tsym.type = SYMBOL_TYPE (sym);
1595 return TYPENAME;
1596 }
1597 if ((yylval.tsym.type = lookup_primitive_typename (tmp)) != 0)
1598 return TYPENAME;
1599
1600 /* Input names that aren't symbols but ARE valid hex numbers,
1601 when the input radix permits them, can be names or numbers
1602 depending on the parse. Note we support radixes > 16 here. */
1603 if (!sym &&
1604 ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10) ||
1605 (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
1606 {
1607 YYSTYPE newlval; /* Its value is ignored. */
1608 hextype = parse_number (tokstart, namelen, 0, &newlval);
1609 if (hextype == INT)
1610 {
1611 yylval.ssym.sym = sym;
1612 yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1613 return NAME_OR_INT;
1614 }
1615 if (hextype == UINT)
1616 {
1617 yylval.ssym.sym = sym;
1618 yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1619 return NAME_OR_UINT;
1620 }
1621 }
1622
1623 /* Any other kind of symbol */
1624 yylval.ssym.sym = sym;
1625 yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1626 return NAME;
1627 }
1628}
1629
1e30f7e3 1630/* ARGSUSED */
dd3b648e
RP
1631static void
1632yyerror (msg)
1633 char *msg;
1634{
1635 error ("Invalid syntax in expression.");
1636}
1637
1638/* Return a null-terminated temporary copy of the name
1639 of a string token. */
1640
1641static char *
1642copy_name (token)
1643 struct stoken token;
1644{
1645 bcopy (token.ptr, namecopy, token.length);
1646 namecopy[token.length] = 0;
1647 return namecopy;
1648}
1649\f
1650/* Reverse an expression from suffix form (in which it is constructed)
1651 to prefix form (in which we can conveniently print or execute it). */
1652
1653static void prefixify_subexp ();
1654
1655static void
1656prefixify_expression (expr)
1657 register struct expression *expr;
1658{
1659 register int len = sizeof (struct expression) +
1660 expr->nelts * sizeof (union exp_element);
1661 register struct expression *temp;
1662 register int inpos = expr->nelts, outpos = 0;
1663
1664 temp = (struct expression *) alloca (len);
1665
1666 /* Copy the original expression into temp. */
1667 bcopy (expr, temp, len);
1668
1669 prefixify_subexp (temp, expr, inpos, outpos);
1670}
1671
1672/* Return the number of exp_elements in the subexpression of EXPR
1673 whose last exp_element is at index ENDPOS - 1 in EXPR. */
1674
1675static int
1676length_of_subexp (expr, endpos)
1677 register struct expression *expr;
1678 register int endpos;
1679{
1680 register int oplen = 1;
1681 register int args = 0;
1682 register int i;
1683
1684 if (endpos < 0)
1685 error ("?error in length_of_subexp");
1686
1687 i = (int) expr->elts[endpos - 1].opcode;
1688
1689 switch (i)
1690 {
1691 /* C++ */
1692 case OP_SCOPE:
1693 oplen = 4 + ((expr->elts[endpos - 2].longconst
1694 + sizeof (union exp_element))
1695 / sizeof (union exp_element));
1696 break;
1697
1698 case OP_LONG:
1699 case OP_DOUBLE:
1700 oplen = 4;
1701 break;
1702
1703 case OP_VAR_VALUE:
1704 case OP_LAST:
1705 case OP_REGISTER:
1706 case OP_INTERNALVAR:
1707 oplen = 3;
1708 break;
1709
1710 case OP_FUNCALL:
1711 oplen = 3;
1712 args = 1 + expr->elts[endpos - 2].longconst;
1713 break;
1714
1715 case UNOP_CAST:
1716 case UNOP_MEMVAL:
1717 oplen = 3;
1718 args = 1;
1719 break;
1720
1721 case STRUCTOP_STRUCT:
1722 case STRUCTOP_PTR:
1723 args = 1;
1724 case OP_STRING:
1725 oplen = 3 + ((expr->elts[endpos - 2].longconst
1726 + sizeof (union exp_element))
1727 / sizeof (union exp_element));
1728 break;
1729
1730 case TERNOP_COND:
1731 args = 3;
1732 break;
1733
1734 case BINOP_ASSIGN_MODIFY:
1735 oplen = 3;
1736 args = 2;
1737 break;
1738
1739 /* C++ */
1740 case OP_THIS:
1741 oplen = 2;
1742 break;
1743
1744 default:
1745 args = 1 + (i < (int) BINOP_END);
1746 }
1747
1748 while (args > 0)
1749 {
1750 oplen += length_of_subexp (expr, endpos - oplen);
1751 args--;
1752 }
1753
1754 return oplen;
1755}
1756
1757/* Copy the subexpression ending just before index INEND in INEXPR
1758 into OUTEXPR, starting at index OUTBEG.
1759 In the process, convert it from suffix to prefix form. */
1760
1761static void
1762prefixify_subexp (inexpr, outexpr, inend, outbeg)
1763 register struct expression *inexpr;
1764 struct expression *outexpr;
1765 register int inend;
1766 int outbeg;
1767{
1768 register int oplen = 1;
1769 register int args = 0;
1770 register int i;
1771 int *arglens;
1772 enum exp_opcode opcode;
1773
1774 /* Compute how long the last operation is (in OPLEN),
1775 and also how many preceding subexpressions serve as
1776 arguments for it (in ARGS). */
1777
1778 opcode = inexpr->elts[inend - 1].opcode;
1779 switch (opcode)
1780 {
1781 /* C++ */
1782 case OP_SCOPE:
1783 oplen = 4 + ((inexpr->elts[inend - 2].longconst
1784 + sizeof (union exp_element))
1785 / sizeof (union exp_element));
1786 break;
1787
1788 case OP_LONG:
1789 case OP_DOUBLE:
1790 oplen = 4;
1791 break;
1792
1793 case OP_VAR_VALUE:
1794 case OP_LAST:
1795 case OP_REGISTER:
1796 case OP_INTERNALVAR:
1797 oplen = 3;
1798 break;
1799
1800 case OP_FUNCALL:
1801 oplen = 3;
1802 args = 1 + inexpr->elts[inend - 2].longconst;
1803 break;
1804
1805 case UNOP_CAST:
1806 case UNOP_MEMVAL:
1807 oplen = 3;
1808 args = 1;
1809 break;
1810
1811 case STRUCTOP_STRUCT:
1812 case STRUCTOP_PTR:
1813 args = 1;
1814 case OP_STRING:
1815 oplen = 3 + ((inexpr->elts[inend - 2].longconst
1816 + sizeof (union exp_element))
1817 / sizeof (union exp_element));
1818
1819 break;
1820
1821 case TERNOP_COND:
1822 args = 3;
1823 break;
1824
1825 case BINOP_ASSIGN_MODIFY:
1826 oplen = 3;
1827 args = 2;
1828 break;
1829
1830 /* C++ */
1831 case OP_THIS:
1832 oplen = 2;
1833 break;
1834
1835 default:
1836 args = 1 + ((int) opcode < (int) BINOP_END);
1837 }
1838
1839 /* Copy the final operator itself, from the end of the input
1840 to the beginning of the output. */
1841 inend -= oplen;
1842 bcopy (&inexpr->elts[inend], &outexpr->elts[outbeg],
1843 oplen * sizeof (union exp_element));
1844 outbeg += oplen;
1845
1846 /* Find the lengths of the arg subexpressions. */
1847 arglens = (int *) alloca (args * sizeof (int));
1848 for (i = args - 1; i >= 0; i--)
1849 {
1850 oplen = length_of_subexp (inexpr, inend);
1851 arglens[i] = oplen;
1852 inend -= oplen;
1853 }
1854
1855 /* Now copy each subexpression, preserving the order of
1856 the subexpressions, but prefixifying each one.
1857 In this loop, inend starts at the beginning of
1858 the expression this level is working on
1859 and marches forward over the arguments.
1860 outbeg does similarly in the output. */
1861 for (i = 0; i < args; i++)
1862 {
1863 oplen = arglens[i];
1864 inend += oplen;
1865 prefixify_subexp (inexpr, outexpr, inend, outbeg);
1866 outbeg += oplen;
1867 }
1868}
1869\f
1870/* This page contains the two entry points to this file. */
1871
1872/* Read a C expression from the string *STRINGPTR points to,
1873 parse it, and return a pointer to a struct expression that we malloc.
1874 Use block BLOCK as the lexical context for variable names;
1875 if BLOCK is zero, use the block of the selected stack frame.
1876 Meanwhile, advance *STRINGPTR to point after the expression,
1877 at the first nonwhite character that is not part of the expression
1878 (possibly a null character).
1879
1880 If COMMA is nonzero, stop if a comma is reached. */
1881
1882struct expression *
1883parse_c_1 (stringptr, block, comma)
1884 char **stringptr;
1885 struct block *block;
1886 int comma;
1887{
1888 struct cleanup *old_chain;
1889
1890 lexptr = *stringptr;
1891
1892 paren_depth = 0;
1893 type_stack_depth = 0;
1894
1895 comma_terminates = comma;
1896
1897 if (lexptr == 0 || *lexptr == 0)
1898 error_no_arg ("expression to compute");
1899
1900 old_chain = make_cleanup (free_funcalls, 0);
1901 funcall_chain = 0;
1902
1903 expression_context_block = block ? block : get_selected_block ();
1904
1905 namecopy = (char *) alloca (strlen (lexptr) + 1);
1906 expout_size = 10;
1907 expout_ptr = 0;
1908 expout = (struct expression *)
1909 xmalloc (sizeof (struct expression)
1910 + expout_size * sizeof (union exp_element));
1911 make_cleanup (free_current_contents, &expout);
1912 if (yyparse ())
1913 yyerror (NULL);
1914 discard_cleanups (old_chain);
1915 expout->nelts = expout_ptr;
1916 expout = (struct expression *)
1917 xrealloc (expout,
1918 sizeof (struct expression)
1919 + expout_ptr * sizeof (union exp_element));
1920 prefixify_expression (expout);
1921 *stringptr = lexptr;
1922 return expout;
1923}
1924
1925/* Parse STRING as an expression, and complain if this fails
1926 to use up all of the contents of STRING. */
1927
1928struct expression *
1929parse_c_expression (string)
1930 char *string;
1931{
1932 register struct expression *exp;
1933 exp = parse_c_1 (&string, 0, 0);
1934 if (*string)
1935 error ("Junk after end of expression.");
1936 return exp;
1937}
1938
1939static void
1940push_type (tp)
1941 enum type_pieces tp;
1942{
1943 if (type_stack_depth == type_stack_size)
1944 {
1945 type_stack_size *= 2;
e1ce8aa5
JK
1946 type_stack = (union type_stack_elt *)
1947 xrealloc (type_stack, type_stack_size * sizeof (*type_stack));
1948 }
1949 type_stack[type_stack_depth++].piece = tp;
1950}
1951
1952static void
1953push_type_int (n)
1954 int n;
1955{
1956 if (type_stack_depth == type_stack_size)
1957 {
1958 type_stack_size *= 2;
1959 type_stack = (union type_stack_elt *)
1960 xrealloc (type_stack, type_stack_size * sizeof (*type_stack));
dd3b648e 1961 }
e1ce8aa5 1962 type_stack[type_stack_depth++].int_val = n;
dd3b648e
RP
1963}
1964
1965static enum type_pieces
1966pop_type ()
1967{
1968 if (type_stack_depth)
e1ce8aa5 1969 return type_stack[--type_stack_depth].piece;
dd3b648e
RP
1970 return tp_end;
1971}
1972
e1ce8aa5
JK
1973static int
1974pop_type_int ()
1975{
1976 if (type_stack_depth)
1977 return type_stack[--type_stack_depth].int_val;
1978 /* "Can't happen". */
1979 return 0;
1980}
1981
dd3b648e
RP
1982void
1983_initialize_expread ()
1984{
1985 type_stack_size = 80;
1986 type_stack_depth = 0;
e1ce8aa5
JK
1987 type_stack = (union type_stack_elt *)
1988 xmalloc (type_stack_size * sizeof (*type_stack));
dd3b648e 1989}
This page took 0.257059 seconds and 4 git commands to generate.