Copy edit File-I/O section of manual
[deliverable/binutils-gdb.git] / gdb / objc-exp.y
CommitLineData
b81654f1 1/* YACC parser for C expressions, for GDB.
b81654f1 2
48426bc2
AO
3 Copyright (C) 1986, 1989, 1990, 1991, 1993, 1994, 2002, 2006
4 Free Software Foundation, Inc.
b81654f1 5
437666f8
AC
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
b81654f1 10
437666f8
AC
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
b81654f1 15
437666f8
AC
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
197e01b6
EZ
18 Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 Boston, MA 02110-1301, USA. */
b81654f1 20
3b4efeaa
MS
21/* Parse a C expression from text in a string, and return the result
22 as a struct expression pointer. That structure contains arithmetic
23 operations in reverse polish, with constants represented by
24 operations that are followed by special data. See expression.h for
25 the details of the format. What is important here is that it can
26 be built up sequentially during the process of parsing; the lower
27 levels of the tree always come first in the result.
b81654f1
MS
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
3b4efeaa
MS
31 makefile that remaps any other malloc/realloc inserted by the
32 parser generator. Doing this with #defines and trying to control
33 the interaction with include files (<malloc.h> and <stdlib.h> for
34 example) just became too messy, particularly when such includes can
35 be inserted at random times by the parser generator. */
b81654f1
MS
36
37%{
38
39#include "defs.h"
40#include "gdb_string.h"
41#include <ctype.h>
42#include "expression.h"
43
3b4efeaa 44#include "objc-lang.h" /* For objc language constructs. */
b81654f1
MS
45
46#include "value.h"
47#include "parser-defs.h"
48#include "language.h"
49#include "c-lang.h"
50#include "bfd.h" /* Required by objfiles.h. */
51#include "symfile.h" /* Required by objfiles.h. */
3b4efeaa 52#include "objfiles.h" /* For have_full_symbols and have_partial_symbols. */
b81654f1
MS
53#include "top.h"
54#include "completer.h" /* For skip_quoted(). */
fe898f56 55#include "block.h"
b81654f1 56
3b4efeaa
MS
57/* Remap normal yacc parser interface names (yyparse, yylex, yyerror,
58 etc), as well as gratuitiously global symbol names, so we can have
59 multiple yacc generated parsers in gdb. Note that these are only
60 the variables produced by yacc. If other parser generators (bison,
61 byacc, etc) produce additional global names that conflict at link
62 time, then those parser generators need to be fixed instead of
63 adding those names to this list. */
b81654f1
MS
64
65#define yymaxdepth objc_maxdepth
66#define yyparse objc_parse
67#define yylex objc_lex
68#define yyerror objc_error
69#define yylval objc_lval
70#define yychar objc_char
71#define yydebug objc_debug
72#define yypact objc_pact
73#define yyr1 objc_r1
74#define yyr2 objc_r2
75#define yydef objc_def
76#define yychk objc_chk
77#define yypgo objc_pgo
78#define yyact objc_act
79#define yyexca objc_exca
80#define yyerrflag objc_errflag
81#define yynerrs objc_nerrs
82#define yyps objc_ps
83#define yypv objc_pv
84#define yys objc_s
85#define yy_yys objc_yys
86#define yystate objc_state
87#define yytmp objc_tmp
88#define yyv objc_v
89#define yy_yyv objc_yyv
90#define yyval objc_val
91#define yylloc objc_lloc
92#define yyreds objc_reds /* With YYDEBUG defined */
93#define yytoks objc_toks /* With YYDEBUG defined */
94#define yyname objc_name /* With YYDEBUG defined */
95#define yyrule objc_rule /* With YYDEBUG defined */
96#define yylhs objc_yylhs
97#define yylen objc_yylen
98#define yydefred objc_yydefred
99#define yydgoto objc_yydgoto
100#define yysindex objc_yysindex
101#define yyrindex objc_yyrindex
102#define yygindex objc_yygindex
103#define yytable objc_yytable
104#define yycheck objc_yycheck
105
106#ifndef YYDEBUG
3b4efeaa 107#define YYDEBUG 0 /* Default to no yydebug support. */
b81654f1
MS
108#endif
109
110int
111yyparse PARAMS ((void));
112
113static int
114yylex PARAMS ((void));
115
116void
117yyerror PARAMS ((char *));
118
119%}
120
121/* Although the yacc "value" of an expression is not used,
122 since the result is stored in the structure being created,
123 other node types do have values. */
124
125%union
126 {
127 LONGEST lval;
128 struct {
129 LONGEST val;
130 struct type *type;
131 } typed_val_int;
132 struct {
133 DOUBLEST dval;
134 struct type *type;
135 } typed_val_float;
136 struct symbol *sym;
137 struct type *tval;
138 struct stoken sval;
139 struct ttype tsym;
140 struct symtoken ssym;
141 int voidval;
142 struct block *bval;
143 enum exp_opcode opcode;
144 struct internalvar *ivar;
145 struct objc_class_str class;
146
147 struct type **tvec;
148 int *ivec;
149 }
150
151%{
3b4efeaa 152/* YYSTYPE gets defined by %union. */
b81654f1
MS
153static int
154parse_number PARAMS ((char *, int, int, YYSTYPE *));
155%}
156
157%type <voidval> exp exp1 type_exp start variable qualified_name lcurly
158%type <lval> rcurly
159%type <tval> type typebase
160%type <tvec> nonempty_typelist
161/* %type <bval> block */
162
163/* Fancy type parsing. */
164%type <voidval> func_mod direct_abs_decl abs_decl
165%type <tval> ptype
166%type <lval> array_mod
167
168%token <typed_val_int> INT
169%token <typed_val_float> FLOAT
170
3b4efeaa
MS
171/* Both NAME and TYPENAME tokens represent symbols in the input, and
172 both convey their data as strings. But a TYPENAME is a string that
173 happens to be defined as a typedef or builtin type name (such as
174 int or char) and a NAME is any other symbol. Contexts where this
175 distinction is not important can use the nonterminal "name", which
176 matches either NAME or TYPENAME. */
b81654f1
MS
177
178%token <sval> STRING
179%token <sval> NSSTRING /* ObjC Foundation "NSString" literal */
180%token <sval> SELECTOR /* ObjC "@selector" pseudo-operator */
181%token <ssym> NAME /* BLOCKNAME defined below to give it higher precedence. */
182%token <tsym> TYPENAME
183%token <class> CLASSNAME /* ObjC Class name */
184%type <sval> name
185%type <ssym> name_not_typename
186%type <tsym> typename
187
188/* A NAME_OR_INT is a symbol which is not known in the symbol table,
189 but which would parse as a valid number in the current input radix.
190 E.g. "c" when input_radix==16. Depending on the parse, it will be
191 turned into a name or into a number. */
192
193%token <ssym> NAME_OR_INT
194
195%token STRUCT CLASS UNION ENUM SIZEOF UNSIGNED COLONCOLON
196%token TEMPLATE
197%token ERROR
198
3b4efeaa
MS
199/* Special type cases, put in to allow the parser to distinguish
200 different legal basetypes. */
b81654f1
MS
201%token SIGNED_KEYWORD LONG SHORT INT_KEYWORD CONST_KEYWORD VOLATILE_KEYWORD DOUBLE_KEYWORD
202
203%token <voidval> VARIABLE
204
205%token <opcode> ASSIGN_MODIFY
206
b81654f1
MS
207%left ','
208%left ABOVE_COMMA
209%right '=' ASSIGN_MODIFY
210%right '?'
211%left OROR
212%left ANDAND
213%left '|'
214%left '^'
215%left '&'
216%left EQUAL NOTEQUAL
217%left '<' '>' LEQ GEQ
218%left LSH RSH
219%left '@'
220%left '+' '-'
221%left '*' '/' '%'
222%right UNARY INCREMENT DECREMENT
223%right ARROW '.' '[' '('
224%token <ssym> BLOCKNAME
225%type <bval> block
226%left COLONCOLON
227
228\f
229%%
230
231start : exp1
232 | type_exp
233 ;
234
235type_exp: type
236 { write_exp_elt_opcode(OP_TYPE);
237 write_exp_elt_type($1);
238 write_exp_elt_opcode(OP_TYPE);}
239 ;
240
241/* Expressions, including the comma operator. */
242exp1 : exp
243 | exp1 ',' exp
244 { write_exp_elt_opcode (BINOP_COMMA); }
245 ;
246
247/* Expressions, not including the comma operator. */
248exp : '*' exp %prec UNARY
249 { write_exp_elt_opcode (UNOP_IND); }
5edc9ca6 250 ;
b81654f1
MS
251
252exp : '&' exp %prec UNARY
253 { write_exp_elt_opcode (UNOP_ADDR); }
5edc9ca6 254 ;
b81654f1
MS
255
256exp : '-' exp %prec UNARY
257 { write_exp_elt_opcode (UNOP_NEG); }
258 ;
259
260exp : '!' exp %prec UNARY
261 { write_exp_elt_opcode (UNOP_LOGICAL_NOT); }
262 ;
263
264exp : '~' exp %prec UNARY
265 { write_exp_elt_opcode (UNOP_COMPLEMENT); }
266 ;
267
268exp : INCREMENT exp %prec UNARY
269 { write_exp_elt_opcode (UNOP_PREINCREMENT); }
270 ;
271
272exp : DECREMENT exp %prec UNARY
273 { write_exp_elt_opcode (UNOP_PREDECREMENT); }
274 ;
275
276exp : exp INCREMENT %prec UNARY
277 { write_exp_elt_opcode (UNOP_POSTINCREMENT); }
278 ;
279
280exp : exp DECREMENT %prec UNARY
281 { write_exp_elt_opcode (UNOP_POSTDECREMENT); }
282 ;
283
284exp : SIZEOF exp %prec UNARY
285 { write_exp_elt_opcode (UNOP_SIZEOF); }
286 ;
287
288exp : exp ARROW name
289 { write_exp_elt_opcode (STRUCTOP_PTR);
290 write_exp_string ($3);
291 write_exp_elt_opcode (STRUCTOP_PTR); }
292 ;
293
294exp : exp ARROW qualified_name
295 { /* exp->type::name becomes exp->*(&type::name) */
296 /* Note: this doesn't work if name is a
297 static member! FIXME */
298 write_exp_elt_opcode (UNOP_ADDR);
299 write_exp_elt_opcode (STRUCTOP_MPTR); }
300 ;
301exp : exp ARROW '*' exp
302 { write_exp_elt_opcode (STRUCTOP_MPTR); }
303 ;
304
305exp : exp '.' name
306 { write_exp_elt_opcode (STRUCTOP_STRUCT);
307 write_exp_string ($3);
308 write_exp_elt_opcode (STRUCTOP_STRUCT); }
309 ;
310
311
312exp : exp '.' qualified_name
313 { /* exp.type::name becomes exp.*(&type::name) */
314 /* Note: this doesn't work if name is a
315 static member! FIXME */
316 write_exp_elt_opcode (UNOP_ADDR);
317 write_exp_elt_opcode (STRUCTOP_MEMBER); }
318 ;
319
320exp : exp '.' '*' exp
321 { write_exp_elt_opcode (STRUCTOP_MEMBER); }
322 ;
323
324exp : exp '[' exp1 ']'
325 { write_exp_elt_opcode (BINOP_SUBSCRIPT); }
326 ;
327/*
328 * The rules below parse ObjC message calls of the form:
329 * '[' target selector {':' argument}* ']'
330 */
331
332exp : '[' TYPENAME
333 {
334 CORE_ADDR class;
335
336 class = lookup_objc_class (copy_name ($2.stoken));
337 if (class == 0)
338 error ("%s is not an ObjC Class",
339 copy_name ($2.stoken));
340 write_exp_elt_opcode (OP_LONG);
341 write_exp_elt_type (builtin_type_int);
342 write_exp_elt_longcst ((LONGEST) class);
343 write_exp_elt_opcode (OP_LONG);
344 start_msglist();
345 }
346 msglist ']'
646df18d 347 { write_exp_elt_opcode (OP_OBJC_MSGCALL);
b81654f1 348 end_msglist();
646df18d 349 write_exp_elt_opcode (OP_OBJC_MSGCALL);
b81654f1
MS
350 }
351 ;
352
353exp : '[' CLASSNAME
354 {
355 write_exp_elt_opcode (OP_LONG);
356 write_exp_elt_type (builtin_type_int);
357 write_exp_elt_longcst ((LONGEST) $2.class);
358 write_exp_elt_opcode (OP_LONG);
359 start_msglist();
360 }
361 msglist ']'
646df18d 362 { write_exp_elt_opcode (OP_OBJC_MSGCALL);
b81654f1 363 end_msglist();
646df18d 364 write_exp_elt_opcode (OP_OBJC_MSGCALL);
b81654f1
MS
365 }
366 ;
367
368exp : '[' exp
369 { start_msglist(); }
370 msglist ']'
646df18d 371 { write_exp_elt_opcode (OP_OBJC_MSGCALL);
b81654f1 372 end_msglist();
646df18d 373 write_exp_elt_opcode (OP_OBJC_MSGCALL);
b81654f1
MS
374 }
375 ;
376
377msglist : name
378 { add_msglist(&$1, 0); }
379 | msgarglist
380 ;
381
382msgarglist : msgarg
383 | msgarglist msgarg
384 ;
385
386msgarg : name ':' exp
387 { add_msglist(&$1, 1); }
3b4efeaa 388 | ':' exp /* Unnamed arg. */
b81654f1 389 { add_msglist(0, 1); }
3b4efeaa 390 | ',' exp /* Variable number of args. */
b81654f1
MS
391 { add_msglist(0, 0); }
392 ;
393
394exp : exp '('
395 /* This is to save the value of arglist_len
396 being accumulated by an outer function call. */
397 { start_arglist (); }
398 arglist ')' %prec ARROW
399 { write_exp_elt_opcode (OP_FUNCALL);
400 write_exp_elt_longcst ((LONGEST) end_arglist ());
401 write_exp_elt_opcode (OP_FUNCALL); }
402 ;
403
404lcurly : '{'
405 { start_arglist (); }
406 ;
407
408arglist :
409 ;
410
411arglist : exp
412 { arglist_len = 1; }
413 ;
414
415arglist : arglist ',' exp %prec ABOVE_COMMA
416 { arglist_len++; }
417 ;
418
419rcurly : '}'
420 { $$ = end_arglist () - 1; }
421 ;
422exp : lcurly arglist rcurly %prec ARROW
423 { write_exp_elt_opcode (OP_ARRAY);
424 write_exp_elt_longcst ((LONGEST) 0);
425 write_exp_elt_longcst ((LONGEST) $3);
426 write_exp_elt_opcode (OP_ARRAY); }
427 ;
428
429exp : lcurly type rcurly exp %prec UNARY
430 { write_exp_elt_opcode (UNOP_MEMVAL);
431 write_exp_elt_type ($2);
432 write_exp_elt_opcode (UNOP_MEMVAL); }
433 ;
434
435exp : '(' type ')' exp %prec UNARY
436 { write_exp_elt_opcode (UNOP_CAST);
437 write_exp_elt_type ($2);
438 write_exp_elt_opcode (UNOP_CAST); }
439 ;
440
441exp : '(' exp1 ')'
442 { }
443 ;
444
445/* Binary operators in order of decreasing precedence. */
446
447exp : exp '@' exp
448 { write_exp_elt_opcode (BINOP_REPEAT); }
449 ;
450
451exp : exp '*' exp
452 { write_exp_elt_opcode (BINOP_MUL); }
453 ;
454
455exp : exp '/' exp
456 { write_exp_elt_opcode (BINOP_DIV); }
457 ;
458
459exp : exp '%' exp
460 { write_exp_elt_opcode (BINOP_REM); }
461 ;
462
463exp : exp '+' exp
464 { write_exp_elt_opcode (BINOP_ADD); }
465 ;
466
467exp : exp '-' exp
468 { write_exp_elt_opcode (BINOP_SUB); }
469 ;
470
471exp : exp LSH exp
472 { write_exp_elt_opcode (BINOP_LSH); }
473 ;
474
475exp : exp RSH exp
476 { write_exp_elt_opcode (BINOP_RSH); }
477 ;
478
479exp : exp EQUAL exp
480 { write_exp_elt_opcode (BINOP_EQUAL); }
481 ;
482
483exp : exp NOTEQUAL exp
484 { write_exp_elt_opcode (BINOP_NOTEQUAL); }
485 ;
486
487exp : exp LEQ exp
488 { write_exp_elt_opcode (BINOP_LEQ); }
489 ;
490
491exp : exp GEQ exp
492 { write_exp_elt_opcode (BINOP_GEQ); }
493 ;
494
495exp : exp '<' exp
496 { write_exp_elt_opcode (BINOP_LESS); }
497 ;
498
499exp : exp '>' exp
500 { write_exp_elt_opcode (BINOP_GTR); }
501 ;
502
503exp : exp '&' exp
504 { write_exp_elt_opcode (BINOP_BITWISE_AND); }
505 ;
506
507exp : exp '^' exp
508 { write_exp_elt_opcode (BINOP_BITWISE_XOR); }
509 ;
510
511exp : exp '|' exp
512 { write_exp_elt_opcode (BINOP_BITWISE_IOR); }
513 ;
514
515exp : exp ANDAND exp
516 { write_exp_elt_opcode (BINOP_LOGICAL_AND); }
517 ;
518
519exp : exp OROR exp
520 { write_exp_elt_opcode (BINOP_LOGICAL_OR); }
521 ;
522
523exp : exp '?' exp ':' exp %prec '?'
524 { write_exp_elt_opcode (TERNOP_COND); }
525 ;
526
527exp : exp '=' exp
528 { write_exp_elt_opcode (BINOP_ASSIGN); }
529 ;
530
531exp : exp ASSIGN_MODIFY exp
532 { write_exp_elt_opcode (BINOP_ASSIGN_MODIFY);
533 write_exp_elt_opcode ($2);
534 write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); }
535 ;
536
537exp : INT
538 { write_exp_elt_opcode (OP_LONG);
539 write_exp_elt_type ($1.type);
540 write_exp_elt_longcst ((LONGEST)($1.val));
541 write_exp_elt_opcode (OP_LONG); }
542 ;
543
544exp : NAME_OR_INT
545 { YYSTYPE val;
546 parse_number ($1.stoken.ptr, $1.stoken.length, 0, &val);
547 write_exp_elt_opcode (OP_LONG);
548 write_exp_elt_type (val.typed_val_int.type);
549 write_exp_elt_longcst ((LONGEST)val.typed_val_int.val);
550 write_exp_elt_opcode (OP_LONG);
551 }
552 ;
553
554
555exp : FLOAT
556 { write_exp_elt_opcode (OP_DOUBLE);
557 write_exp_elt_type ($1.type);
558 write_exp_elt_dblcst ($1.dval);
559 write_exp_elt_opcode (OP_DOUBLE); }
560 ;
561
562exp : variable
563 ;
564
565exp : VARIABLE
3b4efeaa 566 /* Already written by write_dollar_variable. */
b81654f1
MS
567 ;
568
569exp : SELECTOR
570 {
646df18d 571 write_exp_elt_opcode (OP_OBJC_SELECTOR);
b81654f1 572 write_exp_string ($1);
646df18d 573 write_exp_elt_opcode (OP_OBJC_SELECTOR); }
5edc9ca6 574 ;
b81654f1
MS
575
576exp : SIZEOF '(' type ')' %prec UNARY
577 { write_exp_elt_opcode (OP_LONG);
578 write_exp_elt_type (builtin_type_int);
579 CHECK_TYPEDEF ($3);
580 write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3));
581 write_exp_elt_opcode (OP_LONG); }
582 ;
583
584exp : STRING
3b4efeaa
MS
585 { /* C strings are converted into array
586 constants with an explicit null byte
587 added at the end. Thus the array upper
588 bound is the string length. There is no
589 such thing in C as a completely empty
590 string. */
b81654f1
MS
591 char *sp = $1.ptr; int count = $1.length;
592 while (count-- > 0)
593 {
594 write_exp_elt_opcode (OP_LONG);
595 write_exp_elt_type (builtin_type_char);
596 write_exp_elt_longcst ((LONGEST)(*sp++));
597 write_exp_elt_opcode (OP_LONG);
598 }
599 write_exp_elt_opcode (OP_LONG);
600 write_exp_elt_type (builtin_type_char);
601 write_exp_elt_longcst ((LONGEST)'\0');
602 write_exp_elt_opcode (OP_LONG);
603 write_exp_elt_opcode (OP_ARRAY);
604 write_exp_elt_longcst ((LONGEST) 0);
605 write_exp_elt_longcst ((LONGEST) ($1.length));
606 write_exp_elt_opcode (OP_ARRAY); }
607 ;
608
609exp : NSSTRING /* ObjC NextStep NSString constant
3b4efeaa 610 * of the form '@' '"' string '"'.
b81654f1 611 */
646df18d 612 { write_exp_elt_opcode (OP_OBJC_NSSTRING);
b81654f1 613 write_exp_string ($1);
646df18d 614 write_exp_elt_opcode (OP_OBJC_NSSTRING); }
b81654f1
MS
615 ;
616
b81654f1
MS
617block : BLOCKNAME
618 {
619 if ($1.sym != 0)
620 $$ = SYMBOL_BLOCK_VALUE ($1.sym);
621 else
622 {
623 struct symtab *tem =
624 lookup_symtab (copy_name ($1.stoken));
625 if (tem)
626 $$ = BLOCKVECTOR_BLOCK (BLOCKVECTOR (tem), STATIC_BLOCK);
627 else
628 error ("No file or function \"%s\".",
629 copy_name ($1.stoken));
630 }
631 }
632 ;
633
634block : block COLONCOLON name
635 { struct symbol *tem
636 = lookup_symbol (copy_name ($3), $1,
176620f1 637 VAR_DOMAIN, (int *) NULL,
b81654f1
MS
638 (struct symtab **) NULL);
639 if (!tem || SYMBOL_CLASS (tem) != LOC_BLOCK)
640 error ("No function \"%s\" in specified context.",
641 copy_name ($3));
642 $$ = SYMBOL_BLOCK_VALUE (tem); }
643 ;
644
645variable: block COLONCOLON name
646 { struct symbol *sym;
647 sym = lookup_symbol (copy_name ($3), $1,
176620f1 648 VAR_DOMAIN, (int *) NULL,
b81654f1
MS
649 (struct symtab **) NULL);
650 if (sym == 0)
651 error ("No symbol \"%s\" in specified context.",
652 copy_name ($3));
653
654 write_exp_elt_opcode (OP_VAR_VALUE);
655 /* block_found is set by lookup_symbol. */
656 write_exp_elt_block (block_found);
657 write_exp_elt_sym (sym);
658 write_exp_elt_opcode (OP_VAR_VALUE); }
659 ;
660
661qualified_name: typebase COLONCOLON name
662 {
663 struct type *type = $1;
664 if (TYPE_CODE (type) != TYPE_CODE_STRUCT
665 && TYPE_CODE (type) != TYPE_CODE_UNION)
666 error ("`%s' is not defined as an aggregate type.",
667 TYPE_NAME (type));
668
669 write_exp_elt_opcode (OP_SCOPE);
670 write_exp_elt_type (type);
671 write_exp_string ($3);
672 write_exp_elt_opcode (OP_SCOPE);
673 }
674 | typebase COLONCOLON '~' name
675 {
676 struct type *type = $1;
677 struct stoken tmp_token;
678 if (TYPE_CODE (type) != TYPE_CODE_STRUCT
679 && TYPE_CODE (type) != TYPE_CODE_UNION)
680 error ("`%s' is not defined as an aggregate type.",
681 TYPE_NAME (type));
682
cb137aa5 683 if (!DEPRECATED_STREQ (type_name_no_tag (type), $4.ptr))
b81654f1
MS
684 error ("invalid destructor `%s::~%s'",
685 type_name_no_tag (type), $4.ptr);
686
687 tmp_token.ptr = (char*) alloca ($4.length + 2);
688 tmp_token.length = $4.length + 1;
689 tmp_token.ptr[0] = '~';
690 memcpy (tmp_token.ptr+1, $4.ptr, $4.length);
691 tmp_token.ptr[tmp_token.length] = 0;
692 write_exp_elt_opcode (OP_SCOPE);
693 write_exp_elt_type (type);
694 write_exp_string (tmp_token);
695 write_exp_elt_opcode (OP_SCOPE);
696 }
697 ;
698
699variable: qualified_name
700 | COLONCOLON name
701 {
702 char *name = copy_name ($2);
703 struct symbol *sym;
704 struct minimal_symbol *msymbol;
705
706 sym =
707 lookup_symbol (name, (const struct block *) NULL,
176620f1 708 VAR_DOMAIN, (int *) NULL,
b81654f1
MS
709 (struct symtab **) NULL);
710 if (sym)
711 {
712 write_exp_elt_opcode (OP_VAR_VALUE);
713 write_exp_elt_block (NULL);
714 write_exp_elt_sym (sym);
715 write_exp_elt_opcode (OP_VAR_VALUE);
716 break;
717 }
718
719 msymbol = lookup_minimal_symbol (name, NULL, NULL);
720 if (msymbol != NULL)
721 {
722 write_exp_msymbol (msymbol,
723 lookup_function_type (builtin_type_int),
724 builtin_type_int);
725 }
726 else
727 if (!have_full_symbols () && !have_partial_symbols ())
728 error ("No symbol table is loaded. Use the \"file\" command.");
729 else
730 error ("No symbol \"%s\" in current context.", name);
731 }
732 ;
733
734variable: name_not_typename
735 { struct symbol *sym = $1.sym;
736
737 if (sym)
738 {
739 if (symbol_read_needs_frame (sym))
740 {
741 if (innermost_block == 0 ||
742 contained_in (block_found,
743 innermost_block))
744 innermost_block = block_found;
745 }
746
747 write_exp_elt_opcode (OP_VAR_VALUE);
748 /* We want to use the selected frame, not
749 another more inner frame which happens to
750 be in the same block. */
751 write_exp_elt_block (NULL);
752 write_exp_elt_sym (sym);
753 write_exp_elt_opcode (OP_VAR_VALUE);
754 }
755 else if ($1.is_a_field_of_this)
756 {
757 /* C++/ObjC: it hangs off of `this'/'self'.
758 Must not inadvertently convert from a
759 method call to data ref. */
760 if (innermost_block == 0 ||
761 contained_in (block_found, innermost_block))
762 innermost_block = block_found;
646df18d
AF
763 write_exp_elt_opcode (OP_OBJC_SELF);
764 write_exp_elt_opcode (OP_OBJC_SELF);
b81654f1
MS
765 write_exp_elt_opcode (STRUCTOP_PTR);
766 write_exp_string ($1.stoken);
767 write_exp_elt_opcode (STRUCTOP_PTR);
768 }
769 else
770 {
771 struct minimal_symbol *msymbol;
710122da 772 char *arg = copy_name ($1.stoken);
b81654f1
MS
773
774 msymbol =
775 lookup_minimal_symbol (arg, NULL, NULL);
776 if (msymbol != NULL)
777 {
778 write_exp_msymbol (msymbol,
779 lookup_function_type (builtin_type_int),
780 builtin_type_int);
781 }
782 else if (!have_full_symbols () &&
783 !have_partial_symbols ())
784 error ("No symbol table is loaded. Use the \"file\" command.");
785 else
786 error ("No symbol \"%s\" in current context.",
787 copy_name ($1.stoken));
788 }
789 }
790 ;
791
792
793ptype : typebase
3b4efeaa
MS
794 /* "const" and "volatile" are curently ignored. A type
795 qualifier before the type is currently handled in the
796 typebase rule. The reason for recognizing these here
797 (shift/reduce conflicts) might be obsolete now that some
798 pointer to member rules have been deleted. */
b81654f1
MS
799 | typebase CONST_KEYWORD
800 | typebase VOLATILE_KEYWORD
801 | typebase abs_decl
802 { $$ = follow_types ($1); }
803 | typebase CONST_KEYWORD abs_decl
804 { $$ = follow_types ($1); }
805 | typebase VOLATILE_KEYWORD abs_decl
806 { $$ = follow_types ($1); }
807 ;
808
809abs_decl: '*'
810 { push_type (tp_pointer); $$ = 0; }
811 | '*' abs_decl
812 { push_type (tp_pointer); $$ = $2; }
813 | '&'
814 { push_type (tp_reference); $$ = 0; }
815 | '&' abs_decl
816 { push_type (tp_reference); $$ = $2; }
817 | direct_abs_decl
818 ;
819
820direct_abs_decl: '(' abs_decl ')'
821 { $$ = $2; }
822 | direct_abs_decl array_mod
823 {
824 push_type_int ($2);
825 push_type (tp_array);
826 }
827 | array_mod
828 {
829 push_type_int ($1);
830 push_type (tp_array);
831 $$ = 0;
832 }
833
834 | direct_abs_decl func_mod
835 { push_type (tp_function); }
836 | func_mod
837 { push_type (tp_function); }
838 ;
839
840array_mod: '[' ']'
841 { $$ = -1; }
842 | '[' INT ']'
843 { $$ = $2.val; }
844 ;
845
846func_mod: '(' ')'
847 { $$ = 0; }
848 | '(' nonempty_typelist ')'
8dbb1c65 849 { free ($2); $$ = 0; }
b81654f1
MS
850 ;
851
852/* We used to try to recognize more pointer to member types here, but
3b4efeaa
MS
853 that didn't work (shift/reduce conflicts meant that these rules
854 never got executed). The problem is that
b81654f1
MS
855 int (foo::bar::baz::bizzle)
856 is a function type but
857 int (foo::bar::baz::bizzle::*)
858 is a pointer to member type. Stroustrup loses again! */
859
860type : ptype
861 | typebase COLONCOLON '*'
862 { $$ = lookup_member_type (builtin_type_int, $1); }
863 ;
864
3b4efeaa 865typebase /* Implements (approximately): (type-qualifier)* type-specifier. */
b81654f1
MS
866 : TYPENAME
867 { $$ = $1.type; }
868 | CLASSNAME
869 {
870 if ($1.type == NULL)
871 error ("No symbol \"%s\" in current context.",
872 copy_name($1.stoken));
873 else
874 $$ = $1.type;
875 }
876 | INT_KEYWORD
877 { $$ = builtin_type_int; }
878 | LONG
879 { $$ = builtin_type_long; }
880 | SHORT
881 { $$ = builtin_type_short; }
882 | LONG INT_KEYWORD
883 { $$ = builtin_type_long; }
884 | UNSIGNED LONG INT_KEYWORD
885 { $$ = builtin_type_unsigned_long; }
886 | LONG LONG
887 { $$ = builtin_type_long_long; }
888 | LONG LONG INT_KEYWORD
889 { $$ = builtin_type_long_long; }
890 | UNSIGNED LONG LONG
891 { $$ = builtin_type_unsigned_long_long; }
892 | UNSIGNED LONG LONG INT_KEYWORD
893 { $$ = builtin_type_unsigned_long_long; }
894 | SHORT INT_KEYWORD
895 { $$ = builtin_type_short; }
896 | UNSIGNED SHORT INT_KEYWORD
897 { $$ = builtin_type_unsigned_short; }
898 | DOUBLE_KEYWORD
899 { $$ = builtin_type_double; }
900 | LONG DOUBLE_KEYWORD
901 { $$ = builtin_type_long_double; }
902 | STRUCT name
903 { $$ = lookup_struct (copy_name ($2),
904 expression_context_block); }
905 | CLASS name
906 { $$ = lookup_struct (copy_name ($2),
907 expression_context_block); }
908 | UNION name
909 { $$ = lookup_union (copy_name ($2),
910 expression_context_block); }
911 | ENUM name
912 { $$ = lookup_enum (copy_name ($2),
913 expression_context_block); }
914 | UNSIGNED typename
915 { $$ = lookup_unsigned_typename (TYPE_NAME($2.type)); }
916 | UNSIGNED
917 { $$ = builtin_type_unsigned_int; }
918 | SIGNED_KEYWORD typename
919 { $$ = lookup_signed_typename (TYPE_NAME($2.type)); }
920 | SIGNED_KEYWORD
921 { $$ = builtin_type_int; }
922 | TEMPLATE name '<' type '>'
923 { $$ = lookup_template_type(copy_name($2), $4,
924 expression_context_block);
925 }
3b4efeaa
MS
926 /* "const" and "volatile" are curently ignored. A type
927 qualifier after the type is handled in the ptype rule. I
928 think these could be too. */
b81654f1
MS
929 | CONST_KEYWORD typebase { $$ = $2; }
930 | VOLATILE_KEYWORD typebase { $$ = $2; }
931 ;
932
933typename: TYPENAME
934 | INT_KEYWORD
935 {
936 $$.stoken.ptr = "int";
937 $$.stoken.length = 3;
938 $$.type = builtin_type_int;
939 }
940 | LONG
941 {
942 $$.stoken.ptr = "long";
943 $$.stoken.length = 4;
944 $$.type = builtin_type_long;
945 }
946 | SHORT
947 {
948 $$.stoken.ptr = "short";
949 $$.stoken.length = 5;
950 $$.type = builtin_type_short;
951 }
952 ;
953
954nonempty_typelist
955 : type
956 { $$ = (struct type **) malloc (sizeof (struct type *) * 2);
3b4efeaa 957 $<ivec>$[0] = 1; /* Number of types in vector. */
b81654f1
MS
958 $$[1] = $1;
959 }
960 | nonempty_typelist ',' type
961 { int len = sizeof (struct type *) * (++($<ivec>1[0]) + 1);
962 $$ = (struct type **) realloc ((char *) $1, len);
963 $$[$<ivec>$[0]] = $3;
964 }
965 ;
966
967name : NAME { $$ = $1.stoken; }
968 | BLOCKNAME { $$ = $1.stoken; }
969 | TYPENAME { $$ = $1.stoken; }
970 | CLASSNAME { $$ = $1.stoken; }
971 | NAME_OR_INT { $$ = $1.stoken; }
972 ;
973
974name_not_typename : NAME
975 | BLOCKNAME
3b4efeaa
MS
976/* These would be useful if name_not_typename was useful, but it is
977 just a fake for "variable", so these cause reduce/reduce conflicts
978 because the parser can't tell whether NAME_OR_INT is a
979 name_not_typename (=variable, =exp) or just an exp. If
980 name_not_typename was ever used in an lvalue context where only a
981 name could occur, this might be useful. */
9c96f9f2 982/* | NAME_OR_INT */
b81654f1
MS
983 ;
984
985%%
986
987/* Take care of parsing a number (anything that starts with a digit).
3b4efeaa
MS
988 Set yylval and return the token type; update lexptr. LEN is the
989 number of characters in it. */
b81654f1 990
3b4efeaa 991/*** Needs some error checking for the float case. ***/
b81654f1
MS
992
993static int
994parse_number (p, len, parsed_float, putithere)
710122da
DC
995 char *p;
996 int len;
b81654f1
MS
997 int parsed_float;
998 YYSTYPE *putithere;
999{
3b4efeaa
MS
1000 /* FIXME: Shouldn't these be unsigned? We don't deal with negative
1001 values here, and we do kind of silly things like cast to
1002 unsigned. */
710122da
DC
1003 LONGEST n = 0;
1004 LONGEST prevn = 0;
b81654f1
MS
1005 unsigned LONGEST un;
1006
710122da
DC
1007 int i = 0;
1008 int c;
1009 int base = input_radix;
b81654f1
MS
1010 int unsigned_p = 0;
1011
1012 /* Number of "L" suffixes encountered. */
1013 int long_p = 0;
1014
1015 /* We have found a "L" or "U" suffix. */
1016 int found_suffix = 0;
1017
1018 unsigned LONGEST high_bit;
1019 struct type *signed_type;
1020 struct type *unsigned_type;
1021
1022 if (parsed_float)
1023 {
1024 char c;
1025
1026 /* It's a float since it contains a point or an exponent. */
1027
a6205f53 1028 sscanf (p, DOUBLEST_SCAN_FORMAT "%c",
96c1eda2 1029 &putithere->typed_val_float.dval, &c);
b81654f1
MS
1030
1031 /* See if it has `f' or `l' suffix (float or long double). */
1032
1033 c = tolower (p[len - 1]);
1034
1035 if (c == 'f')
1036 putithere->typed_val_float.type = builtin_type_float;
1037 else if (c == 'l')
1038 putithere->typed_val_float.type = builtin_type_long_double;
1039 else if (isdigit (c) || c == '.')
1040 putithere->typed_val_float.type = builtin_type_double;
1041 else
1042 return ERROR;
1043
1044 return FLOAT;
1045 }
1046
3b4efeaa 1047 /* Handle base-switching prefixes 0x, 0t, 0d, and 0. */
b81654f1
MS
1048 if (p[0] == '0')
1049 switch (p[1])
1050 {
1051 case 'x':
1052 case 'X':
1053 if (len >= 3)
1054 {
1055 p += 2;
1056 base = 16;
1057 len -= 2;
1058 }
1059 break;
1060
1061 case 't':
1062 case 'T':
1063 case 'd':
1064 case 'D':
1065 if (len >= 3)
1066 {
1067 p += 2;
1068 base = 10;
1069 len -= 2;
1070 }
1071 break;
1072
1073 default:
1074 base = 8;
1075 break;
1076 }
1077
1078 while (len-- > 0)
1079 {
1080 c = *p++;
1081 if (c >= 'A' && c <= 'Z')
1082 c += 'a' - 'A';
1083 if (c != 'l' && c != 'u')
1084 n *= base;
1085 if (c >= '0' && c <= '9')
1086 {
1087 if (found_suffix)
1088 return ERROR;
1089 n += i = c - '0';
1090 }
1091 else
1092 {
1093 if (base > 10 && c >= 'a' && c <= 'f')
1094 {
1095 if (found_suffix)
1096 return ERROR;
1097 n += i = c - 'a' + 10;
1098 }
1099 else if (c == 'l')
1100 {
1101 ++long_p;
1102 found_suffix = 1;
1103 }
1104 else if (c == 'u')
1105 {
1106 unsigned_p = 1;
1107 found_suffix = 1;
1108 }
1109 else
3b4efeaa 1110 return ERROR; /* Char not a digit. */
b81654f1
MS
1111 }
1112 if (i >= base)
3b4efeaa 1113 return ERROR; /* Invalid digit in this base. */
b81654f1 1114
3b4efeaa
MS
1115 /* Portably test for overflow (only works for nonzero values, so
1116 make a second check for zero). FIXME: Can't we just make n
1117 and prevn unsigned and avoid this? */
b81654f1 1118 if (c != 'l' && c != 'u' && (prevn >= n) && n != 0)
3b4efeaa 1119 unsigned_p = 1; /* Try something unsigned. */
b81654f1
MS
1120
1121 /* Portably test for unsigned overflow.
3b4efeaa
MS
1122 FIXME: This check is wrong; for example it doesn't find
1123 overflow on 0x123456789 when LONGEST is 32 bits. */
b81654f1
MS
1124 if (c != 'l' && c != 'u' && n != 0)
1125 {
1126 if ((unsigned_p && (unsigned LONGEST) prevn >= (unsigned LONGEST) n))
1127 error ("Numeric constant too large.");
1128 }
1129 prevn = n;
1130 }
1131
1132 /* An integer constant is an int, a long, or a long long. An L
1133 suffix forces it to be long; an LL suffix forces it to be long
1134 long. If not forced to a larger size, it gets the first type of
1135 the above that it fits in. To figure out whether it fits, we
1136 shift it right and see whether anything remains. Note that we
1137 can't shift sizeof (LONGEST) * HOST_CHAR_BIT bits or more in one
1138 operation, because many compilers will warn about such a shift
1139 (which always produces a zero result). Sometimes TARGET_INT_BIT
1140 or TARGET_LONG_BIT will be that big, sometimes not. To deal with
1141 the case where it is we just always shift the value more than
1142 once, with fewer bits each time. */
1143
1144 un = (unsigned LONGEST)n >> 2;
1145 if (long_p == 0
1146 && (un >> (TARGET_INT_BIT - 2)) == 0)
1147 {
1148 high_bit = ((unsigned LONGEST)1) << (TARGET_INT_BIT-1);
1149
1150 /* A large decimal (not hex or octal) constant (between INT_MAX
1151 and UINT_MAX) is a long or unsigned long, according to ANSI,
1152 never an unsigned int, but this code treats it as unsigned
1153 int. This probably should be fixed. GCC gives a warning on
1154 such constants. */
1155
1156 unsigned_type = builtin_type_unsigned_int;
1157 signed_type = builtin_type_int;
1158 }
1159 else if (long_p <= 1
1160 && (un >> (TARGET_LONG_BIT - 2)) == 0)
1161 {
1162 high_bit = ((unsigned LONGEST)1) << (TARGET_LONG_BIT-1);
1163 unsigned_type = builtin_type_unsigned_long;
1164 signed_type = builtin_type_long;
1165 }
1166 else
1167 {
1168 high_bit = (((unsigned LONGEST)1)
1169 << (TARGET_LONG_LONG_BIT - 32 - 1)
1170 << 16
1171 << 16);
1172 if (high_bit == 0)
1173 /* A long long does not fit in a LONGEST. */
1174 high_bit =
1175 (unsigned LONGEST)1 << (sizeof (LONGEST) * HOST_CHAR_BIT - 1);
1176 unsigned_type = builtin_type_unsigned_long_long;
1177 signed_type = builtin_type_long_long;
1178 }
1179
1180 putithere->typed_val_int.val = n;
1181
1182 /* If the high bit of the worked out type is set then this number
3b4efeaa 1183 has to be unsigned. */
b81654f1
MS
1184
1185 if (unsigned_p || (n & high_bit))
1186 {
1187 putithere->typed_val_int.type = unsigned_type;
1188 }
1189 else
1190 {
1191 putithere->typed_val_int.type = signed_type;
1192 }
1193
1194 return INT;
1195}
1196
1197struct token
1198{
1199 char *operator;
1200 int token;
1201 enum exp_opcode opcode;
1202};
1203
1204static const struct token tokentab3[] =
1205 {
1206 {">>=", ASSIGN_MODIFY, BINOP_RSH},
1207 {"<<=", ASSIGN_MODIFY, BINOP_LSH}
1208 };
1209
1210static const struct token tokentab2[] =
1211 {
1212 {"+=", ASSIGN_MODIFY, BINOP_ADD},
1213 {"-=", ASSIGN_MODIFY, BINOP_SUB},
1214 {"*=", ASSIGN_MODIFY, BINOP_MUL},
1215 {"/=", ASSIGN_MODIFY, BINOP_DIV},
1216 {"%=", ASSIGN_MODIFY, BINOP_REM},
1217 {"|=", ASSIGN_MODIFY, BINOP_BITWISE_IOR},
1218 {"&=", ASSIGN_MODIFY, BINOP_BITWISE_AND},
1219 {"^=", ASSIGN_MODIFY, BINOP_BITWISE_XOR},
1220 {"++", INCREMENT, BINOP_END},
1221 {"--", DECREMENT, BINOP_END},
1222 {"->", ARROW, BINOP_END},
1223 {"&&", ANDAND, BINOP_END},
1224 {"||", OROR, BINOP_END},
1225 {"::", COLONCOLON, BINOP_END},
1226 {"<<", LSH, BINOP_END},
1227 {">>", RSH, BINOP_END},
1228 {"==", EQUAL, BINOP_END},
1229 {"!=", NOTEQUAL, BINOP_END},
1230 {"<=", LEQ, BINOP_END},
1231 {">=", GEQ, BINOP_END}
1232 };
1233
1234/* Read one token, getting characters through lexptr. */
1235
1236static int
1237yylex ()
1238{
1239 int c, tokchr;
1240 int namelen;
1241 unsigned int i;
1242 char *tokstart;
1243 char *tokptr;
1244 int tempbufindex;
1245 static char *tempbuf;
1246 static int tempbufsize;
1247
1248 retry:
1249
1250 tokstart = lexptr;
1251 /* See if it is a special token of length 3. */
1252 for (i = 0; i < sizeof tokentab3 / sizeof tokentab3[0]; i++)
cb137aa5 1253 if (DEPRECATED_STREQN (tokstart, tokentab3[i].operator, 3))
b81654f1
MS
1254 {
1255 lexptr += 3;
1256 yylval.opcode = tokentab3[i].opcode;
1257 return tokentab3[i].token;
1258 }
1259
1260 /* See if it is a special token of length 2. */
1261 for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++)
cb137aa5 1262 if (DEPRECATED_STREQN (tokstart, tokentab2[i].operator, 2))
b81654f1
MS
1263 {
1264 lexptr += 2;
1265 yylval.opcode = tokentab2[i].opcode;
1266 return tokentab2[i].token;
1267 }
1268
7ee21aad 1269 c = 0;
b81654f1
MS
1270 switch (tokchr = *tokstart)
1271 {
1272 case 0:
1273 return 0;
1274
1275 case ' ':
1276 case '\t':
1277 case '\n':
1278 lexptr++;
1279 goto retry;
1280
1281 case '\'':
3b4efeaa
MS
1282 /* We either have a character constant ('0' or '\177' for
1283 example) or we have a quoted symbol reference ('foo(int,int)'
1284 in C++ for example). */
b81654f1
MS
1285 lexptr++;
1286 c = *lexptr++;
1287 if (c == '\\')
1288 c = parse_escape (&lexptr);
1289 else if (c == '\'')
1290 error ("Empty character constant.");
1291
1292 yylval.typed_val_int.val = c;
1293 yylval.typed_val_int.type = builtin_type_char;
1294
1295 c = *lexptr++;
1296 if (c != '\'')
1297 {
e8afa4d7 1298 namelen = skip_quoted (tokstart) - tokstart;
b81654f1
MS
1299 if (namelen > 2)
1300 {
1301 lexptr = tokstart + namelen;
1302 if (lexptr[-1] != '\'')
1303 error ("Unmatched single quote.");
1304 namelen -= 2;
1305 tokstart++;
1306 goto tryname;
1307 }
1308 error ("Invalid character constant.");
1309 }
1310 return INT;
1311
1312 case '(':
1313 paren_depth++;
1314 lexptr++;
1315 return '(';
1316
1317 case ')':
1318 if (paren_depth == 0)
1319 return 0;
1320 paren_depth--;
1321 lexptr++;
1322 return ')';
1323
1324 case ',':
1325 if (comma_terminates && paren_depth == 0)
1326 return 0;
1327 lexptr++;
1328 return ',';
1329
1330 case '.':
1331 /* Might be a floating point number. */
1332 if (lexptr[1] < '0' || lexptr[1] > '9')
3b4efeaa 1333 goto symbol; /* Nope, must be a symbol. */
b81654f1
MS
1334 /* FALL THRU into number case. */
1335
1336 case '0':
1337 case '1':
1338 case '2':
1339 case '3':
1340 case '4':
1341 case '5':
1342 case '6':
1343 case '7':
1344 case '8':
1345 case '9':
1346 {
1347 /* It's a number. */
1348 int got_dot = 0, got_e = 0, toktype = FLOAT;
3b4efeaa 1349 /* Initialize toktype to anything other than ERROR. */
710122da 1350 char *p = tokstart;
b81654f1
MS
1351 int hex = input_radix > 10;
1352 int local_radix = input_radix;
1353 if (tokchr == '0' && (p[1] == 'x' || p[1] == 'X'))
1354 {
1355 p += 2;
1356 hex = 1;
1357 local_radix = 16;
1358 }
1359 else if (tokchr == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D'))
1360 {
1361 p += 2;
1362 hex = 0;
1363 local_radix = 10;
1364 }
1365
1366 for (;; ++p)
1367 {
1368 /* This test includes !hex because 'e' is a valid hex digit
1369 and thus does not indicate a floating point number when
1370 the radix is hex. */
1371
1372 if (!hex && (*p == 'e' || *p == 'E'))
1373 if (got_e)
3b4efeaa 1374 toktype = ERROR; /* Only one 'e' in a float. */
b81654f1
MS
1375 else
1376 got_e = 1;
3b4efeaa
MS
1377 /* This test does not include !hex, because a '.' always
1378 indicates a decimal floating point number regardless of
1379 the radix. */
b81654f1
MS
1380 else if (*p == '.')
1381 if (got_dot)
3b4efeaa 1382 toktype = ERROR; /* Only one '.' in a float. */
b81654f1
MS
1383 else
1384 got_dot = 1;
1385 else if (got_e && (p[-1] == 'e' || p[-1] == 'E') &&
1386 (*p == '-' || *p == '+'))
1387 /* This is the sign of the exponent, not the end of the
1388 number. */
1389 continue;
3b4efeaa
MS
1390 /* Always take decimal digits; parse_number handles radix
1391 error. */
b81654f1
MS
1392 else if (*p >= '0' && *p <= '9')
1393 continue;
3b4efeaa
MS
1394 /* We will take letters only if hex is true, and only up
1395 to what the input radix would permit. FSF was content
1396 to rely on parse_number to validate; but it leaks. */
1397 else if (*p >= 'a' && *p <= 'z')
1398 {
1399 if (!hex || *p >= ('a' + local_radix - 10))
1400 toktype = ERROR;
1401 }
1402 else if (*p >= 'A' && *p <= 'Z')
1403 {
1404 if (!hex || *p >= ('A' + local_radix - 10))
1405 toktype = ERROR;
1406 }
b81654f1
MS
1407 else break;
1408 }
1409 if (toktype != ERROR)
3b4efeaa
MS
1410 toktype = parse_number (tokstart, p - tokstart,
1411 got_dot | got_e, &yylval);
b81654f1
MS
1412 if (toktype == ERROR)
1413 {
1414 char *err_copy = (char *) alloca (p - tokstart + 1);
1415
1416 memcpy (err_copy, tokstart, p - tokstart);
1417 err_copy[p - tokstart] = 0;
1418 error ("Invalid number \"%s\".", err_copy);
1419 }
1420 lexptr = p;
1421 return toktype;
1422 }
1423
1424 case '+':
1425 case '-':
1426 case '*':
1427 case '/':
1428 case '%':
1429 case '|':
1430 case '&':
1431 case '^':
1432 case '~':
1433 case '!':
1434#if 0
3b4efeaa 1435 case '@': /* Moved out below. */
b81654f1
MS
1436#endif
1437 case '<':
1438 case '>':
1439 case '[':
1440 case ']':
1441 case '?':
1442 case ':':
1443 case '=':
1444 case '{':
1445 case '}':
1446 symbol:
1447 lexptr++;
1448 return tokchr;
1449
1450 case '@':
1451 if (strncmp(tokstart, "@selector", 9) == 0)
1452 {
1453 tokptr = strchr(tokstart, '(');
1454 if (tokptr == NULL)
1455 {
1456 error ("Missing '(' in @selector(...)");
1457 }
1458 tempbufindex = 0;
3b4efeaa 1459 tokptr++; /* Skip the '('. */
b81654f1 1460 do {
3b4efeaa
MS
1461 /* Grow the static temp buffer if necessary, including
1462 allocating the first one on demand. */
b81654f1
MS
1463 if (tempbufindex + 1 >= tempbufsize)
1464 {
1465 tempbuf = (char *) realloc (tempbuf, tempbufsize += 64);
1466 }
1467 tempbuf[tempbufindex++] = *tokptr++;
1468 } while ((*tokptr != ')') && (*tokptr != '\0'));
1469 if (*tokptr++ != ')')
1470 {
1471 error ("Missing ')' in @selector(...)");
1472 }
1473 tempbuf[tempbufindex] = '\0';
1474 yylval.sval.ptr = tempbuf;
1475 yylval.sval.length = tempbufindex;
1476 lexptr = tokptr;
1477 return SELECTOR;
1478 }
1479 if (tokstart[1] != '"')
1480 {
1481 lexptr++;
1482 return tokchr;
1483 }
3b4efeaa
MS
1484 /* ObjC NextStep NSString constant: fall thru and parse like
1485 STRING. */
b81654f1
MS
1486 tokstart++;
1487
1488 case '"':
1489
1490 /* Build the gdb internal form of the input string in tempbuf,
1491 translating any standard C escape forms seen. Note that the
1492 buffer is null byte terminated *only* for the convenience of
1493 debugging gdb itself and printing the buffer contents when
1494 the buffer contains no embedded nulls. Gdb does not depend
3b4efeaa
MS
1495 upon the buffer being null byte terminated, it uses the
1496 length string instead. This allows gdb to handle C strings
1497 (as well as strings in other languages) with embedded null
1498 bytes. */
b81654f1
MS
1499
1500 tokptr = ++tokstart;
1501 tempbufindex = 0;
1502
1503 do {
3b4efeaa
MS
1504 /* Grow the static temp buffer if necessary, including
1505 allocating the first one on demand. */
b81654f1
MS
1506 if (tempbufindex + 1 >= tempbufsize)
1507 {
1508 tempbuf = (char *) realloc (tempbuf, tempbufsize += 64);
1509 }
1510 switch (*tokptr)
1511 {
1512 case '\0':
1513 case '"':
3b4efeaa 1514 /* Do nothing, loop will terminate. */
b81654f1
MS
1515 break;
1516 case '\\':
1517 tokptr++;
1518 c = parse_escape (&tokptr);
1519 if (c == -1)
1520 {
1521 continue;
1522 }
1523 tempbuf[tempbufindex++] = c;
1524 break;
1525 default:
1526 tempbuf[tempbufindex++] = *tokptr++;
1527 break;
1528 }
1529 } while ((*tokptr != '"') && (*tokptr != '\0'));
1530 if (*tokptr++ != '"')
1531 {
1532 error ("Unterminated string in expression.");
1533 }
3b4efeaa 1534 tempbuf[tempbufindex] = '\0'; /* See note above. */
b81654f1
MS
1535 yylval.sval.ptr = tempbuf;
1536 yylval.sval.length = tempbufindex;
1537 lexptr = tokptr;
1538 return (tokchr == '@' ? NSSTRING : STRING);
1539 }
1540
1541 if (!(tokchr == '_' || tokchr == '$' ||
1542 (tokchr >= 'a' && tokchr <= 'z') || (tokchr >= 'A' && tokchr <= 'Z')))
1543 /* We must have come across a bad character (e.g. ';'). */
1544 error ("Invalid character '%c' in expression.", c);
1545
1546 /* It's a name. See how long it is. */
1547 namelen = 0;
1548 for (c = tokstart[namelen];
1549 (c == '_' || c == '$' || (c >= '0' && c <= '9')
1550 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '<');)
1551 {
1552 if (c == '<')
1553 {
1554 int i = namelen;
1555 while (tokstart[++i] && tokstart[i] != '>');
1556 if (tokstart[i] == '>')
1557 namelen = i;
1558 }
1559 c = tokstart[++namelen];
1560 }
1561
1562 /* The token "if" terminates the expression and is NOT
1563 removed from the input stream. */
1564 if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f')
1565 {
1566 return 0;
1567 }
1568
1569 lexptr += namelen;
1570
1571 tryname:
1572
1573 /* Catch specific keywords. Should be done with a data structure. */
1574 switch (namelen)
1575 {
1576 case 8:
cb137aa5 1577 if (DEPRECATED_STREQN (tokstart, "unsigned", 8))
b81654f1
MS
1578 return UNSIGNED;
1579 if (current_language->la_language == language_cplus
bf896cb0 1580 && strncmp (tokstart, "template", 8) == 0)
b81654f1 1581 return TEMPLATE;
cb137aa5 1582 if (DEPRECATED_STREQN (tokstart, "volatile", 8))
b81654f1
MS
1583 return VOLATILE_KEYWORD;
1584 break;
1585 case 6:
cb137aa5 1586 if (DEPRECATED_STREQN (tokstart, "struct", 6))
b81654f1 1587 return STRUCT;
cb137aa5 1588 if (DEPRECATED_STREQN (tokstart, "signed", 6))
b81654f1 1589 return SIGNED_KEYWORD;
cb137aa5 1590 if (DEPRECATED_STREQN (tokstart, "sizeof", 6))
b81654f1 1591 return SIZEOF;
cb137aa5 1592 if (DEPRECATED_STREQN (tokstart, "double", 6))
b81654f1
MS
1593 return DOUBLE_KEYWORD;
1594 break;
1595 case 5:
1596 if ((current_language->la_language == language_cplus)
bf896cb0 1597 && strncmp (tokstart, "class", 5) == 0)
b81654f1 1598 return CLASS;
cb137aa5 1599 if (DEPRECATED_STREQN (tokstart, "union", 5))
b81654f1 1600 return UNION;
cb137aa5 1601 if (DEPRECATED_STREQN (tokstart, "short", 5))
b81654f1 1602 return SHORT;
cb137aa5 1603 if (DEPRECATED_STREQN (tokstart, "const", 5))
b81654f1
MS
1604 return CONST_KEYWORD;
1605 break;
1606 case 4:
cb137aa5 1607 if (DEPRECATED_STREQN (tokstart, "enum", 4))
b81654f1 1608 return ENUM;
cb137aa5 1609 if (DEPRECATED_STREQN (tokstart, "long", 4))
b81654f1 1610 return LONG;
b81654f1
MS
1611 break;
1612 case 3:
cb137aa5 1613 if (DEPRECATED_STREQN (tokstart, "int", 3))
b81654f1
MS
1614 return INT_KEYWORD;
1615 break;
1616 default:
1617 break;
1618 }
1619
1620 yylval.sval.ptr = tokstart;
1621 yylval.sval.length = namelen;
1622
1623 if (*tokstart == '$')
1624 {
1625 write_dollar_variable (yylval.sval);
1626 return VARIABLE;
1627 }
1628
1629 /* Use token-type BLOCKNAME for symbols that happen to be defined as
1630 functions or symtabs. If this is not so, then ...
1631 Use token-type TYPENAME for symbols that happen to be defined
1632 currently as names of types; NAME for other symbols.
1633 The caller is not constrained to care about the distinction. */
1634 {
1635 char *tmp = copy_name (yylval.sval);
1636 struct symbol *sym;
1637 int is_a_field_of_this = 0, *need_this;
1638 int hextype;
1639
1640 if (current_language->la_language == language_cplus ||
1641 current_language->la_language == language_objc)
1642 need_this = &is_a_field_of_this;
1643 else
1644 need_this = (int *) NULL;
1645
1646 sym = lookup_symbol (tmp, expression_context_block,
176620f1 1647 VAR_DOMAIN,
b81654f1
MS
1648 need_this,
1649 (struct symtab **) NULL);
3b4efeaa
MS
1650 /* Call lookup_symtab, not lookup_partial_symtab, in case there
1651 are no psymtabs (coff, xcoff, or some future change to blow
1652 away the psymtabs once symbols are read). */
b81654f1
MS
1653 if ((sym && SYMBOL_CLASS (sym) == LOC_BLOCK) ||
1654 lookup_symtab (tmp))
1655 {
1656 yylval.ssym.sym = sym;
1657 yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1658 return BLOCKNAME;
1659 }
1660 if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
1661 {
1662#if 1
3b4efeaa
MS
1663 /* Despite the following flaw, we need to keep this code
1664 enabled. Because we can get called from
1665 check_stub_method, if we don't handle nested types then
1666 it screws many operations in any program which uses
1667 nested types. */
1668 /* In "A::x", if x is a member function of A and there
1669 happens to be a type (nested or not, since the stabs
1670 don't make that distinction) named x, then this code
1671 incorrectly thinks we are dealing with nested types
1672 rather than a member function. */
b81654f1
MS
1673
1674 char *p;
1675 char *namestart;
1676 struct symbol *best_sym;
1677
3b4efeaa
MS
1678 /* Look ahead to detect nested types. This probably should
1679 be done in the grammar, but trying seemed to introduce a
1680 lot of shift/reduce and reduce/reduce conflicts. It's
1681 possible that it could be done, though. Or perhaps a
1682 non-grammar, but less ad hoc, approach would work well. */
b81654f1
MS
1683
1684 /* Since we do not currently have any way of distinguishing
1685 a nested type from a non-nested one (the stabs don't tell
1686 us whether a type is nested), we just ignore the
1687 containing type. */
1688
1689 p = lexptr;
1690 best_sym = sym;
1691 while (1)
1692 {
1693 /* Skip whitespace. */
1694 while (*p == ' ' || *p == '\t' || *p == '\n')
1695 ++p;
1696 if (*p == ':' && p[1] == ':')
1697 {
1698 /* Skip the `::'. */
1699 p += 2;
1700 /* Skip whitespace. */
1701 while (*p == ' ' || *p == '\t' || *p == '\n')
1702 ++p;
1703 namestart = p;
1704 while (*p == '_' || *p == '$' || (*p >= '0' && *p <= '9')
1705 || (*p >= 'a' && *p <= 'z')
1706 || (*p >= 'A' && *p <= 'Z'))
1707 ++p;
1708 if (p != namestart)
1709 {
1710 struct symbol *cur_sym;
3b4efeaa
MS
1711 /* As big as the whole rest of the expression,
1712 which is at least big enough. */
1713 char *ncopy = alloca (strlen (tmp) +
1714 strlen (namestart) + 3);
b81654f1
MS
1715 char *tmp1;
1716
1717 tmp1 = ncopy;
1718 memcpy (tmp1, tmp, strlen (tmp));
1719 tmp1 += strlen (tmp);
1720 memcpy (tmp1, "::", 2);
1721 tmp1 += 2;
1722 memcpy (tmp1, namestart, p - namestart);
1723 tmp1[p - namestart] = '\0';
3b4efeaa
MS
1724 cur_sym = lookup_symbol (ncopy,
1725 expression_context_block,
176620f1 1726 VAR_DOMAIN, (int *) NULL,
b81654f1
MS
1727 (struct symtab **) NULL);
1728 if (cur_sym)
1729 {
1730 if (SYMBOL_CLASS (cur_sym) == LOC_TYPEDEF)
1731 {
1732 best_sym = cur_sym;
1733 lexptr = p;
1734 }
1735 else
1736 break;
1737 }
1738 else
1739 break;
1740 }
1741 else
1742 break;
1743 }
1744 else
1745 break;
1746 }
1747
1748 yylval.tsym.type = SYMBOL_TYPE (best_sym);
1749#else /* not 0 */
1750 yylval.tsym.type = SYMBOL_TYPE (sym);
1751#endif /* not 0 */
1752 return TYPENAME;
1753 }
54a5b07d
AC
1754 yylval.tsym.type
1755 = language_lookup_primitive_type_by_name (current_language,
1756 current_gdbarch, tmp);
1757 if (yylval.tsym.type != NULL)
1758 return TYPENAME;
b81654f1 1759
3b4efeaa
MS
1760 /* See if it's an ObjC classname. */
1761 if (!sym)
b81654f1
MS
1762 {
1763 CORE_ADDR Class = lookup_objc_class(tmp);
1764 if (Class)
1765 {
b81654f1 1766 yylval.class.class = Class;
3b4efeaa
MS
1767 if ((sym = lookup_struct_typedef (tmp,
1768 expression_context_block,
1769 1)))
b81654f1
MS
1770 yylval.class.type = SYMBOL_TYPE (sym);
1771 return CLASSNAME;
1772 }
1773 }
1774
1775 /* Input names that aren't symbols but ARE valid hex numbers,
1776 when the input radix permits them, can be names or numbers
1777 depending on the parse. Note we support radixes > 16 here. */
1778 if (!sym &&
1779 ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10) ||
1780 (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
1781 {
1782 YYSTYPE newlval; /* Its value is ignored. */
1783 hextype = parse_number (tokstart, namelen, 0, &newlval);
1784 if (hextype == INT)
1785 {
1786 yylval.ssym.sym = sym;
1787 yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1788 return NAME_OR_INT;
1789 }
1790 }
1791
3b4efeaa 1792 /* Any other kind of symbol. */
b81654f1
MS
1793 yylval.ssym.sym = sym;
1794 yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1795 return NAME;
1796 }
1797}
1798
1799void
1800yyerror (msg)
1801 char *msg;
1802{
1803 if (*lexptr == '\0')
1804 error("A %s near end of expression.", (msg ? msg : "error"));
1805 else
3b4efeaa
MS
1806 error ("A %s in expression, near `%s'.", (msg ? msg : "error"),
1807 lexptr);
b81654f1 1808}
This page took 0.590649 seconds and 4 git commands to generate.