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