* aoutf1.h (sunos4_write_object_contents): set flags to 0, fixing
[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
2640f7e1 555 if (strcmp (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);
1ab3bf1b 594 write_exp_elt_longcst ((LONGEST) msymbol -> address);
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);
1ab3bf1b 679 write_exp_elt_longcst ((LONGEST) msymbol -> address);
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;
708
709 while (!done)
710 switch (pop_type ())
711 {
712 case tp_end:
713 done = 1;
714 break;
715 case tp_pointer:
716 follow_type = lookup_pointer_type (follow_type);
717 break;
718 case tp_reference:
719 follow_type = lookup_reference_type (follow_type);
720 break;
721 case tp_array:
722 array_size = pop_type_int ();
723 if (array_size != -1)
85f0a848
FF
724 follow_type =
725 create_array_type ((struct type *) NULL,
726 follow_type, builtin_type_int,
727 0, array_size - 1);
3d6b6a90
JG
728 else
729 follow_type = lookup_pointer_type (follow_type);
730 break;
731 case tp_function:
732 follow_type = lookup_function_type (follow_type);
733 break;
734 }
735 $$ = follow_type;
736 }
737 ;
738
739abs_decl: '*'
740 { push_type (tp_pointer); $$ = 0; }
741 | '*' abs_decl
742 { push_type (tp_pointer); $$ = $2; }
743 | '&'
744 { push_type (tp_reference); $$ = 0; }
745 | '&' abs_decl
746 { push_type (tp_reference); $$ = $2; }
747 | direct_abs_decl
748 ;
749
750direct_abs_decl: '(' abs_decl ')'
751 { $$ = $2; }
752 | direct_abs_decl array_mod
753 {
754 push_type_int ($2);
755 push_type (tp_array);
756 }
757 | array_mod
758 {
759 push_type_int ($1);
760 push_type (tp_array);
761 $$ = 0;
762 }
763 | direct_abs_decl func_mod
764 { push_type (tp_function); }
765 | func_mod
766 { push_type (tp_function); }
767 ;
768
769array_mod: '[' ']'
770 { $$ = -1; }
771 | '[' INT ']'
2e6edad1 772 { $$ = $2.val; }
3d6b6a90
JG
773 ;
774
775func_mod: '(' ')'
776 { $$ = 0; }
0e2a896c 777 | '(' nonempty_typelist ')'
be772100 778 { free ((PTR)$2); $$ = 0; }
3d6b6a90
JG
779 ;
780
781type : ptype
2640f7e1
JG
782 | typebase COLONCOLON '*'
783 { $$ = lookup_member_type (builtin_type_int, $1); }
3d6b6a90
JG
784 | type '(' typebase COLONCOLON '*' ')'
785 { $$ = lookup_member_type ($1, $3); }
786 | type '(' typebase COLONCOLON '*' ')' '(' ')'
787 { $$ = lookup_member_type
788 (lookup_function_type ($1), $3); }
789 | type '(' typebase COLONCOLON '*' ')' '(' nonempty_typelist ')'
790 { $$ = lookup_member_type
791 (lookup_function_type ($1), $3);
be772100 792 free ((PTR)$8); }
3d6b6a90
JG
793 ;
794
10a297b7 795typebase /* Implements (approximately): (type-qualifier)* type-specifier */
3d6b6a90
JG
796 : TYPENAME
797 { $$ = $1.type; }
798 | INT_KEYWORD
799 { $$ = builtin_type_int; }
800 | LONG
801 { $$ = builtin_type_long; }
802 | SHORT
803 { $$ = builtin_type_short; }
804 | LONG INT_KEYWORD
805 { $$ = builtin_type_long; }
806 | UNSIGNED LONG INT_KEYWORD
807 { $$ = builtin_type_unsigned_long; }
808 | LONG LONG
809 { $$ = builtin_type_long_long; }
810 | LONG LONG INT_KEYWORD
811 { $$ = builtin_type_long_long; }
812 | UNSIGNED LONG LONG
813 { $$ = builtin_type_unsigned_long_long; }
814 | UNSIGNED LONG LONG INT_KEYWORD
815 { $$ = builtin_type_unsigned_long_long; }
816 | SHORT INT_KEYWORD
817 { $$ = builtin_type_short; }
818 | UNSIGNED SHORT INT_KEYWORD
819 { $$ = builtin_type_unsigned_short; }
820 | STRUCT name
821 { $$ = lookup_struct (copy_name ($2),
822 expression_context_block); }
8050a57b
FF
823 | CLASS name
824 { $$ = lookup_struct (copy_name ($2),
825 expression_context_block); }
3d6b6a90
JG
826 | UNION name
827 { $$ = lookup_union (copy_name ($2),
828 expression_context_block); }
829 | ENUM name
830 { $$ = lookup_enum (copy_name ($2),
831 expression_context_block); }
832 | UNSIGNED typename
833 { $$ = lookup_unsigned_typename (TYPE_NAME($2.type)); }
834 | UNSIGNED
835 { $$ = builtin_type_unsigned_int; }
088c3a0b 836 | SIGNED_KEYWORD typename
a252e715 837 { $$ = lookup_signed_typename (TYPE_NAME($2.type)); }
088c3a0b 838 | SIGNED_KEYWORD
3d6b6a90 839 { $$ = builtin_type_int; }
4c53d9ca
DHW
840 | TEMPLATE name '<' type '>'
841 { $$ = lookup_template_type(copy_name($2), $4,
842 expression_context_block);
843 }
10a297b7
PB
844 /* "const" and "volatile" are curently ignored. */
845 | CONST_KEYWORD typebase { $$ = $2; }
846 | VOLATILE_KEYWORD typebase { $$ = $2; }
3d6b6a90
JG
847 ;
848
849typename: TYPENAME
850 | INT_KEYWORD
851 {
852 $$.stoken.ptr = "int";
853 $$.stoken.length = 3;
854 $$.type = builtin_type_int;
855 }
856 | LONG
857 {
858 $$.stoken.ptr = "long";
859 $$.stoken.length = 4;
860 $$.type = builtin_type_long;
861 }
862 | SHORT
863 {
864 $$.stoken.ptr = "short";
865 $$.stoken.length = 5;
866 $$.type = builtin_type_short;
867 }
868 ;
869
870nonempty_typelist
871 : type
e35843d4 872 { $$ = (struct type **) malloc (sizeof (struct type *) * 2);
6c316cfd 873 $<ivec>$[0] = 1; /* Number of types in vector */
3d6b6a90
JG
874 $$[1] = $1;
875 }
876 | nonempty_typelist ',' type
6c316cfd 877 { int len = sizeof (struct type *) * (++($<ivec>1[0]) + 1);
e35843d4 878 $$ = (struct type **) realloc ((char *) $1, len);
3d6b6a90
JG
879 $$[$<ivec>$[0]] = $3;
880 }
881 ;
882
883name : NAME { $$ = $1.stoken; }
884 | BLOCKNAME { $$ = $1.stoken; }
885 | TYPENAME { $$ = $1.stoken; }
886 | NAME_OR_INT { $$ = $1.stoken; }
3d6b6a90
JG
887 ;
888
889name_not_typename : NAME
890 | BLOCKNAME
891/* These would be useful if name_not_typename was useful, but it is just
892 a fake for "variable", so these cause reduce/reduce conflicts because
893 the parser can't tell whether NAME_OR_INT is a name_not_typename (=variable,
894 =exp) or just an exp. If name_not_typename was ever used in an lvalue
895 context where only a name could occur, this might be useful.
896 | NAME_OR_INT
3d6b6a90
JG
897 */
898 ;
899
900%%
901
902/* Take care of parsing a number (anything that starts with a digit).
903 Set yylval and return the token type; update lexptr.
904 LEN is the number of characters in it. */
905
906/*** Needs some error checking for the float case ***/
907
908static int
909parse_number (p, len, parsed_float, putithere)
910 register char *p;
911 register int len;
912 int parsed_float;
913 YYSTYPE *putithere;
914{
915 register LONGEST n = 0;
916 register LONGEST prevn = 0;
917 register int i;
918 register int c;
919 register int base = input_radix;
920 int unsigned_p = 0;
2e6edad1
SC
921 int long_p = 0;
922 LONGEST high_bit;
923 struct type *signed_type;
924 struct type *unsigned_type;
3d6b6a90 925
3d6b6a90
JG
926 if (parsed_float)
927 {
928 /* It's a float since it contains a point or an exponent. */
929 putithere->dval = atof (p);
930 return FLOAT;
931 }
932
933 /* Handle base-switching prefixes 0x, 0t, 0d, 0 */
934 if (p[0] == '0')
935 switch (p[1])
936 {
937 case 'x':
938 case 'X':
939 if (len >= 3)
940 {
941 p += 2;
942 base = 16;
943 len -= 2;
944 }
945 break;
946
947 case 't':
948 case 'T':
949 case 'd':
950 case 'D':
951 if (len >= 3)
952 {
953 p += 2;
954 base = 10;
955 len -= 2;
956 }
957 break;
958
959 default:
960 base = 8;
961 break;
962 }
963
964 while (len-- > 0)
965 {
966 c = *p++;
967 if (c >= 'A' && c <= 'Z')
968 c += 'a' - 'A';
969 if (c != 'l' && c != 'u')
970 n *= base;
971 if (c >= '0' && c <= '9')
972 n += i = c - '0';
973 else
974 {
975 if (base > 10 && c >= 'a' && c <= 'f')
976 n += i = c - 'a' + 10;
2e6edad1
SC
977 else if (len == 0 && c == 'l')
978 long_p = 1;
3d6b6a90
JG
979 else if (len == 0 && c == 'u')
980 unsigned_p = 1;
981 else
982 return ERROR; /* Char not a digit */
983 }
984 if (i >= base)
985 return ERROR; /* Invalid digit in this base */
2e6edad1 986
2a5ec41d
JG
987 /* Portably test for overflow (only works for nonzero values, so make
988 a second check for zero). */
989 if((prevn >= n) && n != 0)
3d6b6a90 990 unsigned_p=1; /* Try something unsigned */
2a5ec41d 991 /* If range checking enabled, portably test for unsigned overflow. */
3d6b6a90
JG
992 if(RANGE_CHECK && n!=0)
993 {
994 if((unsigned_p && (unsigned)prevn >= (unsigned)n))
995 range_error("Overflow on numeric constant.");
996 }
997 prevn=n;
998 }
2e6edad1
SC
999
1000 /* If the number is too big to be an int, or it's got an l suffix
1001 then it's a long. Work out if this has to be a long by
1002 shifting right and and seeing if anything remains, and the
1003 target int size is different to the target long size. */
3d6b6a90 1004
2e6edad1
SC
1005 if ((TARGET_INT_BIT != TARGET_LONG_BIT && (n >> TARGET_INT_BIT)) || long_p)
1006 {
1007 high_bit = ((LONGEST)1) << (TARGET_LONG_BIT-1);
1008 unsigned_type = builtin_type_unsigned_long;
1009 signed_type = builtin_type_long;
1010 }
1011 else
1012 {
1013 high_bit = ((LONGEST)1) << (TARGET_INT_BIT-1);
1014 unsigned_type = builtin_type_unsigned_int;
1015 signed_type = builtin_type_int;
1016 }
1017
1018 putithere->typed_val.val = n;
1019
1020 /* If the high bit of the worked out type is set then this number
1021 has to be unsigned. */
1022
1023 if (unsigned_p || (n & high_bit))
1024 {
1025 putithere->typed_val.type = unsigned_type;
1026 }
1027 else
1028 {
1029 putithere->typed_val.type = signed_type;
1030 }
1031
1032 return INT;
3d6b6a90
JG
1033}
1034
1035struct token
1036{
1037 char *operator;
1038 int token;
1039 enum exp_opcode opcode;
1040};
1041
1042const static struct token tokentab3[] =
1043 {
1044 {">>=", ASSIGN_MODIFY, BINOP_RSH},
1045 {"<<=", ASSIGN_MODIFY, BINOP_LSH}
1046 };
1047
1048const static struct token tokentab2[] =
1049 {
1050 {"+=", ASSIGN_MODIFY, BINOP_ADD},
1051 {"-=", ASSIGN_MODIFY, BINOP_SUB},
1052 {"*=", ASSIGN_MODIFY, BINOP_MUL},
1053 {"/=", ASSIGN_MODIFY, BINOP_DIV},
1054 {"%=", ASSIGN_MODIFY, BINOP_REM},
e58de8a2
FF
1055 {"|=", ASSIGN_MODIFY, BINOP_BITWISE_IOR},
1056 {"&=", ASSIGN_MODIFY, BINOP_BITWISE_AND},
1057 {"^=", ASSIGN_MODIFY, BINOP_BITWISE_XOR},
3d6b6a90
JG
1058 {"++", INCREMENT, BINOP_END},
1059 {"--", DECREMENT, BINOP_END},
1060 {"->", ARROW, BINOP_END},
088c3a0b
JG
1061 {"&&", ANDAND, BINOP_END},
1062 {"||", OROR, BINOP_END},
3d6b6a90
JG
1063 {"::", COLONCOLON, BINOP_END},
1064 {"<<", LSH, BINOP_END},
1065 {">>", RSH, BINOP_END},
1066 {"==", EQUAL, BINOP_END},
1067 {"!=", NOTEQUAL, BINOP_END},
1068 {"<=", LEQ, BINOP_END},
1069 {">=", GEQ, BINOP_END}
1070 };
1071
1072/* Read one token, getting characters through lexptr. */
1073
1074int
1075yylex ()
1076{
bac89d6c
FF
1077 int c;
1078 int namelen;
1079 unsigned int i;
1080 char *tokstart;
1081 char *tokptr;
1082 int tempbufindex;
1083 static char *tempbuf;
1084 static int tempbufsize;
1085
3d6b6a90
JG
1086 retry:
1087
1088 tokstart = lexptr;
1089 /* See if it is a special token of length 3. */
1090 for (i = 0; i < sizeof tokentab3 / sizeof tokentab3[0]; i++)
1091 if (!strncmp (tokstart, tokentab3[i].operator, 3))
1092 {
1093 lexptr += 3;
1094 yylval.opcode = tokentab3[i].opcode;
1095 return tokentab3[i].token;
1096 }
1097
1098 /* See if it is a special token of length 2. */
1099 for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++)
1100 if (!strncmp (tokstart, tokentab2[i].operator, 2))
1101 {
1102 lexptr += 2;
1103 yylval.opcode = tokentab2[i].opcode;
1104 return tokentab2[i].token;
1105 }
1106
1107 switch (c = *tokstart)
1108 {
1109 case 0:
1110 return 0;
1111
1112 case ' ':
1113 case '\t':
1114 case '\n':
1115 lexptr++;
1116 goto retry;
1117
1118 case '\'':
d630b615
FF
1119 /* We either have a character constant ('0' or '\177' for example)
1120 or we have a quoted symbol reference ('foo(int,int)' in C++
1121 for example). */
3d6b6a90
JG
1122 lexptr++;
1123 c = *lexptr++;
1124 if (c == '\\')
1125 c = parse_escape (&lexptr);
2e6edad1
SC
1126
1127 yylval.typed_val.val = c;
1128 yylval.typed_val.type = builtin_type_char;
1129
3d6b6a90
JG
1130 c = *lexptr++;
1131 if (c != '\'')
d630b615
FF
1132 {
1133 namelen = skip_quoted (tokstart) - tokstart;
1134 if (namelen > 2)
1135 {
1136 lexptr = tokstart + namelen;
1137 namelen -= 2;
1138 tokstart++;
1139 goto tryname;
1140 }
1141 error ("Invalid character constant.");
1142 }
2e6edad1 1143 return INT;
3d6b6a90
JG
1144
1145 case '(':
1146 paren_depth++;
1147 lexptr++;
1148 return c;
1149
1150 case ')':
1151 if (paren_depth == 0)
1152 return 0;
1153 paren_depth--;
1154 lexptr++;
1155 return c;
1156
1157 case ',':
1158 if (comma_terminates && paren_depth == 0)
1159 return 0;
1160 lexptr++;
1161 return c;
1162
1163 case '.':
1164 /* Might be a floating point number. */
1165 if (lexptr[1] < '0' || lexptr[1] > '9')
1166 goto symbol; /* Nope, must be a symbol. */
1167 /* FALL THRU into number case. */
1168
1169 case '0':
1170 case '1':
1171 case '2':
1172 case '3':
1173 case '4':
1174 case '5':
1175 case '6':
1176 case '7':
1177 case '8':
1178 case '9':
1179 {
1180 /* It's a number. */
1181 int got_dot = 0, got_e = 0, toktype;
1182 register char *p = tokstart;
1183 int hex = input_radix > 10;
1184
1185 if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
1186 {
1187 p += 2;
1188 hex = 1;
1189 }
1190 else if (c == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D'))
1191 {
1192 p += 2;
1193 hex = 0;
1194 }
1195
1196 for (;; ++p)
1197 {
1198 if (!hex && !got_e && (*p == 'e' || *p == 'E'))
1199 got_dot = got_e = 1;
1200 else if (!hex && !got_dot && *p == '.')
1201 got_dot = 1;
1202 else if (got_e && (p[-1] == 'e' || p[-1] == 'E')
1203 && (*p == '-' || *p == '+'))
1204 /* This is the sign of the exponent, not the end of the
1205 number. */
1206 continue;
1207 /* We will take any letters or digits. parse_number will
1208 complain if past the radix, or if L or U are not final. */
1209 else if ((*p < '0' || *p > '9')
1210 && ((*p < 'a' || *p > 'z')
1211 && (*p < 'A' || *p > 'Z')))
1212 break;
1213 }
1214 toktype = parse_number (tokstart, p - tokstart, got_dot|got_e, &yylval);
1215 if (toktype == ERROR)
1216 {
1217 char *err_copy = (char *) alloca (p - tokstart + 1);
1218
4ed3a9ea 1219 memcpy (err_copy, tokstart, p - tokstart);
3d6b6a90
JG
1220 err_copy[p - tokstart] = 0;
1221 error ("Invalid number \"%s\".", err_copy);
1222 }
1223 lexptr = p;
1224 return toktype;
1225 }
1226
1227 case '+':
1228 case '-':
1229 case '*':
1230 case '/':
1231 case '%':
1232 case '|':
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 symbol:
1248 lexptr++;
1249 return c;
1250
1251 case '"':
bac89d6c
FF
1252
1253 /* Build the gdb internal form of the input string in tempbuf,
1254 translating any standard C escape forms seen. Note that the
1255 buffer is null byte terminated *only* for the convenience of
1256 debugging gdb itself and printing the buffer contents when
1257 the buffer contains no embedded nulls. Gdb does not depend
1258 upon the buffer being null byte terminated, it uses the length
1259 string instead. This allows gdb to handle C strings (as well
1260 as strings in other languages) with embedded null bytes */
1261
1262 tokptr = ++tokstart;
1263 tempbufindex = 0;
1264
1265 do {
1266 /* Grow the static temp buffer if necessary, including allocating
1267 the first one on demand. */
1268 if (tempbufindex + 1 >= tempbufsize)
3d6b6a90 1269 {
bac89d6c
FF
1270 tempbuf = (char *) realloc (tempbuf, tempbufsize += 64);
1271 }
1272 switch (*tokptr)
1273 {
1274 case '\0':
1275 case '"':
1276 /* Do nothing, loop will terminate. */
1277 break;
1278 case '\\':
1279 tokptr++;
1280 c = parse_escape (&tokptr);
1281 if (c == -1)
3d6b6a90 1282 {
bac89d6c 1283 continue;
3d6b6a90 1284 }
bac89d6c
FF
1285 tempbuf[tempbufindex++] = c;
1286 break;
1287 default:
1288 tempbuf[tempbufindex++] = *tokptr++;
1289 break;
3d6b6a90 1290 }
bac89d6c
FF
1291 } while ((*tokptr != '"') && (*tokptr != '\0'));
1292 if (*tokptr++ != '"')
1293 {
1294 error ("Unterminated string in expression.");
1295 }
1296 tempbuf[tempbufindex] = '\0'; /* See note above */
1297 yylval.sval.ptr = tempbuf;
1298 yylval.sval.length = tempbufindex;
1299 lexptr = tokptr;
1300 return (STRING);
3d6b6a90
JG
1301 }
1302
1303 if (!(c == '_' || c == '$'
1304 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
1305 /* We must have come across a bad character (e.g. ';'). */
1306 error ("Invalid character '%c' in expression.", c);
1307
1308 /* It's a name. See how long it is. */
1309 namelen = 0;
1310 for (c = tokstart[namelen];
1311 (c == '_' || c == '$' || (c >= '0' && c <= '9')
1312 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
1313 c = tokstart[++namelen])
1314 ;
1315
1316 /* The token "if" terminates the expression and is NOT
1317 removed from the input stream. */
1318 if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f')
1319 {
1320 return 0;
1321 }
1322
1323 lexptr += namelen;
1324
1325 /* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1)
1326 and $$digits (equivalent to $<-digits> if you could type that).
1327 Make token type LAST, and put the number (the digits) in yylval. */
1328
d630b615 1329 tryname:
3d6b6a90
JG
1330 if (*tokstart == '$')
1331 {
1332 register int negate = 0;
1333 c = 1;
1334 /* Double dollar means negate the number and add -1 as well.
1335 Thus $$ alone means -1. */
1336 if (namelen >= 2 && tokstart[1] == '$')
1337 {
1338 negate = 1;
1339 c = 2;
1340 }
1341 if (c == namelen)
1342 {
1343 /* Just dollars (one or two) */
1344 yylval.lval = - negate;
1345 return LAST;
1346 }
1347 /* Is the rest of the token digits? */
1348 for (; c < namelen; c++)
1349 if (!(tokstart[c] >= '0' && tokstart[c] <= '9'))
1350 break;
1351 if (c == namelen)
1352 {
1353 yylval.lval = atoi (tokstart + 1 + negate);
1354 if (negate)
1355 yylval.lval = - yylval.lval;
1356 return LAST;
1357 }
1358 }
1359
1360 /* Handle tokens that refer to machine registers:
1361 $ followed by a register name. */
1362
1363 if (*tokstart == '$') {
1364 for (c = 0; c < NUM_REGS; c++)
1365 if (namelen - 1 == strlen (reg_names[c])
1366 && !strncmp (tokstart + 1, reg_names[c], namelen - 1))
1367 {
1368 yylval.lval = c;
1369 return REGNAME;
1370 }
1371 for (c = 0; c < num_std_regs; c++)
1372 if (namelen - 1 == strlen (std_regs[c].name)
1373 && !strncmp (tokstart + 1, std_regs[c].name, namelen - 1))
1374 {
1375 yylval.lval = std_regs[c].regnum;
1376 return REGNAME;
1377 }
1378 }
1379 /* Catch specific keywords. Should be done with a data structure. */
1380 switch (namelen)
1381 {
1382 case 8:
1383 if (!strncmp (tokstart, "unsigned", 8))
1384 return UNSIGNED;
5a4e7215
JG
1385 if (current_language->la_language == language_cplus
1386 && !strncmp (tokstart, "template", 8))
4c53d9ca 1387 return TEMPLATE;
a252e715
PB
1388 if (!strncmp (tokstart, "volatile", 8))
1389 return VOLATILE_KEYWORD;
3d6b6a90
JG
1390 break;
1391 case 6:
1392 if (!strncmp (tokstart, "struct", 6))
1393 return STRUCT;
1394 if (!strncmp (tokstart, "signed", 6))
088c3a0b 1395 return SIGNED_KEYWORD;
3d6b6a90
JG
1396 if (!strncmp (tokstart, "sizeof", 6))
1397 return SIZEOF;
1398 break;
1399 case 5:
866ecded
FF
1400 if (current_language->la_language == language_cplus
1401 && !strncmp (tokstart, "class", 5))
8050a57b 1402 return CLASS;
3d6b6a90
JG
1403 if (!strncmp (tokstart, "union", 5))
1404 return UNION;
1405 if (!strncmp (tokstart, "short", 5))
1406 return SHORT;
a252e715
PB
1407 if (!strncmp (tokstart, "const", 5))
1408 return CONST_KEYWORD;
3d6b6a90
JG
1409 break;
1410 case 4:
1411 if (!strncmp (tokstart, "enum", 4))
1412 return ENUM;
1413 if (!strncmp (tokstart, "long", 4))
1414 return LONG;
5a4e7215
JG
1415 if (current_language->la_language == language_cplus
1416 && !strncmp (tokstart, "this", 4))
3d6b6a90
JG
1417 {
1418 static const char this_name[] =
1419 { CPLUS_MARKER, 't', 'h', 'i', 's', '\0' };
1420
1421 if (lookup_symbol (this_name, expression_context_block,
1422 VAR_NAMESPACE, 0, NULL))
1423 return THIS;
1424 }
1425 break;
1426 case 3:
1427 if (!strncmp (tokstart, "int", 3))
1428 return INT_KEYWORD;
1429 break;
1430 default:
1431 break;
1432 }
1433
1434 yylval.sval.ptr = tokstart;
1435 yylval.sval.length = namelen;
1436
1437 /* Any other names starting in $ are debugger internal variables. */
1438
1439 if (*tokstart == '$')
1440 {
1441 yylval.ivar = lookup_internalvar (copy_name (yylval.sval) + 1);
1442 return VARIABLE;
1443 }
1444
1445 /* Use token-type BLOCKNAME for symbols that happen to be defined as
1446 functions or symtabs. If this is not so, then ...
1447 Use token-type TYPENAME for symbols that happen to be defined
1448 currently as names of types; NAME for other symbols.
1449 The caller is not constrained to care about the distinction. */
1450 {
1451 char *tmp = copy_name (yylval.sval);
1452 struct symbol *sym;
1453 int is_a_field_of_this = 0;
1454 int hextype;
1455
1456 sym = lookup_symbol (tmp, expression_context_block,
545af6ce
PB
1457 VAR_NAMESPACE,
1458 current_language->la_language == language_cplus
1459 ? &is_a_field_of_this : NULL,
1460 NULL);
3d6b6a90
JG
1461 if ((sym && SYMBOL_CLASS (sym) == LOC_BLOCK) ||
1462 lookup_partial_symtab (tmp))
1463 {
1464 yylval.ssym.sym = sym;
1465 yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1466 return BLOCKNAME;
1467 }
1468 if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
1469 {
1470 yylval.tsym.type = SYMBOL_TYPE (sym);
1471 return TYPENAME;
1472 }
1473 if ((yylval.tsym.type = lookup_primitive_typename (tmp)) != 0)
1474 return TYPENAME;
1475
1476 /* Input names that aren't symbols but ARE valid hex numbers,
1477 when the input radix permits them, can be names or numbers
1478 depending on the parse. Note we support radixes > 16 here. */
1479 if (!sym &&
1480 ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10) ||
1481 (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
1482 {
1483 YYSTYPE newlval; /* Its value is ignored. */
1484 hextype = parse_number (tokstart, namelen, 0, &newlval);
1485 if (hextype == INT)
1486 {
1487 yylval.ssym.sym = sym;
1488 yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1489 return NAME_OR_INT;
1490 }
3d6b6a90
JG
1491 }
1492
1493 /* Any other kind of symbol */
1494 yylval.ssym.sym = sym;
1495 yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1496 return NAME;
1497 }
1498}
1499
1500void
1501yyerror (msg)
1502 char *msg;
1503{
d671e293 1504 error (msg ? msg : "Invalid syntax in expression.");
3d6b6a90 1505}
This page took 0.124778 seconds and 4 git commands to generate.