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