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