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