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