Remove IBM6000_host
[deliverable/binutils-gdb.git] / gdb / c-exp.y
CommitLineData
3d6b6a90
JG
1/* YACC parser for C expressions, for GDB.
2 Copyright (C) 1986, 1989, 1990, 1991 Free Software Foundation, Inc.
3
4This file is part of GDB.
5
6This program 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 2 of the License, or
9(at your option) any later version.
10
11This program 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 this program; if not, write to the Free Software
18Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19
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
e35843d4
FF
27 come first in the result.
28
29 Note that malloc's and realloc's in this file are transformed to
30 xmalloc and xrealloc respectively by the same sed command in the
31 makefile that remaps any other malloc/realloc inserted by the parser
32 generator. Doing this with #defines and trying to control the interaction
33 with include files (<malloc.h> and <stdlib.h> for example) just became
34 too messy, particularly when such includes can be inserted at random
35 times by the parser generator. */
3d6b6a90
JG
36
37%{
38
3d6b6a90 39#include "defs.h"
3d6b6a90
JG
40#include "expression.h"
41#include "parser-defs.h"
42#include "value.h"
43#include "language.h"
22e39759 44#include "c-lang.h"
3d6b6a90 45
19d0f3f4
FF
46/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
47 as well as gratuitiously global symbol names, so we can have multiple
48 yacc generated parsers in gdb. Note that these are only the variables
49 produced by yacc. If other parser generators (bison, byacc, etc) produce
50 additional global names that conflict at link time, then those parser
51 generators need to be fixed instead of adding those names to this list. */
52
d018c8a6 53#define yymaxdepth c_maxdepth
3d6b6a90
JG
54#define yyparse c_parse
55#define yylex c_lex
56#define yyerror c_error
57#define yylval c_lval
58#define yychar c_char
59#define yydebug c_debug
60#define yypact c_pact
61#define yyr1 c_r1
62#define yyr2 c_r2
63#define yydef c_def
64#define yychk c_chk
65#define yypgo c_pgo
66#define yyact c_act
67#define yyexca c_exca
9ce7cb7c
SG
68#define yyerrflag c_errflag
69#define yynerrs c_nerrs
39bf5952
JG
70#define yyps c_ps
71#define yypv c_pv
72#define yys c_s
d018c8a6 73#define yy_yys c_yys
39bf5952
JG
74#define yystate c_state
75#define yytmp c_tmp
76#define yyv c_v
d018c8a6 77#define yy_yyv c_yyv
39bf5952
JG
78#define yyval c_val
79#define yylloc c_lloc
45fe3db4
FF
80#define yyreds c_reds /* With YYDEBUG defined */
81#define yytoks c_toks /* With YYDEBUG defined */
19d0f3f4
FF
82
83#ifndef YYDEBUG
84#define YYDEBUG 0 /* Default to no yydebug support */
85#endif
3d6b6a90 86
d26b50b7 87int
1ab3bf1b
JG
88yyparse PARAMS ((void));
89
19d0f3f4 90static int
1ab3bf1b
JG
91yylex PARAMS ((void));
92
93void
94yyerror PARAMS ((char *));
3d6b6a90
JG
95
96%}
97
98/* Although the yacc "value" of an expression is not used,
99 since the result is stored in the structure being created,
100 other node types do have values. */
101
102%union
103 {
104 LONGEST lval;
105 unsigned LONGEST ulval;
2e6edad1
SC
106 struct {
107 LONGEST val;
108 struct type *type;
109 } typed_val;
3d6b6a90
JG
110 double dval;
111 struct symbol *sym;
112 struct type *tval;
113 struct stoken sval;
114 struct ttype tsym;
115 struct symtoken ssym;
116 int voidval;
117 struct block *bval;
118 enum exp_opcode opcode;
119 struct internalvar *ivar;
120
121 struct type **tvec;
122 int *ivec;
123 }
124
1ab3bf1b
JG
125%{
126/* YYSTYPE gets defined by %union */
127static int
128parse_number PARAMS ((char *, int, int, YYSTYPE *));
129%}
130
9da75ad3
FF
131%type <voidval> exp exp1 type_exp start variable qualified_name lcurly
132%type <lval> rcurly
2640f7e1 133%type <tval> type typebase
3d6b6a90
JG
134%type <tvec> nonempty_typelist
135/* %type <bval> block */
136
137/* Fancy type parsing. */
138%type <voidval> func_mod direct_abs_decl abs_decl
139%type <tval> ptype
140%type <lval> array_mod
141
2e6edad1 142%token <typed_val> INT
3d6b6a90
JG
143%token <dval> FLOAT
144
145/* Both NAME and TYPENAME tokens represent symbols in the input,
146 and both convey their data as strings.
147 But a TYPENAME is a string that happens to be defined as a typedef
148 or builtin type name (such as int or char)
149 and a NAME is any other symbol.
150 Contexts where this distinction is not important can use the
151 nonterminal "name", which matches either NAME or TYPENAME. */
152
153%token <sval> STRING
154%token <ssym> NAME /* BLOCKNAME defined below to give it higher precedence. */
155%token <tsym> TYPENAME
156%type <sval> name
157%type <ssym> name_not_typename
158%type <tsym> typename
159
160/* A NAME_OR_INT is a symbol which is not known in the symbol table,
161 but which would parse as a valid number in the current input radix.
162 E.g. "c" when input_radix==16. Depending on the parse, it will be
2e6edad1 163 turned into a name or into a number. */
3d6b6a90 164
2e6edad1 165%token <ssym> NAME_OR_INT
3d6b6a90 166
8050a57b 167%token STRUCT CLASS UNION ENUM SIZEOF UNSIGNED COLONCOLON
4c53d9ca 168%token TEMPLATE
3d6b6a90
JG
169%token ERROR
170
171/* Special type cases, put in to allow the parser to distinguish different
172 legal basetypes. */
a252e715 173%token SIGNED_KEYWORD LONG SHORT INT_KEYWORD CONST_KEYWORD VOLATILE_KEYWORD
3d6b6a90
JG
174%token <lval> LAST REGNAME
175
176%token <ivar> VARIABLE
177
178%token <opcode> ASSIGN_MODIFY
179
180/* C++ */
181%token THIS
182
183%left ','
184%left ABOVE_COMMA
185%right '=' ASSIGN_MODIFY
186%right '?'
088c3a0b
JG
187%left OROR
188%left ANDAND
3d6b6a90
JG
189%left '|'
190%left '^'
191%left '&'
192%left EQUAL NOTEQUAL
193%left '<' '>' LEQ GEQ
194%left LSH RSH
195%left '@'
196%left '+' '-'
197%left '*' '/' '%'
198%right UNARY INCREMENT DECREMENT
199%right ARROW '.' '[' '('
200%token <ssym> BLOCKNAME
201%type <bval> block
202%left COLONCOLON
36ce1b64 203
368c8614
MT
204\f
205%%
206
3d6b6a90
JG
207start : exp1
208 | type_exp
209 ;
210
211type_exp: type
212 { write_exp_elt_opcode(OP_TYPE);
213 write_exp_elt_type($1);
214 write_exp_elt_opcode(OP_TYPE);}
215 ;
216
217/* Expressions, including the comma operator. */
218exp1 : exp
219 | exp1 ',' exp
220 { write_exp_elt_opcode (BINOP_COMMA); }
221 ;
222
223/* Expressions, not including the comma operator. */
224exp : '*' exp %prec UNARY
225 { write_exp_elt_opcode (UNOP_IND); }
226
227exp : '&' exp %prec UNARY
228 { write_exp_elt_opcode (UNOP_ADDR); }
229
230exp : '-' exp %prec UNARY
231 { write_exp_elt_opcode (UNOP_NEG); }
232 ;
233
234exp : '!' exp %prec UNARY
e58de8a2 235 { write_exp_elt_opcode (UNOP_LOGICAL_NOT); }
3d6b6a90
JG
236 ;
237
238exp : '~' exp %prec UNARY
e58de8a2 239 { write_exp_elt_opcode (UNOP_COMPLEMENT); }
3d6b6a90
JG
240 ;
241
242exp : INCREMENT exp %prec UNARY
243 { write_exp_elt_opcode (UNOP_PREINCREMENT); }
244 ;
245
246exp : DECREMENT exp %prec UNARY
247 { write_exp_elt_opcode (UNOP_PREDECREMENT); }
248 ;
249
250exp : exp INCREMENT %prec UNARY
251 { write_exp_elt_opcode (UNOP_POSTINCREMENT); }
252 ;
253
254exp : exp DECREMENT %prec UNARY
255 { write_exp_elt_opcode (UNOP_POSTDECREMENT); }
256 ;
257
258exp : SIZEOF exp %prec UNARY
259 { write_exp_elt_opcode (UNOP_SIZEOF); }
260 ;
261
262exp : exp ARROW name
263 { write_exp_elt_opcode (STRUCTOP_PTR);
264 write_exp_string ($3);
265 write_exp_elt_opcode (STRUCTOP_PTR); }
266 ;
267
2640f7e1
JG
268exp : exp ARROW qualified_name
269 { /* exp->type::name becomes exp->*(&type::name) */
270 /* Note: this doesn't work if name is a
271 static member! FIXME */
272 write_exp_elt_opcode (UNOP_ADDR);
273 write_exp_elt_opcode (STRUCTOP_MPTR); }
01be6913 274 ;
3d6b6a90
JG
275exp : exp ARROW '*' exp
276 { write_exp_elt_opcode (STRUCTOP_MPTR); }
277 ;
278
279exp : exp '.' name
280 { write_exp_elt_opcode (STRUCTOP_STRUCT);
281 write_exp_string ($3);
282 write_exp_elt_opcode (STRUCTOP_STRUCT); }
283 ;
284
2640f7e1
JG
285exp : exp '.' qualified_name
286 { /* exp.type::name becomes exp.*(&type::name) */
287 /* Note: this doesn't work if name is a
288 static member! FIXME */
289 write_exp_elt_opcode (UNOP_ADDR);
290 write_exp_elt_opcode (STRUCTOP_MEMBER); }
01be6913
PB
291 ;
292
3d6b6a90
JG
293exp : exp '.' '*' exp
294 { write_exp_elt_opcode (STRUCTOP_MEMBER); }
295 ;
296
297exp : exp '[' exp1 ']'
298 { write_exp_elt_opcode (BINOP_SUBSCRIPT); }
299 ;
300
301exp : exp '('
302 /* This is to save the value of arglist_len
303 being accumulated by an outer function call. */
304 { start_arglist (); }
305 arglist ')' %prec ARROW
306 { write_exp_elt_opcode (OP_FUNCALL);
307 write_exp_elt_longcst ((LONGEST) end_arglist ());
308 write_exp_elt_opcode (OP_FUNCALL); }
309 ;
310
9da75ad3
FF
311lcurly : '{'
312 { start_arglist (); }
313 ;
314
3d6b6a90
JG
315arglist :
316 ;
317
318arglist : exp
319 { arglist_len = 1; }
320 ;
321
322arglist : arglist ',' exp %prec ABOVE_COMMA
323 { arglist_len++; }
324 ;
325
9da75ad3
FF
326rcurly : '}'
327 { $$ = end_arglist () - 1; }
328 ;
329exp : lcurly arglist rcurly %prec ARROW
ec16f701
FF
330 { write_exp_elt_opcode (OP_ARRAY);
331 write_exp_elt_longcst ((LONGEST) 0);
9da75ad3 332 write_exp_elt_longcst ((LONGEST) $3);
ec16f701
FF
333 write_exp_elt_opcode (OP_ARRAY); }
334 ;
335
9da75ad3 336exp : lcurly type rcurly exp %prec UNARY
3d6b6a90
JG
337 { write_exp_elt_opcode (UNOP_MEMVAL);
338 write_exp_elt_type ($2);
339 write_exp_elt_opcode (UNOP_MEMVAL); }
340 ;
341
342exp : '(' type ')' exp %prec UNARY
343 { write_exp_elt_opcode (UNOP_CAST);
344 write_exp_elt_type ($2);
345 write_exp_elt_opcode (UNOP_CAST); }
346 ;
347
348exp : '(' exp1 ')'
349 { }
350 ;
351
352/* Binary operators in order of decreasing precedence. */
353
354exp : exp '@' exp
355 { write_exp_elt_opcode (BINOP_REPEAT); }
356 ;
357
358exp : exp '*' exp
359 { write_exp_elt_opcode (BINOP_MUL); }
360 ;
361
362exp : exp '/' exp
363 { write_exp_elt_opcode (BINOP_DIV); }
364 ;
365
366exp : exp '%' exp
367 { write_exp_elt_opcode (BINOP_REM); }
368 ;
369
370exp : exp '+' exp
371 { write_exp_elt_opcode (BINOP_ADD); }
372 ;
373
374exp : exp '-' exp
375 { write_exp_elt_opcode (BINOP_SUB); }
376 ;
377
378exp : exp LSH exp
379 { write_exp_elt_opcode (BINOP_LSH); }
380 ;
381
382exp : exp RSH exp
383 { write_exp_elt_opcode (BINOP_RSH); }
384 ;
385
386exp : exp EQUAL exp
387 { write_exp_elt_opcode (BINOP_EQUAL); }
388 ;
389
390exp : exp NOTEQUAL exp
391 { write_exp_elt_opcode (BINOP_NOTEQUAL); }
392 ;
393
394exp : exp LEQ exp
395 { write_exp_elt_opcode (BINOP_LEQ); }
396 ;
397
398exp : exp GEQ exp
399 { write_exp_elt_opcode (BINOP_GEQ); }
400 ;
401
402exp : exp '<' exp
403 { write_exp_elt_opcode (BINOP_LESS); }
404 ;
405
406exp : exp '>' exp
407 { write_exp_elt_opcode (BINOP_GTR); }
408 ;
409
410exp : exp '&' exp
e58de8a2 411 { write_exp_elt_opcode (BINOP_BITWISE_AND); }
3d6b6a90
JG
412 ;
413
414exp : exp '^' exp
e58de8a2 415 { write_exp_elt_opcode (BINOP_BITWISE_XOR); }
3d6b6a90
JG
416 ;
417
418exp : exp '|' exp
e58de8a2 419 { write_exp_elt_opcode (BINOP_BITWISE_IOR); }
3d6b6a90
JG
420 ;
421
088c3a0b 422exp : exp ANDAND exp
e58de8a2 423 { write_exp_elt_opcode (BINOP_LOGICAL_AND); }
3d6b6a90
JG
424 ;
425
088c3a0b 426exp : exp OROR exp
e58de8a2 427 { write_exp_elt_opcode (BINOP_LOGICAL_OR); }
3d6b6a90
JG
428 ;
429
430exp : exp '?' exp ':' exp %prec '?'
431 { write_exp_elt_opcode (TERNOP_COND); }
432 ;
433
434exp : exp '=' exp
435 { write_exp_elt_opcode (BINOP_ASSIGN); }
436 ;
437
438exp : exp ASSIGN_MODIFY exp
439 { write_exp_elt_opcode (BINOP_ASSIGN_MODIFY);
440 write_exp_elt_opcode ($2);
441 write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); }
442 ;
443
444exp : INT
445 { write_exp_elt_opcode (OP_LONG);
2e6edad1
SC
446 write_exp_elt_type ($1.type);
447 write_exp_elt_longcst ((LONGEST)($1.val));
3d6b6a90
JG
448 write_exp_elt_opcode (OP_LONG); }
449 ;
450
451exp : NAME_OR_INT
452 { YYSTYPE val;
453 parse_number ($1.stoken.ptr, $1.stoken.length, 0, &val);
454 write_exp_elt_opcode (OP_LONG);
2e6edad1
SC
455 write_exp_elt_type (val.typed_val.type);
456 write_exp_elt_longcst ((LONGEST)val.typed_val.val);
3d6b6a90
JG
457 write_exp_elt_opcode (OP_LONG);
458 }
459 ;
460
3d6b6a90
JG
461
462exp : FLOAT
463 { write_exp_elt_opcode (OP_DOUBLE);
464 write_exp_elt_type (builtin_type_double);
465 write_exp_elt_dblcst ($1);
466 write_exp_elt_opcode (OP_DOUBLE); }
467 ;
468
469exp : variable
470 ;
471
472exp : LAST
473 { write_exp_elt_opcode (OP_LAST);
474 write_exp_elt_longcst ((LONGEST) $1);
475 write_exp_elt_opcode (OP_LAST); }
476 ;
477
478exp : REGNAME
479 { write_exp_elt_opcode (OP_REGISTER);
480 write_exp_elt_longcst ((LONGEST) $1);
481 write_exp_elt_opcode (OP_REGISTER); }
482 ;
483
484exp : VARIABLE
485 { write_exp_elt_opcode (OP_INTERNALVAR);
486 write_exp_elt_intern ($1);
487 write_exp_elt_opcode (OP_INTERNALVAR); }
488 ;
489
490exp : SIZEOF '(' type ')' %prec UNARY
491 { write_exp_elt_opcode (OP_LONG);
492 write_exp_elt_type (builtin_type_int);
493 write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3));
494 write_exp_elt_opcode (OP_LONG); }
495 ;
496
497exp : STRING
c4413e2c
FF
498 { /* C strings are converted into array constants with
499 an explicit null byte added at the end. Thus
500 the array upper bound is the string length.
501 There is no such thing in C as a completely empty
502 string. */
503 char *sp = $1.ptr; int count = $1.length;
504 while (count-- > 0)
505 {
506 write_exp_elt_opcode (OP_LONG);
507 write_exp_elt_type (builtin_type_char);
508 write_exp_elt_longcst ((LONGEST)(*sp++));
509 write_exp_elt_opcode (OP_LONG);
510 }
511 write_exp_elt_opcode (OP_LONG);
512 write_exp_elt_type (builtin_type_char);
513 write_exp_elt_longcst ((LONGEST)'\0');
514 write_exp_elt_opcode (OP_LONG);
515 write_exp_elt_opcode (OP_ARRAY);
516 write_exp_elt_longcst ((LONGEST) 0);
517 write_exp_elt_longcst ((LONGEST) ($1.length));
518 write_exp_elt_opcode (OP_ARRAY); }
3d6b6a90
JG
519 ;
520
521/* C++. */
522exp : THIS
523 { write_exp_elt_opcode (OP_THIS);
524 write_exp_elt_opcode (OP_THIS); }
525 ;
526
527/* end of C++. */
528
529block : BLOCKNAME
530 {
531 if ($1.sym != 0)
532 $$ = SYMBOL_BLOCK_VALUE ($1.sym);
533 else
534 {
535 struct symtab *tem =
536 lookup_symtab (copy_name ($1.stoken));
537 if (tem)
538 $$ = BLOCKVECTOR_BLOCK
539 (BLOCKVECTOR (tem), STATIC_BLOCK);
540 else
541 error ("No file or function \"%s\".",
542 copy_name ($1.stoken));
543 }
544 }
545 ;
546
547block : block COLONCOLON name
548 { struct symbol *tem
549 = lookup_symbol (copy_name ($3), $1,
550 VAR_NAMESPACE, 0, NULL);
551 if (!tem || SYMBOL_CLASS (tem) != LOC_BLOCK)
552 error ("No function \"%s\" in specified context.",
553 copy_name ($3));
554 $$ = SYMBOL_BLOCK_VALUE (tem); }
555 ;
556
557variable: block COLONCOLON name
558 { struct symbol *sym;
559 sym = lookup_symbol (copy_name ($3), $1,
560 VAR_NAMESPACE, 0, NULL);
561 if (sym == 0)
562 error ("No symbol \"%s\" in specified context.",
563 copy_name ($3));
564
565 write_exp_elt_opcode (OP_VAR_VALUE);
566 write_exp_elt_sym (sym);
567 write_exp_elt_opcode (OP_VAR_VALUE); }
568 ;
569
2640f7e1 570qualified_name: typebase COLONCOLON name
3d6b6a90
JG
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);
2640f7e1 580 write_exp_string ($3);
3d6b6a90
JG
581 write_exp_elt_opcode (OP_SCOPE);
582 }
2640f7e1 583 | typebase COLONCOLON '~' name
3d6b6a90
JG
584 {
585 struct type *type = $1;
01be6913 586 struct stoken tmp_token;
3d6b6a90
JG
587 if (TYPE_CODE (type) != TYPE_CODE_STRUCT
588 && TYPE_CODE (type) != TYPE_CODE_UNION)
589 error ("`%s' is not defined as an aggregate type.",
590 TYPE_NAME (type));
591
2e4964ad 592 if (!STREQ (type_name_no_tag (type), $4.ptr))
3d6b6a90 593 error ("invalid destructor `%s::~%s'",
2640f7e1 594 type_name_no_tag (type), $4.ptr);
3d6b6a90 595
2640f7e1
JG
596 tmp_token.ptr = (char*) alloca ($4.length + 2);
597 tmp_token.length = $4.length + 1;
01be6913 598 tmp_token.ptr[0] = '~';
2640f7e1 599 memcpy (tmp_token.ptr+1, $4.ptr, $4.length);
01be6913 600 tmp_token.ptr[tmp_token.length] = 0;
3d6b6a90
JG
601 write_exp_elt_opcode (OP_SCOPE);
602 write_exp_elt_type (type);
01be6913 603 write_exp_string (tmp_token);
3d6b6a90 604 write_exp_elt_opcode (OP_SCOPE);
3d6b6a90 605 }
01be6913
PB
606 ;
607
608variable: qualified_name
3d6b6a90
JG
609 | COLONCOLON name
610 {
611 char *name = copy_name ($2);
612 struct symbol *sym;
1ab3bf1b 613 struct minimal_symbol *msymbol;
3d6b6a90
JG
614
615 sym =
616 lookup_symbol (name, 0, VAR_NAMESPACE, 0, NULL);
617 if (sym)
618 {
619 write_exp_elt_opcode (OP_VAR_VALUE);
620 write_exp_elt_sym (sym);
621 write_exp_elt_opcode (OP_VAR_VALUE);
622 break;
623 }
3d6b6a90 624
1ab3bf1b
JG
625 msymbol = lookup_minimal_symbol (name,
626 (struct objfile *) NULL);
627 if (msymbol != NULL)
3d6b6a90 628 {
3d6b6a90
JG
629 write_exp_elt_opcode (OP_LONG);
630 write_exp_elt_type (builtin_type_int);
2e4964ad 631 write_exp_elt_longcst ((LONGEST) SYMBOL_VALUE_ADDRESS (msymbol));
3d6b6a90
JG
632 write_exp_elt_opcode (OP_LONG);
633 write_exp_elt_opcode (UNOP_MEMVAL);
1ab3bf1b
JG
634 if (msymbol -> type == mst_data ||
635 msymbol -> type == mst_bss)
3d6b6a90 636 write_exp_elt_type (builtin_type_int);
1ab3bf1b 637 else if (msymbol -> type == mst_text)
3d6b6a90
JG
638 write_exp_elt_type (lookup_function_type (builtin_type_int));
639 else
640 write_exp_elt_type (builtin_type_char);
641 write_exp_elt_opcode (UNOP_MEMVAL);
642 }
643 else
1ab3bf1b 644 if (!have_full_symbols () && !have_partial_symbols ())
3d6b6a90
JG
645 error ("No symbol table is loaded. Use the \"file\" command.");
646 else
647 error ("No symbol \"%s\" in current context.", name);
648 }
649 ;
650
651variable: name_not_typename
652 { struct symbol *sym = $1.sym;
653
654 if (sym)
655 {
5b0a744f 656 switch (SYMBOL_CLASS (sym))
3d6b6a90
JG
657 {
658 case LOC_REGISTER:
659 case LOC_ARG:
660 case LOC_REF_ARG:
661 case LOC_REGPARM:
662 case LOC_LOCAL:
663 case LOC_LOCAL_ARG:
664 if (innermost_block == 0 ||
665 contained_in (block_found,
666 innermost_block))
667 innermost_block = block_found;
668 case LOC_UNDEF:
669 case LOC_CONST:
670 case LOC_STATIC:
671 case LOC_TYPEDEF:
672 case LOC_LABEL:
673 case LOC_BLOCK:
674 case LOC_CONST_BYTES:
675
676 /* In this case the expression can
677 be evaluated regardless of what
678 frame we are in, so there is no
679 need to check for the
680 innermost_block. These cases are
681 listed so that gcc -Wall will
682 report types that may not have
683 been considered. */
684
685 break;
686 }
687 write_exp_elt_opcode (OP_VAR_VALUE);
688 write_exp_elt_sym (sym);
689 write_exp_elt_opcode (OP_VAR_VALUE);
690 }
691 else if ($1.is_a_field_of_this)
692 {
693 /* C++: it hangs off of `this'. Must
694 not inadvertently convert from a method call
695 to data ref. */
696 if (innermost_block == 0 ||
697 contained_in (block_found, innermost_block))
698 innermost_block = block_found;
699 write_exp_elt_opcode (OP_THIS);
700 write_exp_elt_opcode (OP_THIS);
701 write_exp_elt_opcode (STRUCTOP_PTR);
702 write_exp_string ($1.stoken);
703 write_exp_elt_opcode (STRUCTOP_PTR);
704 }
705 else
706 {
1ab3bf1b 707 struct minimal_symbol *msymbol;
3d6b6a90
JG
708 register char *arg = copy_name ($1.stoken);
709
1ab3bf1b
JG
710 msymbol = lookup_minimal_symbol (arg,
711 (struct objfile *) NULL);
712 if (msymbol != NULL)
3d6b6a90 713 {
3d6b6a90
JG
714 write_exp_elt_opcode (OP_LONG);
715 write_exp_elt_type (builtin_type_int);
2e4964ad 716 write_exp_elt_longcst ((LONGEST) SYMBOL_VALUE_ADDRESS (msymbol));
3d6b6a90
JG
717 write_exp_elt_opcode (OP_LONG);
718 write_exp_elt_opcode (UNOP_MEMVAL);
1ab3bf1b
JG
719 if (msymbol -> type == mst_data ||
720 msymbol -> type == mst_bss)
3d6b6a90 721 write_exp_elt_type (builtin_type_int);
1ab3bf1b 722 else if (msymbol -> type == mst_text)
3d6b6a90
JG
723 write_exp_elt_type (lookup_function_type (builtin_type_int));
724 else
725 write_exp_elt_type (builtin_type_char);
726 write_exp_elt_opcode (UNOP_MEMVAL);
727 }
1ab3bf1b 728 else if (!have_full_symbols () && !have_partial_symbols ())
3d6b6a90
JG
729 error ("No symbol table is loaded. Use the \"file\" command.");
730 else
731 error ("No symbol \"%s\" in current context.",
732 copy_name ($1.stoken));
733 }
734 }
735 ;
736
737
738ptype : typebase
739 | typebase abs_decl
740 {
741 /* This is where the interesting stuff happens. */
742 int done = 0;
743 int array_size;
744 struct type *follow_type = $1;
a8a69e63 745 struct type *range_type;
3d6b6a90
JG
746
747 while (!done)
748 switch (pop_type ())
749 {
750 case tp_end:
751 done = 1;
752 break;
753 case tp_pointer:
754 follow_type = lookup_pointer_type (follow_type);
755 break;
756 case tp_reference:
757 follow_type = lookup_reference_type (follow_type);
758 break;
759 case tp_array:
760 array_size = pop_type_int ();
761 if (array_size != -1)
a8a69e63
FF
762 {
763 range_type =
764 create_range_type ((struct type *) NULL,
765 builtin_type_int, 0,
766 array_size - 1);
767 follow_type =
768 create_array_type ((struct type *) NULL,
769 follow_type, range_type);
770 }
3d6b6a90
JG
771 else
772 follow_type = lookup_pointer_type (follow_type);
773 break;
774 case tp_function:
775 follow_type = lookup_function_type (follow_type);
776 break;
777 }
778 $$ = follow_type;
779 }
780 ;
781
782abs_decl: '*'
783 { push_type (tp_pointer); $$ = 0; }
784 | '*' abs_decl
785 { push_type (tp_pointer); $$ = $2; }
786 | '&'
787 { push_type (tp_reference); $$ = 0; }
788 | '&' abs_decl
789 { push_type (tp_reference); $$ = $2; }
790 | direct_abs_decl
791 ;
792
793direct_abs_decl: '(' abs_decl ')'
794 { $$ = $2; }
795 | direct_abs_decl array_mod
796 {
797 push_type_int ($2);
798 push_type (tp_array);
799 }
800 | array_mod
801 {
802 push_type_int ($1);
803 push_type (tp_array);
804 $$ = 0;
805 }
806 | direct_abs_decl func_mod
807 { push_type (tp_function); }
808 | func_mod
809 { push_type (tp_function); }
810 ;
811
812array_mod: '[' ']'
813 { $$ = -1; }
814 | '[' INT ']'
2e6edad1 815 { $$ = $2.val; }
3d6b6a90
JG
816 ;
817
818func_mod: '(' ')'
819 { $$ = 0; }
0e2a896c 820 | '(' nonempty_typelist ')'
be772100 821 { free ((PTR)$2); $$ = 0; }
3d6b6a90
JG
822 ;
823
824type : ptype
2640f7e1
JG
825 | typebase COLONCOLON '*'
826 { $$ = lookup_member_type (builtin_type_int, $1); }
3d6b6a90
JG
827 | type '(' typebase COLONCOLON '*' ')'
828 { $$ = lookup_member_type ($1, $3); }
829 | type '(' typebase COLONCOLON '*' ')' '(' ')'
830 { $$ = lookup_member_type
831 (lookup_function_type ($1), $3); }
832 | type '(' typebase COLONCOLON '*' ')' '(' nonempty_typelist ')'
833 { $$ = lookup_member_type
834 (lookup_function_type ($1), $3);
be772100 835 free ((PTR)$8); }
3d6b6a90
JG
836 ;
837
10a297b7 838typebase /* Implements (approximately): (type-qualifier)* type-specifier */
3d6b6a90
JG
839 : TYPENAME
840 { $$ = $1.type; }
841 | INT_KEYWORD
842 { $$ = builtin_type_int; }
843 | LONG
844 { $$ = builtin_type_long; }
845 | SHORT
846 { $$ = builtin_type_short; }
847 | LONG INT_KEYWORD
848 { $$ = builtin_type_long; }
849 | UNSIGNED LONG INT_KEYWORD
850 { $$ = builtin_type_unsigned_long; }
851 | LONG LONG
852 { $$ = builtin_type_long_long; }
853 | LONG LONG INT_KEYWORD
854 { $$ = builtin_type_long_long; }
855 | UNSIGNED LONG LONG
856 { $$ = builtin_type_unsigned_long_long; }
857 | UNSIGNED LONG LONG INT_KEYWORD
858 { $$ = builtin_type_unsigned_long_long; }
859 | SHORT INT_KEYWORD
860 { $$ = builtin_type_short; }
861 | UNSIGNED SHORT INT_KEYWORD
862 { $$ = builtin_type_unsigned_short; }
863 | STRUCT name
864 { $$ = lookup_struct (copy_name ($2),
865 expression_context_block); }
8050a57b
FF
866 | CLASS name
867 { $$ = lookup_struct (copy_name ($2),
868 expression_context_block); }
3d6b6a90
JG
869 | UNION name
870 { $$ = lookup_union (copy_name ($2),
871 expression_context_block); }
872 | ENUM name
873 { $$ = lookup_enum (copy_name ($2),
874 expression_context_block); }
875 | UNSIGNED typename
876 { $$ = lookup_unsigned_typename (TYPE_NAME($2.type)); }
877 | UNSIGNED
878 { $$ = builtin_type_unsigned_int; }
088c3a0b 879 | SIGNED_KEYWORD typename
a252e715 880 { $$ = lookup_signed_typename (TYPE_NAME($2.type)); }
088c3a0b 881 | SIGNED_KEYWORD
3d6b6a90 882 { $$ = builtin_type_int; }
4c53d9ca
DHW
883 | TEMPLATE name '<' type '>'
884 { $$ = lookup_template_type(copy_name($2), $4,
885 expression_context_block);
886 }
10a297b7
PB
887 /* "const" and "volatile" are curently ignored. */
888 | CONST_KEYWORD typebase { $$ = $2; }
889 | VOLATILE_KEYWORD typebase { $$ = $2; }
3d6b6a90
JG
890 ;
891
892typename: TYPENAME
893 | INT_KEYWORD
894 {
895 $$.stoken.ptr = "int";
896 $$.stoken.length = 3;
897 $$.type = builtin_type_int;
898 }
899 | LONG
900 {
901 $$.stoken.ptr = "long";
902 $$.stoken.length = 4;
903 $$.type = builtin_type_long;
904 }
905 | SHORT
906 {
907 $$.stoken.ptr = "short";
908 $$.stoken.length = 5;
909 $$.type = builtin_type_short;
910 }
911 ;
912
913nonempty_typelist
914 : type
e35843d4 915 { $$ = (struct type **) malloc (sizeof (struct type *) * 2);
6c316cfd 916 $<ivec>$[0] = 1; /* Number of types in vector */
3d6b6a90
JG
917 $$[1] = $1;
918 }
919 | nonempty_typelist ',' type
6c316cfd 920 { int len = sizeof (struct type *) * (++($<ivec>1[0]) + 1);
e35843d4 921 $$ = (struct type **) realloc ((char *) $1, len);
3d6b6a90
JG
922 $$[$<ivec>$[0]] = $3;
923 }
924 ;
925
926name : NAME { $$ = $1.stoken; }
927 | BLOCKNAME { $$ = $1.stoken; }
928 | TYPENAME { $$ = $1.stoken; }
929 | NAME_OR_INT { $$ = $1.stoken; }
3d6b6a90
JG
930 ;
931
932name_not_typename : NAME
933 | BLOCKNAME
934/* These would be useful if name_not_typename was useful, but it is just
935 a fake for "variable", so these cause reduce/reduce conflicts because
936 the parser can't tell whether NAME_OR_INT is a name_not_typename (=variable,
937 =exp) or just an exp. If name_not_typename was ever used in an lvalue
938 context where only a name could occur, this might be useful.
939 | NAME_OR_INT
3d6b6a90
JG
940 */
941 ;
942
943%%
944
945/* Take care of parsing a number (anything that starts with a digit).
946 Set yylval and return the token type; update lexptr.
947 LEN is the number of characters in it. */
948
949/*** Needs some error checking for the float case ***/
950
951static int
952parse_number (p, len, parsed_float, putithere)
953 register char *p;
954 register int len;
955 int parsed_float;
956 YYSTYPE *putithere;
957{
958 register LONGEST n = 0;
959 register LONGEST prevn = 0;
960 register int i;
961 register int c;
962 register int base = input_radix;
963 int unsigned_p = 0;
2e6edad1
SC
964 int long_p = 0;
965 LONGEST high_bit;
966 struct type *signed_type;
967 struct type *unsigned_type;
3d6b6a90 968
3d6b6a90
JG
969 if (parsed_float)
970 {
971 /* It's a float since it contains a point or an exponent. */
972 putithere->dval = atof (p);
973 return FLOAT;
974 }
975
976 /* Handle base-switching prefixes 0x, 0t, 0d, 0 */
977 if (p[0] == '0')
978 switch (p[1])
979 {
980 case 'x':
981 case 'X':
982 if (len >= 3)
983 {
984 p += 2;
985 base = 16;
986 len -= 2;
987 }
988 break;
989
990 case 't':
991 case 'T':
992 case 'd':
993 case 'D':
994 if (len >= 3)
995 {
996 p += 2;
997 base = 10;
998 len -= 2;
999 }
1000 break;
1001
1002 default:
1003 base = 8;
1004 break;
1005 }
1006
1007 while (len-- > 0)
1008 {
1009 c = *p++;
1010 if (c >= 'A' && c <= 'Z')
1011 c += 'a' - 'A';
1012 if (c != 'l' && c != 'u')
1013 n *= base;
1014 if (c >= '0' && c <= '9')
1015 n += i = c - '0';
1016 else
1017 {
1018 if (base > 10 && c >= 'a' && c <= 'f')
1019 n += i = c - 'a' + 10;
2e6edad1
SC
1020 else if (len == 0 && c == 'l')
1021 long_p = 1;
3d6b6a90
JG
1022 else if (len == 0 && c == 'u')
1023 unsigned_p = 1;
1024 else
1025 return ERROR; /* Char not a digit */
1026 }
1027 if (i >= base)
1028 return ERROR; /* Invalid digit in this base */
2e6edad1 1029
2a5ec41d
JG
1030 /* Portably test for overflow (only works for nonzero values, so make
1031 a second check for zero). */
1032 if((prevn >= n) && n != 0)
3d6b6a90 1033 unsigned_p=1; /* Try something unsigned */
2a5ec41d 1034 /* If range checking enabled, portably test for unsigned overflow. */
3d6b6a90
JG
1035 if(RANGE_CHECK && n!=0)
1036 {
1037 if((unsigned_p && (unsigned)prevn >= (unsigned)n))
1038 range_error("Overflow on numeric constant.");
1039 }
1040 prevn=n;
1041 }
2e6edad1
SC
1042
1043 /* If the number is too big to be an int, or it's got an l suffix
1044 then it's a long. Work out if this has to be a long by
1045 shifting right and and seeing if anything remains, and the
1046 target int size is different to the target long size. */
3d6b6a90 1047
2e6edad1
SC
1048 if ((TARGET_INT_BIT != TARGET_LONG_BIT && (n >> TARGET_INT_BIT)) || long_p)
1049 {
1050 high_bit = ((LONGEST)1) << (TARGET_LONG_BIT-1);
1051 unsigned_type = builtin_type_unsigned_long;
1052 signed_type = builtin_type_long;
1053 }
1054 else
1055 {
1056 high_bit = ((LONGEST)1) << (TARGET_INT_BIT-1);
1057 unsigned_type = builtin_type_unsigned_int;
1058 signed_type = builtin_type_int;
1059 }
1060
1061 putithere->typed_val.val = n;
1062
1063 /* If the high bit of the worked out type is set then this number
1064 has to be unsigned. */
1065
1066 if (unsigned_p || (n & high_bit))
1067 {
1068 putithere->typed_val.type = unsigned_type;
1069 }
1070 else
1071 {
1072 putithere->typed_val.type = signed_type;
1073 }
1074
1075 return INT;
3d6b6a90
JG
1076}
1077
1078struct token
1079{
1080 char *operator;
1081 int token;
1082 enum exp_opcode opcode;
1083};
1084
a8a69e63 1085static const struct token tokentab3[] =
3d6b6a90
JG
1086 {
1087 {">>=", ASSIGN_MODIFY, BINOP_RSH},
1088 {"<<=", ASSIGN_MODIFY, BINOP_LSH}
1089 };
1090
a8a69e63 1091static const struct token tokentab2[] =
3d6b6a90
JG
1092 {
1093 {"+=", ASSIGN_MODIFY, BINOP_ADD},
1094 {"-=", ASSIGN_MODIFY, BINOP_SUB},
1095 {"*=", ASSIGN_MODIFY, BINOP_MUL},
1096 {"/=", ASSIGN_MODIFY, BINOP_DIV},
1097 {"%=", ASSIGN_MODIFY, BINOP_REM},
e58de8a2
FF
1098 {"|=", ASSIGN_MODIFY, BINOP_BITWISE_IOR},
1099 {"&=", ASSIGN_MODIFY, BINOP_BITWISE_AND},
1100 {"^=", ASSIGN_MODIFY, BINOP_BITWISE_XOR},
3d6b6a90
JG
1101 {"++", INCREMENT, BINOP_END},
1102 {"--", DECREMENT, BINOP_END},
1103 {"->", ARROW, BINOP_END},
088c3a0b
JG
1104 {"&&", ANDAND, BINOP_END},
1105 {"||", OROR, BINOP_END},
3d6b6a90
JG
1106 {"::", COLONCOLON, BINOP_END},
1107 {"<<", LSH, BINOP_END},
1108 {">>", RSH, BINOP_END},
1109 {"==", EQUAL, BINOP_END},
1110 {"!=", NOTEQUAL, BINOP_END},
1111 {"<=", LEQ, BINOP_END},
1112 {">=", GEQ, BINOP_END}
1113 };
1114
1115/* Read one token, getting characters through lexptr. */
1116
533d1dc7 1117static int
3d6b6a90
JG
1118yylex ()
1119{
bac89d6c
FF
1120 int c;
1121 int namelen;
1122 unsigned int i;
1123 char *tokstart;
1124 char *tokptr;
1125 int tempbufindex;
1126 static char *tempbuf;
1127 static int tempbufsize;
1128
3d6b6a90
JG
1129 retry:
1130
1131 tokstart = lexptr;
1132 /* See if it is a special token of length 3. */
1133 for (i = 0; i < sizeof tokentab3 / sizeof tokentab3[0]; i++)
45fe3db4 1134 if (STREQN (tokstart, tokentab3[i].operator, 3))
3d6b6a90
JG
1135 {
1136 lexptr += 3;
1137 yylval.opcode = tokentab3[i].opcode;
1138 return tokentab3[i].token;
1139 }
1140
1141 /* See if it is a special token of length 2. */
1142 for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++)
45fe3db4 1143 if (STREQN (tokstart, tokentab2[i].operator, 2))
3d6b6a90
JG
1144 {
1145 lexptr += 2;
1146 yylval.opcode = tokentab2[i].opcode;
1147 return tokentab2[i].token;
1148 }
1149
1150 switch (c = *tokstart)
1151 {
1152 case 0:
1153 return 0;
1154
1155 case ' ':
1156 case '\t':
1157 case '\n':
1158 lexptr++;
1159 goto retry;
1160
1161 case '\'':
d630b615
FF
1162 /* We either have a character constant ('0' or '\177' for example)
1163 or we have a quoted symbol reference ('foo(int,int)' in C++
1164 for example). */
3d6b6a90
JG
1165 lexptr++;
1166 c = *lexptr++;
1167 if (c == '\\')
1168 c = parse_escape (&lexptr);
2e6edad1
SC
1169
1170 yylval.typed_val.val = c;
1171 yylval.typed_val.type = builtin_type_char;
1172
3d6b6a90
JG
1173 c = *lexptr++;
1174 if (c != '\'')
d630b615
FF
1175 {
1176 namelen = skip_quoted (tokstart) - tokstart;
1177 if (namelen > 2)
1178 {
1179 lexptr = tokstart + namelen;
1180 namelen -= 2;
1181 tokstart++;
1182 goto tryname;
1183 }
1184 error ("Invalid character constant.");
1185 }
2e6edad1 1186 return INT;
3d6b6a90
JG
1187
1188 case '(':
1189 paren_depth++;
1190 lexptr++;
1191 return c;
1192
1193 case ')':
1194 if (paren_depth == 0)
1195 return 0;
1196 paren_depth--;
1197 lexptr++;
1198 return c;
1199
1200 case ',':
1201 if (comma_terminates && paren_depth == 0)
1202 return 0;
1203 lexptr++;
1204 return c;
1205
1206 case '.':
1207 /* Might be a floating point number. */
1208 if (lexptr[1] < '0' || lexptr[1] > '9')
1209 goto symbol; /* Nope, must be a symbol. */
1210 /* FALL THRU into number case. */
1211
1212 case '0':
1213 case '1':
1214 case '2':
1215 case '3':
1216 case '4':
1217 case '5':
1218 case '6':
1219 case '7':
1220 case '8':
1221 case '9':
1222 {
1223 /* It's a number. */
1224 int got_dot = 0, got_e = 0, toktype;
1225 register char *p = tokstart;
1226 int hex = input_radix > 10;
1227
1228 if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
1229 {
1230 p += 2;
1231 hex = 1;
1232 }
1233 else if (c == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D'))
1234 {
1235 p += 2;
1236 hex = 0;
1237 }
1238
1239 for (;; ++p)
1240 {
1241 if (!hex && !got_e && (*p == 'e' || *p == 'E'))
1242 got_dot = got_e = 1;
1243 else if (!hex && !got_dot && *p == '.')
1244 got_dot = 1;
1245 else if (got_e && (p[-1] == 'e' || p[-1] == 'E')
1246 && (*p == '-' || *p == '+'))
1247 /* This is the sign of the exponent, not the end of the
1248 number. */
1249 continue;
1250 /* We will take any letters or digits. parse_number will
1251 complain if past the radix, or if L or U are not final. */
1252 else if ((*p < '0' || *p > '9')
1253 && ((*p < 'a' || *p > 'z')
1254 && (*p < 'A' || *p > 'Z')))
1255 break;
1256 }
1257 toktype = parse_number (tokstart, p - tokstart, got_dot|got_e, &yylval);
1258 if (toktype == ERROR)
1259 {
1260 char *err_copy = (char *) alloca (p - tokstart + 1);
1261
4ed3a9ea 1262 memcpy (err_copy, tokstart, p - tokstart);
3d6b6a90
JG
1263 err_copy[p - tokstart] = 0;
1264 error ("Invalid number \"%s\".", err_copy);
1265 }
1266 lexptr = p;
1267 return toktype;
1268 }
1269
1270 case '+':
1271 case '-':
1272 case '*':
1273 case '/':
1274 case '%':
1275 case '|':
1276 case '&':
1277 case '^':
1278 case '~':
1279 case '!':
1280 case '@':
1281 case '<':
1282 case '>':
1283 case '[':
1284 case ']':
1285 case '?':
1286 case ':':
1287 case '=':
1288 case '{':
1289 case '}':
1290 symbol:
1291 lexptr++;
1292 return c;
1293
1294 case '"':
bac89d6c
FF
1295
1296 /* Build the gdb internal form of the input string in tempbuf,
1297 translating any standard C escape forms seen. Note that the
1298 buffer is null byte terminated *only* for the convenience of
1299 debugging gdb itself and printing the buffer contents when
1300 the buffer contains no embedded nulls. Gdb does not depend
1301 upon the buffer being null byte terminated, it uses the length
1302 string instead. This allows gdb to handle C strings (as well
1303 as strings in other languages) with embedded null bytes */
1304
1305 tokptr = ++tokstart;
1306 tempbufindex = 0;
1307
1308 do {
1309 /* Grow the static temp buffer if necessary, including allocating
1310 the first one on demand. */
1311 if (tempbufindex + 1 >= tempbufsize)
3d6b6a90 1312 {
bac89d6c
FF
1313 tempbuf = (char *) realloc (tempbuf, tempbufsize += 64);
1314 }
1315 switch (*tokptr)
1316 {
1317 case '\0':
1318 case '"':
1319 /* Do nothing, loop will terminate. */
1320 break;
1321 case '\\':
1322 tokptr++;
1323 c = parse_escape (&tokptr);
1324 if (c == -1)
3d6b6a90 1325 {
bac89d6c 1326 continue;
3d6b6a90 1327 }
bac89d6c
FF
1328 tempbuf[tempbufindex++] = c;
1329 break;
1330 default:
1331 tempbuf[tempbufindex++] = *tokptr++;
1332 break;
3d6b6a90 1333 }
bac89d6c
FF
1334 } while ((*tokptr != '"') && (*tokptr != '\0'));
1335 if (*tokptr++ != '"')
1336 {
1337 error ("Unterminated string in expression.");
1338 }
1339 tempbuf[tempbufindex] = '\0'; /* See note above */
1340 yylval.sval.ptr = tempbuf;
1341 yylval.sval.length = tempbufindex;
1342 lexptr = tokptr;
1343 return (STRING);
3d6b6a90
JG
1344 }
1345
1346 if (!(c == '_' || c == '$'
1347 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
1348 /* We must have come across a bad character (e.g. ';'). */
1349 error ("Invalid character '%c' in expression.", c);
1350
1351 /* It's a name. See how long it is. */
1352 namelen = 0;
1353 for (c = tokstart[namelen];
1354 (c == '_' || c == '$' || (c >= '0' && c <= '9')
1355 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
1356 c = tokstart[++namelen])
1357 ;
1358
1359 /* The token "if" terminates the expression and is NOT
1360 removed from the input stream. */
1361 if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f')
1362 {
1363 return 0;
1364 }
1365
1366 lexptr += namelen;
1367
1368 /* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1)
1369 and $$digits (equivalent to $<-digits> if you could type that).
1370 Make token type LAST, and put the number (the digits) in yylval. */
1371
d630b615 1372 tryname:
3d6b6a90
JG
1373 if (*tokstart == '$')
1374 {
1375 register int negate = 0;
1376 c = 1;
1377 /* Double dollar means negate the number and add -1 as well.
1378 Thus $$ alone means -1. */
1379 if (namelen >= 2 && tokstart[1] == '$')
1380 {
1381 negate = 1;
1382 c = 2;
1383 }
1384 if (c == namelen)
1385 {
1386 /* Just dollars (one or two) */
1387 yylval.lval = - negate;
1388 return LAST;
1389 }
1390 /* Is the rest of the token digits? */
1391 for (; c < namelen; c++)
1392 if (!(tokstart[c] >= '0' && tokstart[c] <= '9'))
1393 break;
1394 if (c == namelen)
1395 {
1396 yylval.lval = atoi (tokstart + 1 + negate);
1397 if (negate)
1398 yylval.lval = - yylval.lval;
1399 return LAST;
1400 }
1401 }
1402
1403 /* Handle tokens that refer to machine registers:
1404 $ followed by a register name. */
1405
1406 if (*tokstart == '$') {
1407 for (c = 0; c < NUM_REGS; c++)
1408 if (namelen - 1 == strlen (reg_names[c])
45fe3db4 1409 && STREQN (tokstart + 1, reg_names[c], namelen - 1))
3d6b6a90
JG
1410 {
1411 yylval.lval = c;
1412 return REGNAME;
1413 }
1414 for (c = 0; c < num_std_regs; c++)
1415 if (namelen - 1 == strlen (std_regs[c].name)
45fe3db4 1416 && STREQN (tokstart + 1, std_regs[c].name, namelen - 1))
3d6b6a90
JG
1417 {
1418 yylval.lval = std_regs[c].regnum;
1419 return REGNAME;
1420 }
1421 }
1422 /* Catch specific keywords. Should be done with a data structure. */
1423 switch (namelen)
1424 {
1425 case 8:
45fe3db4 1426 if (STREQN (tokstart, "unsigned", 8))
3d6b6a90 1427 return UNSIGNED;
5a4e7215 1428 if (current_language->la_language == language_cplus
45fe3db4 1429 && STREQN (tokstart, "template", 8))
4c53d9ca 1430 return TEMPLATE;
45fe3db4 1431 if (STREQN (tokstart, "volatile", 8))
a252e715 1432 return VOLATILE_KEYWORD;
3d6b6a90
JG
1433 break;
1434 case 6:
45fe3db4 1435 if (STREQN (tokstart, "struct", 6))
3d6b6a90 1436 return STRUCT;
45fe3db4 1437 if (STREQN (tokstart, "signed", 6))
088c3a0b 1438 return SIGNED_KEYWORD;
45fe3db4 1439 if (STREQN (tokstart, "sizeof", 6))
3d6b6a90
JG
1440 return SIZEOF;
1441 break;
1442 case 5:
866ecded 1443 if (current_language->la_language == language_cplus
45fe3db4 1444 && STREQN (tokstart, "class", 5))
8050a57b 1445 return CLASS;
45fe3db4 1446 if (STREQN (tokstart, "union", 5))
3d6b6a90 1447 return UNION;
45fe3db4 1448 if (STREQN (tokstart, "short", 5))
3d6b6a90 1449 return SHORT;
45fe3db4 1450 if (STREQN (tokstart, "const", 5))
a252e715 1451 return CONST_KEYWORD;
3d6b6a90
JG
1452 break;
1453 case 4:
45fe3db4 1454 if (STREQN (tokstart, "enum", 4))
3d6b6a90 1455 return ENUM;
45fe3db4 1456 if (STREQN (tokstart, "long", 4))
3d6b6a90 1457 return LONG;
5a4e7215 1458 if (current_language->la_language == language_cplus
45fe3db4 1459 && STREQN (tokstart, "this", 4))
3d6b6a90
JG
1460 {
1461 static const char this_name[] =
1462 { CPLUS_MARKER, 't', 'h', 'i', 's', '\0' };
1463
1464 if (lookup_symbol (this_name, expression_context_block,
1465 VAR_NAMESPACE, 0, NULL))
1466 return THIS;
1467 }
1468 break;
1469 case 3:
45fe3db4 1470 if (STREQN (tokstart, "int", 3))
3d6b6a90
JG
1471 return INT_KEYWORD;
1472 break;
1473 default:
1474 break;
1475 }
1476
1477 yylval.sval.ptr = tokstart;
1478 yylval.sval.length = namelen;
1479
1480 /* Any other names starting in $ are debugger internal variables. */
1481
1482 if (*tokstart == '$')
1483 {
1484 yylval.ivar = lookup_internalvar (copy_name (yylval.sval) + 1);
1485 return VARIABLE;
1486 }
1487
1488 /* Use token-type BLOCKNAME for symbols that happen to be defined as
1489 functions or symtabs. If this is not so, then ...
1490 Use token-type TYPENAME for symbols that happen to be defined
1491 currently as names of types; NAME for other symbols.
1492 The caller is not constrained to care about the distinction. */
1493 {
1494 char *tmp = copy_name (yylval.sval);
1495 struct symbol *sym;
1496 int is_a_field_of_this = 0;
1497 int hextype;
1498
1499 sym = lookup_symbol (tmp, expression_context_block,
545af6ce
PB
1500 VAR_NAMESPACE,
1501 current_language->la_language == language_cplus
1502 ? &is_a_field_of_this : NULL,
1503 NULL);
3d6b6a90
JG
1504 if ((sym && SYMBOL_CLASS (sym) == LOC_BLOCK) ||
1505 lookup_partial_symtab (tmp))
1506 {
1507 yylval.ssym.sym = sym;
1508 yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1509 return BLOCKNAME;
1510 }
1511 if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
1512 {
1513 yylval.tsym.type = SYMBOL_TYPE (sym);
1514 return TYPENAME;
1515 }
1516 if ((yylval.tsym.type = lookup_primitive_typename (tmp)) != 0)
1517 return TYPENAME;
1518
1519 /* Input names that aren't symbols but ARE valid hex numbers,
1520 when the input radix permits them, can be names or numbers
1521 depending on the parse. Note we support radixes > 16 here. */
1522 if (!sym &&
1523 ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10) ||
1524 (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
1525 {
1526 YYSTYPE newlval; /* Its value is ignored. */
1527 hextype = parse_number (tokstart, namelen, 0, &newlval);
1528 if (hextype == INT)
1529 {
1530 yylval.ssym.sym = sym;
1531 yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1532 return NAME_OR_INT;
1533 }
3d6b6a90
JG
1534 }
1535
1536 /* Any other kind of symbol */
1537 yylval.ssym.sym = sym;
1538 yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1539 return NAME;
1540 }
1541}
1542
1543void
1544yyerror (msg)
1545 char *msg;
1546{
d671e293 1547 error (msg ? msg : "Invalid syntax in expression.");
3d6b6a90 1548}
This page took 0.133985 seconds and 4 git commands to generate.