Add Rust documentation
[deliverable/binutils-gdb.git] / gdb / f-exp.y
CommitLineData
0c9c3474 1
c906108c 2/* YACC parser for Fortran expressions, for GDB.
618f726f 3 Copyright (C) 1986-2016 Free Software Foundation, Inc.
4fcf66da 4
c906108c
SS
5 Contributed by Motorola. Adapted from the C parser by Farooq Butt
6 (fmbutt@engage.sps.mot.com).
7
5b1ba0e5 8 This file is part of GDB.
c906108c 9
5b1ba0e5
NS
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
c906108c 14
5b1ba0e5
NS
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
c906108c 19
5b1ba0e5
NS
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
22
23/* This was blantantly ripped off the C expression parser, please
24 be aware of that as you look at its basic structure -FMB */
25
26/* Parse a F77 expression from text in a string,
27 and return the result as a struct expression pointer.
28 That structure contains arithmetic operations in reverse polish,
29 with constants represented by operations that are followed by special data.
30 See expression.h for the details of the format.
31 What is important here is that it can be built up sequentially
32 during the process of parsing; the lower levels of the tree always
33 come first in the result.
34
35 Note that malloc's and realloc's in this file are transformed to
36 xmalloc and xrealloc respectively by the same sed command in the
37 makefile that remaps any other malloc/realloc inserted by the parser
38 generator. Doing this with #defines and trying to control the interaction
39 with include files (<malloc.h> and <stdlib.h> for example) just became
40 too messy, particularly when such includes can be inserted at random
41 times by the parser generator. */
42
43%{
44
45#include "defs.h"
c906108c
SS
46#include "expression.h"
47#include "value.h"
48#include "parser-defs.h"
49#include "language.h"
50#include "f-lang.h"
51#include "bfd.h" /* Required by objfiles.h. */
52#include "symfile.h" /* Required by objfiles.h. */
53#include "objfiles.h" /* For have_full_symbols and have_partial_symbols */
fe898f56 54#include "block.h"
0f6e1ba6 55#include <ctype.h>
c906108c 56
410a0ff2
SDJ
57#define parse_type(ps) builtin_type (parse_gdbarch (ps))
58#define parse_f_type(ps) builtin_f_type (parse_gdbarch (ps))
3e79cecf 59
b3f11165
PA
60/* Remap normal yacc parser interface names (yyparse, yylex, yyerror,
61 etc). */
62#define GDB_YY_REMAP_PREFIX f_
63#include "yy-remap.h"
f461f5cf 64
410a0ff2
SDJ
65/* The state of the parser, used internally when we are parsing the
66 expression. */
67
68static struct parser_state *pstate = NULL;
69
a14ed312 70int yyparse (void);
c906108c 71
a14ed312 72static int yylex (void);
c906108c 73
a14ed312 74void yyerror (char *);
c906108c 75
a14ed312 76static void growbuf_by_size (int);
c906108c 77
a14ed312 78static int match_string_literal (void);
c906108c
SS
79
80%}
81
82/* Although the yacc "value" of an expression is not used,
83 since the result is stored in the structure being created,
84 other node types do have values. */
85
86%union
87 {
88 LONGEST lval;
89 struct {
90 LONGEST val;
91 struct type *type;
92 } typed_val;
93 DOUBLEST dval;
94 struct symbol *sym;
95 struct type *tval;
96 struct stoken sval;
97 struct ttype tsym;
98 struct symtoken ssym;
99 int voidval;
100 struct block *bval;
101 enum exp_opcode opcode;
102 struct internalvar *ivar;
103
104 struct type **tvec;
105 int *ivec;
106 }
107
108%{
109/* YYSTYPE gets defined by %union */
410a0ff2
SDJ
110static int parse_number (struct parser_state *, const char *, int,
111 int, YYSTYPE *);
c906108c
SS
112%}
113
114%type <voidval> exp type_exp start variable
115%type <tval> type typebase
116%type <tvec> nonempty_typelist
117/* %type <bval> block */
118
119/* Fancy type parsing. */
120%type <voidval> func_mod direct_abs_decl abs_decl
121%type <tval> ptype
122
123%token <typed_val> INT
124%token <dval> FLOAT
125
126/* Both NAME and TYPENAME tokens represent symbols in the input,
127 and both convey their data as strings.
128 But a TYPENAME is a string that happens to be defined as a typedef
129 or builtin type name (such as int or char)
130 and a NAME is any other symbol.
131 Contexts where this distinction is not important can use the
132 nonterminal "name", which matches either NAME or TYPENAME. */
133
134%token <sval> STRING_LITERAL
135%token <lval> BOOLEAN_LITERAL
136%token <ssym> NAME
137%token <tsym> TYPENAME
2a5e440c 138%type <sval> name
c906108c 139%type <ssym> name_not_typename
c906108c
SS
140
141/* A NAME_OR_INT is a symbol which is not known in the symbol table,
142 but which would parse as a valid number in the current input radix.
143 E.g. "c" when input_radix==16. Depending on the parse, it will be
144 turned into a name or into a number. */
145
146%token <ssym> NAME_OR_INT
147
148%token SIZEOF
149%token ERROR
150
151/* Special type cases, put in to allow the parser to distinguish different
152 legal basetypes. */
153%token INT_KEYWORD INT_S2_KEYWORD LOGICAL_S1_KEYWORD LOGICAL_S2_KEYWORD
ce4b0682 154%token LOGICAL_S8_KEYWORD
c906108c
SS
155%token LOGICAL_KEYWORD REAL_KEYWORD REAL_S8_KEYWORD REAL_S16_KEYWORD
156%token COMPLEX_S8_KEYWORD COMPLEX_S16_KEYWORD COMPLEX_S32_KEYWORD
157%token BOOL_AND BOOL_OR BOOL_NOT
158%token <lval> CHARACTER
159
160%token <voidval> VARIABLE
161
162%token <opcode> ASSIGN_MODIFY
163
164%left ','
165%left ABOVE_COMMA
166%right '=' ASSIGN_MODIFY
167%right '?'
168%left BOOL_OR
169%right BOOL_NOT
170%left BOOL_AND
171%left '|'
172%left '^'
173%left '&'
174%left EQUAL NOTEQUAL
175%left LESSTHAN GREATERTHAN LEQ GEQ
176%left LSH RSH
177%left '@'
178%left '+' '-'
2a5e440c 179%left '*' '/'
bd49c137 180%right STARSTAR
2a5e440c 181%right '%'
c906108c
SS
182%right UNARY
183%right '('
184
185\f
186%%
187
188start : exp
189 | type_exp
190 ;
191
192type_exp: type
410a0ff2
SDJ
193 { write_exp_elt_opcode (pstate, OP_TYPE);
194 write_exp_elt_type (pstate, $1);
195 write_exp_elt_opcode (pstate, OP_TYPE); }
c906108c
SS
196 ;
197
198exp : '(' exp ')'
199 { }
200 ;
201
202/* Expressions, not including the comma operator. */
203exp : '*' exp %prec UNARY
410a0ff2 204 { write_exp_elt_opcode (pstate, UNOP_IND); }
ef944135 205 ;
c906108c
SS
206
207exp : '&' exp %prec UNARY
410a0ff2 208 { write_exp_elt_opcode (pstate, UNOP_ADDR); }
ef944135 209 ;
c906108c
SS
210
211exp : '-' exp %prec UNARY
410a0ff2 212 { write_exp_elt_opcode (pstate, UNOP_NEG); }
c906108c
SS
213 ;
214
215exp : BOOL_NOT exp %prec UNARY
410a0ff2 216 { write_exp_elt_opcode (pstate, UNOP_LOGICAL_NOT); }
c906108c
SS
217 ;
218
219exp : '~' exp %prec UNARY
410a0ff2 220 { write_exp_elt_opcode (pstate, UNOP_COMPLEMENT); }
c906108c
SS
221 ;
222
223exp : SIZEOF exp %prec UNARY
410a0ff2 224 { write_exp_elt_opcode (pstate, UNOP_SIZEOF); }
c906108c
SS
225 ;
226
227/* No more explicit array operators, we treat everything in F77 as
228 a function call. The disambiguation as to whether we are
229 doing a subscript operation or a function call is done
230 later in eval.c. */
231
232exp : exp '('
233 { start_arglist (); }
234 arglist ')'
410a0ff2
SDJ
235 { write_exp_elt_opcode (pstate,
236 OP_F77_UNDETERMINED_ARGLIST);
237 write_exp_elt_longcst (pstate,
238 (LONGEST) end_arglist ());
239 write_exp_elt_opcode (pstate,
240 OP_F77_UNDETERMINED_ARGLIST); }
c906108c
SS
241 ;
242
243arglist :
244 ;
245
246arglist : exp
247 { arglist_len = 1; }
248 ;
249
0b4e1325
WZ
250arglist : subrange
251 { arglist_len = 1; }
ef944135 252 ;
c906108c
SS
253
254arglist : arglist ',' exp %prec ABOVE_COMMA
255 { arglist_len++; }
256 ;
257
0b4e1325
WZ
258/* There are four sorts of subrange types in F90. */
259
260subrange: exp ':' exp %prec ABOVE_COMMA
410a0ff2
SDJ
261 { write_exp_elt_opcode (pstate, OP_F90_RANGE);
262 write_exp_elt_longcst (pstate, NONE_BOUND_DEFAULT);
263 write_exp_elt_opcode (pstate, OP_F90_RANGE); }
0b4e1325
WZ
264 ;
265
266subrange: exp ':' %prec ABOVE_COMMA
410a0ff2
SDJ
267 { write_exp_elt_opcode (pstate, OP_F90_RANGE);
268 write_exp_elt_longcst (pstate, HIGH_BOUND_DEFAULT);
269 write_exp_elt_opcode (pstate, OP_F90_RANGE); }
c906108c
SS
270 ;
271
0b4e1325 272subrange: ':' exp %prec ABOVE_COMMA
410a0ff2
SDJ
273 { write_exp_elt_opcode (pstate, OP_F90_RANGE);
274 write_exp_elt_longcst (pstate, LOW_BOUND_DEFAULT);
275 write_exp_elt_opcode (pstate, OP_F90_RANGE); }
0b4e1325
WZ
276 ;
277
278subrange: ':' %prec ABOVE_COMMA
410a0ff2
SDJ
279 { write_exp_elt_opcode (pstate, OP_F90_RANGE);
280 write_exp_elt_longcst (pstate, BOTH_BOUND_DEFAULT);
281 write_exp_elt_opcode (pstate, OP_F90_RANGE); }
0b4e1325 282 ;
c906108c
SS
283
284complexnum: exp ',' exp
285 { }
286 ;
287
288exp : '(' complexnum ')'
410a0ff2
SDJ
289 { write_exp_elt_opcode (pstate, OP_COMPLEX);
290 write_exp_elt_type (pstate,
291 parse_f_type (pstate)
292 ->builtin_complex_s16);
293 write_exp_elt_opcode (pstate, OP_COMPLEX); }
c906108c
SS
294 ;
295
296exp : '(' type ')' exp %prec UNARY
410a0ff2
SDJ
297 { write_exp_elt_opcode (pstate, UNOP_CAST);
298 write_exp_elt_type (pstate, $2);
299 write_exp_elt_opcode (pstate, UNOP_CAST); }
c906108c
SS
300 ;
301
2a5e440c 302exp : exp '%' name
410a0ff2
SDJ
303 { write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
304 write_exp_string (pstate, $3);
305 write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); }
2a5e440c
WZ
306 ;
307
c906108c
SS
308/* Binary operators in order of decreasing precedence. */
309
310exp : exp '@' exp
410a0ff2 311 { write_exp_elt_opcode (pstate, BINOP_REPEAT); }
c906108c
SS
312 ;
313
bd49c137 314exp : exp STARSTAR exp
410a0ff2 315 { write_exp_elt_opcode (pstate, BINOP_EXP); }
bd49c137
WZ
316 ;
317
c906108c 318exp : exp '*' exp
410a0ff2 319 { write_exp_elt_opcode (pstate, BINOP_MUL); }
c906108c
SS
320 ;
321
322exp : exp '/' exp
410a0ff2 323 { write_exp_elt_opcode (pstate, BINOP_DIV); }
c906108c
SS
324 ;
325
c906108c 326exp : exp '+' exp
410a0ff2 327 { write_exp_elt_opcode (pstate, BINOP_ADD); }
c906108c
SS
328 ;
329
330exp : exp '-' exp
410a0ff2 331 { write_exp_elt_opcode (pstate, BINOP_SUB); }
c906108c
SS
332 ;
333
334exp : exp LSH exp
410a0ff2 335 { write_exp_elt_opcode (pstate, BINOP_LSH); }
c906108c
SS
336 ;
337
338exp : exp RSH exp
410a0ff2 339 { write_exp_elt_opcode (pstate, BINOP_RSH); }
c906108c
SS
340 ;
341
342exp : exp EQUAL exp
410a0ff2 343 { write_exp_elt_opcode (pstate, BINOP_EQUAL); }
c906108c
SS
344 ;
345
346exp : exp NOTEQUAL exp
410a0ff2 347 { write_exp_elt_opcode (pstate, BINOP_NOTEQUAL); }
c906108c
SS
348 ;
349
350exp : exp LEQ exp
410a0ff2 351 { write_exp_elt_opcode (pstate, BINOP_LEQ); }
c906108c
SS
352 ;
353
354exp : exp GEQ exp
410a0ff2 355 { write_exp_elt_opcode (pstate, BINOP_GEQ); }
c906108c
SS
356 ;
357
358exp : exp LESSTHAN exp
410a0ff2 359 { write_exp_elt_opcode (pstate, BINOP_LESS); }
c906108c
SS
360 ;
361
362exp : exp GREATERTHAN exp
410a0ff2 363 { write_exp_elt_opcode (pstate, BINOP_GTR); }
c906108c
SS
364 ;
365
366exp : exp '&' exp
410a0ff2 367 { write_exp_elt_opcode (pstate, BINOP_BITWISE_AND); }
c906108c
SS
368 ;
369
370exp : exp '^' exp
410a0ff2 371 { write_exp_elt_opcode (pstate, BINOP_BITWISE_XOR); }
c906108c
SS
372 ;
373
374exp : exp '|' exp
410a0ff2 375 { write_exp_elt_opcode (pstate, BINOP_BITWISE_IOR); }
c906108c
SS
376 ;
377
378exp : exp BOOL_AND exp
410a0ff2 379 { write_exp_elt_opcode (pstate, BINOP_LOGICAL_AND); }
c906108c
SS
380 ;
381
382
383exp : exp BOOL_OR exp
410a0ff2 384 { write_exp_elt_opcode (pstate, BINOP_LOGICAL_OR); }
c906108c
SS
385 ;
386
387exp : exp '=' exp
410a0ff2 388 { write_exp_elt_opcode (pstate, BINOP_ASSIGN); }
c906108c
SS
389 ;
390
391exp : exp ASSIGN_MODIFY exp
410a0ff2
SDJ
392 { write_exp_elt_opcode (pstate, BINOP_ASSIGN_MODIFY);
393 write_exp_elt_opcode (pstate, $2);
394 write_exp_elt_opcode (pstate, BINOP_ASSIGN_MODIFY); }
c906108c
SS
395 ;
396
397exp : INT
410a0ff2
SDJ
398 { write_exp_elt_opcode (pstate, OP_LONG);
399 write_exp_elt_type (pstate, $1.type);
400 write_exp_elt_longcst (pstate, (LONGEST) ($1.val));
401 write_exp_elt_opcode (pstate, OP_LONG); }
c906108c
SS
402 ;
403
404exp : NAME_OR_INT
405 { YYSTYPE val;
410a0ff2
SDJ
406 parse_number (pstate, $1.stoken.ptr,
407 $1.stoken.length, 0, &val);
408 write_exp_elt_opcode (pstate, OP_LONG);
409 write_exp_elt_type (pstate, val.typed_val.type);
410 write_exp_elt_longcst (pstate,
411 (LONGEST)val.typed_val.val);
412 write_exp_elt_opcode (pstate, OP_LONG); }
c906108c
SS
413 ;
414
415exp : FLOAT
410a0ff2
SDJ
416 { write_exp_elt_opcode (pstate, OP_DOUBLE);
417 write_exp_elt_type (pstate,
418 parse_f_type (pstate)
419 ->builtin_real_s8);
420 write_exp_elt_dblcst (pstate, $1);
421 write_exp_elt_opcode (pstate, OP_DOUBLE); }
c906108c
SS
422 ;
423
424exp : variable
425 ;
426
427exp : VARIABLE
428 ;
429
430exp : SIZEOF '(' type ')' %prec UNARY
410a0ff2
SDJ
431 { write_exp_elt_opcode (pstate, OP_LONG);
432 write_exp_elt_type (pstate,
433 parse_f_type (pstate)
434 ->builtin_integer);
f168693b 435 $3 = check_typedef ($3);
410a0ff2
SDJ
436 write_exp_elt_longcst (pstate,
437 (LONGEST) TYPE_LENGTH ($3));
438 write_exp_elt_opcode (pstate, OP_LONG); }
c906108c
SS
439 ;
440
441exp : BOOLEAN_LITERAL
410a0ff2
SDJ
442 { write_exp_elt_opcode (pstate, OP_BOOL);
443 write_exp_elt_longcst (pstate, (LONGEST) $1);
444 write_exp_elt_opcode (pstate, OP_BOOL);
c906108c
SS
445 }
446 ;
447
448exp : STRING_LITERAL
449 {
410a0ff2
SDJ
450 write_exp_elt_opcode (pstate, OP_STRING);
451 write_exp_string (pstate, $1);
452 write_exp_elt_opcode (pstate, OP_STRING);
c906108c
SS
453 }
454 ;
455
456variable: name_not_typename
d12307c1 457 { struct block_symbol sym = $1.sym;
c906108c 458
d12307c1 459 if (sym.symbol)
c906108c 460 {
d12307c1 461 if (symbol_read_needs_frame (sym.symbol))
c906108c 462 {
905e0470 463 if (innermost_block == 0
d12307c1 464 || contained_in (sym.block,
905e0470 465 innermost_block))
d12307c1 466 innermost_block = sym.block;
c906108c 467 }
410a0ff2 468 write_exp_elt_opcode (pstate, OP_VAR_VALUE);
63e43d3a 469 write_exp_elt_block (pstate, sym.block);
d12307c1 470 write_exp_elt_sym (pstate, sym.symbol);
410a0ff2 471 write_exp_elt_opcode (pstate, OP_VAR_VALUE);
c906108c
SS
472 break;
473 }
474 else
475 {
7c7b6655 476 struct bound_minimal_symbol msymbol;
710122da 477 char *arg = copy_name ($1.stoken);
c906108c
SS
478
479 msymbol =
7c7b6655
TT
480 lookup_bound_minimal_symbol (arg);
481 if (msymbol.minsym != NULL)
410a0ff2 482 write_exp_msymbol (pstate, msymbol);
c906108c 483 else if (!have_full_symbols () && !have_partial_symbols ())
001083c6 484 error (_("No symbol table is loaded. Use the \"file\" command."));
c906108c 485 else
001083c6 486 error (_("No symbol \"%s\" in current context."),
c906108c
SS
487 copy_name ($1.stoken));
488 }
489 }
490 ;
491
492
493type : ptype
494 ;
495
496ptype : typebase
497 | typebase abs_decl
498 {
499 /* This is where the interesting stuff happens. */
500 int done = 0;
501 int array_size;
502 struct type *follow_type = $1;
503 struct type *range_type;
504
505 while (!done)
506 switch (pop_type ())
507 {
508 case tp_end:
509 done = 1;
510 break;
511 case tp_pointer:
512 follow_type = lookup_pointer_type (follow_type);
513 break;
514 case tp_reference:
515 follow_type = lookup_reference_type (follow_type);
516 break;
517 case tp_array:
518 array_size = pop_type_int ();
519 if (array_size != -1)
520 {
521 range_type =
0c9c3474
SA
522 create_static_range_type ((struct type *) NULL,
523 parse_f_type (pstate)
524 ->builtin_integer,
525 0, array_size - 1);
c906108c
SS
526 follow_type =
527 create_array_type ((struct type *) NULL,
528 follow_type, range_type);
529 }
530 else
531 follow_type = lookup_pointer_type (follow_type);
532 break;
533 case tp_function:
534 follow_type = lookup_function_type (follow_type);
535 break;
536 }
537 $$ = follow_type;
538 }
539 ;
540
541abs_decl: '*'
542 { push_type (tp_pointer); $$ = 0; }
543 | '*' abs_decl
544 { push_type (tp_pointer); $$ = $2; }
545 | '&'
546 { push_type (tp_reference); $$ = 0; }
547 | '&' abs_decl
548 { push_type (tp_reference); $$ = $2; }
549 | direct_abs_decl
550 ;
551
552direct_abs_decl: '(' abs_decl ')'
553 { $$ = $2; }
554 | direct_abs_decl func_mod
555 { push_type (tp_function); }
556 | func_mod
557 { push_type (tp_function); }
558 ;
559
560func_mod: '(' ')'
561 { $$ = 0; }
562 | '(' nonempty_typelist ')'
8dbb1c65 563 { free ($2); $$ = 0; }
c906108c
SS
564 ;
565
566typebase /* Implements (approximately): (type-qualifier)* type-specifier */
567 : TYPENAME
568 { $$ = $1.type; }
569 | INT_KEYWORD
410a0ff2 570 { $$ = parse_f_type (pstate)->builtin_integer; }
c906108c 571 | INT_S2_KEYWORD
410a0ff2 572 { $$ = parse_f_type (pstate)->builtin_integer_s2; }
c906108c 573 | CHARACTER
410a0ff2 574 { $$ = parse_f_type (pstate)->builtin_character; }
ce4b0682 575 | LOGICAL_S8_KEYWORD
410a0ff2 576 { $$ = parse_f_type (pstate)->builtin_logical_s8; }
c906108c 577 | LOGICAL_KEYWORD
410a0ff2 578 { $$ = parse_f_type (pstate)->builtin_logical; }
c906108c 579 | LOGICAL_S2_KEYWORD
410a0ff2 580 { $$ = parse_f_type (pstate)->builtin_logical_s2; }
c906108c 581 | LOGICAL_S1_KEYWORD
410a0ff2 582 { $$ = parse_f_type (pstate)->builtin_logical_s1; }
c906108c 583 | REAL_KEYWORD
410a0ff2 584 { $$ = parse_f_type (pstate)->builtin_real; }
c906108c 585 | REAL_S8_KEYWORD
410a0ff2 586 { $$ = parse_f_type (pstate)->builtin_real_s8; }
c906108c 587 | REAL_S16_KEYWORD
410a0ff2 588 { $$ = parse_f_type (pstate)->builtin_real_s16; }
c906108c 589 | COMPLEX_S8_KEYWORD
410a0ff2 590 { $$ = parse_f_type (pstate)->builtin_complex_s8; }
c906108c 591 | COMPLEX_S16_KEYWORD
410a0ff2 592 { $$ = parse_f_type (pstate)->builtin_complex_s16; }
c906108c 593 | COMPLEX_S32_KEYWORD
410a0ff2 594 { $$ = parse_f_type (pstate)->builtin_complex_s32; }
c906108c
SS
595 ;
596
c906108c
SS
597nonempty_typelist
598 : type
599 { $$ = (struct type **) malloc (sizeof (struct type *) * 2);
600 $<ivec>$[0] = 1; /* Number of types in vector */
601 $$[1] = $1;
602 }
603 | nonempty_typelist ',' type
604 { int len = sizeof (struct type *) * (++($<ivec>1[0]) + 1);
605 $$ = (struct type **) realloc ((char *) $1, len);
606 $$[$<ivec>$[0]] = $3;
607 }
608 ;
609
2a5e440c
WZ
610name : NAME
611 { $$ = $1.stoken; }
612 ;
613
c906108c
SS
614name_not_typename : NAME
615/* These would be useful if name_not_typename was useful, but it is just
616 a fake for "variable", so these cause reduce/reduce conflicts because
617 the parser can't tell whether NAME_OR_INT is a name_not_typename (=variable,
618 =exp) or just an exp. If name_not_typename was ever used in an lvalue
619 context where only a name could occur, this might be useful.
620 | NAME_OR_INT
621 */
622 ;
623
624%%
625
626/* Take care of parsing a number (anything that starts with a digit).
627 Set yylval and return the token type; update lexptr.
628 LEN is the number of characters in it. */
629
630/*** Needs some error checking for the float case ***/
631
632static int
410a0ff2
SDJ
633parse_number (struct parser_state *par_state,
634 const char *p, int len, int parsed_float, YYSTYPE *putithere)
c906108c 635{
710122da
DC
636 LONGEST n = 0;
637 LONGEST prevn = 0;
638 int c;
639 int base = input_radix;
c906108c
SS
640 int unsigned_p = 0;
641 int long_p = 0;
642 ULONGEST high_bit;
643 struct type *signed_type;
644 struct type *unsigned_type;
645
646 if (parsed_float)
647 {
648 /* It's a float since it contains a point or an exponent. */
649 /* [dD] is not understood as an exponent by atof, change it to 'e'. */
650 char *tmp, *tmp2;
651
4fcf66da 652 tmp = xstrdup (p);
c906108c
SS
653 for (tmp2 = tmp; *tmp2; ++tmp2)
654 if (*tmp2 == 'd' || *tmp2 == 'D')
655 *tmp2 = 'e';
656 putithere->dval = atof (tmp);
657 free (tmp);
658 return FLOAT;
659 }
660
661 /* Handle base-switching prefixes 0x, 0t, 0d, 0 */
662 if (p[0] == '0')
663 switch (p[1])
664 {
665 case 'x':
666 case 'X':
667 if (len >= 3)
668 {
669 p += 2;
670 base = 16;
671 len -= 2;
672 }
673 break;
674
675 case 't':
676 case 'T':
677 case 'd':
678 case 'D':
679 if (len >= 3)
680 {
681 p += 2;
682 base = 10;
683 len -= 2;
684 }
685 break;
686
687 default:
688 base = 8;
689 break;
690 }
691
692 while (len-- > 0)
693 {
694 c = *p++;
0f6e1ba6
AC
695 if (isupper (c))
696 c = tolower (c);
697 if (len == 0 && c == 'l')
698 long_p = 1;
699 else if (len == 0 && c == 'u')
700 unsigned_p = 1;
c906108c
SS
701 else
702 {
0f6e1ba6
AC
703 int i;
704 if (c >= '0' && c <= '9')
705 i = c - '0';
706 else if (c >= 'a' && c <= 'f')
707 i = c - 'a' + 10;
c906108c
SS
708 else
709 return ERROR; /* Char not a digit */
0f6e1ba6
AC
710 if (i >= base)
711 return ERROR; /* Invalid digit in this base */
712 n *= base;
713 n += i;
c906108c 714 }
c906108c
SS
715 /* Portably test for overflow (only works for nonzero values, so make
716 a second check for zero). */
717 if ((prevn >= n) && n != 0)
718 unsigned_p=1; /* Try something unsigned */
719 /* If range checking enabled, portably test for unsigned overflow. */
720 if (RANGE_CHECK && n != 0)
721 {
722 if ((unsigned_p && (unsigned)prevn >= (unsigned)n))
001083c6 723 range_error (_("Overflow on numeric constant."));
c906108c
SS
724 }
725 prevn = n;
726 }
727
728 /* If the number is too big to be an int, or it's got an l suffix
729 then it's a long. Work out if this has to be a long by
7a9dd1b2 730 shifting right and seeing if anything remains, and the
c906108c
SS
731 target int size is different to the target long size.
732
733 In the expression below, we could have tested
3e79cecf 734 (n >> gdbarch_int_bit (parse_gdbarch))
c906108c
SS
735 to see if it was zero,
736 but too many compilers warn about that, when ints and longs
737 are the same size. So we shift it twice, with fewer bits
738 each time, for the same result. */
739
410a0ff2
SDJ
740 if ((gdbarch_int_bit (parse_gdbarch (par_state))
741 != gdbarch_long_bit (parse_gdbarch (par_state))
9a76efb6 742 && ((n >> 2)
410a0ff2
SDJ
743 >> (gdbarch_int_bit (parse_gdbarch (par_state))-2))) /* Avoid
744 shift warning */
c906108c
SS
745 || long_p)
746 {
410a0ff2
SDJ
747 high_bit = ((ULONGEST)1)
748 << (gdbarch_long_bit (parse_gdbarch (par_state))-1);
749 unsigned_type = parse_type (par_state)->builtin_unsigned_long;
750 signed_type = parse_type (par_state)->builtin_long;
c906108c
SS
751 }
752 else
753 {
410a0ff2
SDJ
754 high_bit =
755 ((ULONGEST)1) << (gdbarch_int_bit (parse_gdbarch (par_state)) - 1);
756 unsigned_type = parse_type (par_state)->builtin_unsigned_int;
757 signed_type = parse_type (par_state)->builtin_int;
c906108c
SS
758 }
759
760 putithere->typed_val.val = n;
761
762 /* If the high bit of the worked out type is set then this number
0963b4bd 763 has to be unsigned. */
c906108c
SS
764
765 if (unsigned_p || (n & high_bit))
766 putithere->typed_val.type = unsigned_type;
767 else
768 putithere->typed_val.type = signed_type;
769
770 return INT;
771}
772
773struct token
774{
fe978cb0 775 char *oper;
c906108c
SS
776 int token;
777 enum exp_opcode opcode;
778};
779
780static const struct token dot_ops[] =
781{
782 { ".and.", BOOL_AND, BINOP_END },
783 { ".AND.", BOOL_AND, BINOP_END },
784 { ".or.", BOOL_OR, BINOP_END },
785 { ".OR.", BOOL_OR, BINOP_END },
786 { ".not.", BOOL_NOT, BINOP_END },
787 { ".NOT.", BOOL_NOT, BINOP_END },
788 { ".eq.", EQUAL, BINOP_END },
789 { ".EQ.", EQUAL, BINOP_END },
790 { ".eqv.", EQUAL, BINOP_END },
791 { ".NEQV.", NOTEQUAL, BINOP_END },
792 { ".neqv.", NOTEQUAL, BINOP_END },
793 { ".EQV.", EQUAL, BINOP_END },
794 { ".ne.", NOTEQUAL, BINOP_END },
795 { ".NE.", NOTEQUAL, BINOP_END },
796 { ".le.", LEQ, BINOP_END },
797 { ".LE.", LEQ, BINOP_END },
798 { ".ge.", GEQ, BINOP_END },
799 { ".GE.", GEQ, BINOP_END },
800 { ".gt.", GREATERTHAN, BINOP_END },
801 { ".GT.", GREATERTHAN, BINOP_END },
802 { ".lt.", LESSTHAN, BINOP_END },
803 { ".LT.", LESSTHAN, BINOP_END },
f486487f 804 { NULL, 0, BINOP_END }
c906108c
SS
805};
806
807struct f77_boolean_val
808{
809 char *name;
810 int value;
811};
812
813static const struct f77_boolean_val boolean_values[] =
814{
815 { ".true.", 1 },
816 { ".TRUE.", 1 },
817 { ".false.", 0 },
818 { ".FALSE.", 0 },
819 { NULL, 0 }
820};
821
822static const struct token f77_keywords[] =
823{
824 { "complex_16", COMPLEX_S16_KEYWORD, BINOP_END },
825 { "complex_32", COMPLEX_S32_KEYWORD, BINOP_END },
826 { "character", CHARACTER, BINOP_END },
827 { "integer_2", INT_S2_KEYWORD, BINOP_END },
828 { "logical_1", LOGICAL_S1_KEYWORD, BINOP_END },
829 { "logical_2", LOGICAL_S2_KEYWORD, BINOP_END },
ce4b0682 830 { "logical_8", LOGICAL_S8_KEYWORD, BINOP_END },
c906108c
SS
831 { "complex_8", COMPLEX_S8_KEYWORD, BINOP_END },
832 { "integer", INT_KEYWORD, BINOP_END },
833 { "logical", LOGICAL_KEYWORD, BINOP_END },
834 { "real_16", REAL_S16_KEYWORD, BINOP_END },
835 { "complex", COMPLEX_S8_KEYWORD, BINOP_END },
836 { "sizeof", SIZEOF, BINOP_END },
837 { "real_8", REAL_S8_KEYWORD, BINOP_END },
838 { "real", REAL_KEYWORD, BINOP_END },
f486487f 839 { NULL, 0, BINOP_END }
c906108c
SS
840};
841
842/* Implementation of a dynamically expandable buffer for processing input
843 characters acquired through lexptr and building a value to return in
0963b4bd 844 yylval. Ripped off from ch-exp.y */
c906108c
SS
845
846static char *tempbuf; /* Current buffer contents */
847static int tempbufsize; /* Size of allocated buffer */
848static int tempbufindex; /* Current index into buffer */
849
850#define GROWBY_MIN_SIZE 64 /* Minimum amount to grow buffer by */
851
852#define CHECKBUF(size) \
853 do { \
854 if (tempbufindex + (size) >= tempbufsize) \
855 { \
856 growbuf_by_size (size); \
857 } \
858 } while (0);
859
860
0963b4bd
MS
861/* Grow the static temp buffer if necessary, including allocating the
862 first one on demand. */
c906108c
SS
863
864static void
d04550a6 865growbuf_by_size (int count)
c906108c
SS
866{
867 int growby;
868
869 growby = max (count, GROWBY_MIN_SIZE);
870 tempbufsize += growby;
871 if (tempbuf == NULL)
872 tempbuf = (char *) malloc (tempbufsize);
873 else
874 tempbuf = (char *) realloc (tempbuf, tempbufsize);
875}
876
877/* Blatantly ripped off from ch-exp.y. This routine recognizes F77
0963b4bd 878 string-literals.
c906108c
SS
879
880 Recognize a string literal. A string literal is a nonzero sequence
881 of characters enclosed in matching single quotes, except that
882 a single character inside single quotes is a character literal, which
883 we reject as a string literal. To embed the terminator character inside
884 a string, it is simply doubled (I.E. 'this''is''one''string') */
885
886static int
eeae04df 887match_string_literal (void)
c906108c 888{
d7561cbb 889 const char *tokptr = lexptr;
c906108c
SS
890
891 for (tempbufindex = 0, tokptr++; *tokptr != '\0'; tokptr++)
892 {
893 CHECKBUF (1);
894 if (*tokptr == *lexptr)
895 {
896 if (*(tokptr + 1) == *lexptr)
897 tokptr++;
898 else
899 break;
900 }
901 tempbuf[tempbufindex++] = *tokptr;
902 }
903 if (*tokptr == '\0' /* no terminator */
904 || tempbufindex == 0) /* no string */
905 return 0;
906 else
907 {
908 tempbuf[tempbufindex] = '\0';
909 yylval.sval.ptr = tempbuf;
910 yylval.sval.length = tempbufindex;
911 lexptr = ++tokptr;
912 return STRING_LITERAL;
913 }
914}
915
916/* Read one token, getting characters through lexptr. */
917
918static int
eeae04df 919yylex (void)
c906108c
SS
920{
921 int c;
922 int namelen;
923 unsigned int i,token;
d7561cbb 924 const char *tokstart;
c906108c
SS
925
926 retry:
065432a8
PM
927
928 prev_lexptr = lexptr;
929
c906108c
SS
930 tokstart = lexptr;
931
932 /* First of all, let us make sure we are not dealing with the
933 special tokens .true. and .false. which evaluate to 1 and 0. */
934
935 if (*lexptr == '.')
936 {
937 for (i = 0; boolean_values[i].name != NULL; i++)
938 {
bf896cb0
AC
939 if (strncmp (tokstart, boolean_values[i].name,
940 strlen (boolean_values[i].name)) == 0)
c906108c
SS
941 {
942 lexptr += strlen (boolean_values[i].name);
943 yylval.lval = boolean_values[i].value;
944 return BOOLEAN_LITERAL;
945 }
946 }
947 }
948
bd49c137 949 /* See if it is a special .foo. operator. */
c906108c 950
fe978cb0
PA
951 for (i = 0; dot_ops[i].oper != NULL; i++)
952 if (strncmp (tokstart, dot_ops[i].oper,
953 strlen (dot_ops[i].oper)) == 0)
c906108c 954 {
fe978cb0 955 lexptr += strlen (dot_ops[i].oper);
c906108c
SS
956 yylval.opcode = dot_ops[i].opcode;
957 return dot_ops[i].token;
958 }
959
bd49c137
WZ
960 /* See if it is an exponentiation operator. */
961
962 if (strncmp (tokstart, "**", 2) == 0)
963 {
964 lexptr += 2;
965 yylval.opcode = BINOP_EXP;
966 return STARSTAR;
967 }
968
c906108c
SS
969 switch (c = *tokstart)
970 {
971 case 0:
972 return 0;
973
974 case ' ':
975 case '\t':
976 case '\n':
977 lexptr++;
978 goto retry;
979
980 case '\'':
981 token = match_string_literal ();
982 if (token != 0)
983 return (token);
984 break;
985
986 case '(':
987 paren_depth++;
988 lexptr++;
989 return c;
990
991 case ')':
992 if (paren_depth == 0)
993 return 0;
994 paren_depth--;
995 lexptr++;
996 return c;
997
998 case ',':
999 if (comma_terminates && paren_depth == 0)
1000 return 0;
1001 lexptr++;
1002 return c;
1003
1004 case '.':
1005 /* Might be a floating point number. */
1006 if (lexptr[1] < '0' || lexptr[1] > '9')
0963b4bd 1007 goto symbol; /* Nope, must be a symbol. */
c906108c
SS
1008 /* FALL THRU into number case. */
1009
1010 case '0':
1011 case '1':
1012 case '2':
1013 case '3':
1014 case '4':
1015 case '5':
1016 case '6':
1017 case '7':
1018 case '8':
1019 case '9':
1020 {
1021 /* It's a number. */
1022 int got_dot = 0, got_e = 0, got_d = 0, toktype;
d7561cbb 1023 const char *p = tokstart;
c906108c
SS
1024 int hex = input_radix > 10;
1025
1026 if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
1027 {
1028 p += 2;
1029 hex = 1;
1030 }
0963b4bd
MS
1031 else if (c == '0' && (p[1]=='t' || p[1]=='T'
1032 || p[1]=='d' || p[1]=='D'))
c906108c
SS
1033 {
1034 p += 2;
1035 hex = 0;
1036 }
1037
1038 for (;; ++p)
1039 {
1040 if (!hex && !got_e && (*p == 'e' || *p == 'E'))
1041 got_dot = got_e = 1;
1042 else if (!hex && !got_d && (*p == 'd' || *p == 'D'))
1043 got_dot = got_d = 1;
1044 else if (!hex && !got_dot && *p == '.')
1045 got_dot = 1;
1046 else if (((got_e && (p[-1] == 'e' || p[-1] == 'E'))
1047 || (got_d && (p[-1] == 'd' || p[-1] == 'D')))
1048 && (*p == '-' || *p == '+'))
1049 /* This is the sign of the exponent, not the end of the
1050 number. */
1051 continue;
1052 /* We will take any letters or digits. parse_number will
1053 complain if past the radix, or if L or U are not final. */
1054 else if ((*p < '0' || *p > '9')
1055 && ((*p < 'a' || *p > 'z')
1056 && (*p < 'A' || *p > 'Z')))
1057 break;
1058 }
410a0ff2
SDJ
1059 toktype = parse_number (pstate, tokstart, p - tokstart,
1060 got_dot|got_e|got_d,
c906108c
SS
1061 &yylval);
1062 if (toktype == ERROR)
1063 {
1064 char *err_copy = (char *) alloca (p - tokstart + 1);
1065
1066 memcpy (err_copy, tokstart, p - tokstart);
1067 err_copy[p - tokstart] = 0;
001083c6 1068 error (_("Invalid number \"%s\"."), err_copy);
c906108c
SS
1069 }
1070 lexptr = p;
1071 return toktype;
1072 }
1073
1074 case '+':
1075 case '-':
1076 case '*':
1077 case '/':
1078 case '%':
1079 case '|':
1080 case '&':
1081 case '^':
1082 case '~':
1083 case '!':
1084 case '@':
1085 case '<':
1086 case '>':
1087 case '[':
1088 case ']':
1089 case '?':
1090 case ':':
1091 case '=':
1092 case '{':
1093 case '}':
1094 symbol:
1095 lexptr++;
1096 return c;
1097 }
1098
f55ee35c 1099 if (!(c == '_' || c == '$' || c ==':'
c906108c
SS
1100 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
1101 /* We must have come across a bad character (e.g. ';'). */
001083c6 1102 error (_("Invalid character '%c' in expression."), c);
c906108c
SS
1103
1104 namelen = 0;
1105 for (c = tokstart[namelen];
f55ee35c 1106 (c == '_' || c == '$' || c == ':' || (c >= '0' && c <= '9')
c906108c
SS
1107 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
1108 c = tokstart[++namelen]);
1109
1110 /* The token "if" terminates the expression and is NOT
1111 removed from the input stream. */
1112
1113 if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f')
1114 return 0;
1115
1116 lexptr += namelen;
1117
1118 /* Catch specific keywords. */
1119
fe978cb0
PA
1120 for (i = 0; f77_keywords[i].oper != NULL; i++)
1121 if (strlen (f77_keywords[i].oper) == namelen
1122 && strncmp (tokstart, f77_keywords[i].oper, namelen) == 0)
c906108c
SS
1123 {
1124 /* lexptr += strlen(f77_keywords[i].operator); */
1125 yylval.opcode = f77_keywords[i].opcode;
1126 return f77_keywords[i].token;
1127 }
1128
1129 yylval.sval.ptr = tokstart;
1130 yylval.sval.length = namelen;
1131
1132 if (*tokstart == '$')
1133 {
410a0ff2 1134 write_dollar_variable (pstate, yylval.sval);
c906108c
SS
1135 return VARIABLE;
1136 }
1137
1138 /* Use token-type TYPENAME for symbols that happen to be defined
1139 currently as names of types; NAME for other symbols.
1140 The caller is not constrained to care about the distinction. */
1141 {
1142 char *tmp = copy_name (yylval.sval);
d12307c1 1143 struct block_symbol result;
1993b719 1144 struct field_of_this_result is_a_field_of_this;
530e8392
KB
1145 enum domain_enum_tag lookup_domains[] =
1146 {
1147 STRUCT_DOMAIN,
1148 VAR_DOMAIN,
1149 MODULE_DOMAIN
1150 };
7f9b20bb 1151 int i;
c906108c 1152 int hextype;
7f9b20bb
KB
1153
1154 for (i = 0; i < ARRAY_SIZE (lookup_domains); ++i)
c906108c 1155 {
7f9b20bb
KB
1156 /* Initialize this in case we *don't* use it in this call; that
1157 way we can refer to it unconditionally below. */
1158 memset (&is_a_field_of_this, 0, sizeof (is_a_field_of_this));
1159
d12307c1
PMR
1160 result = lookup_symbol (tmp, expression_context_block,
1161 lookup_domains[i],
1162 parse_language (pstate)->la_language
1163 == language_cplus
1164 ? &is_a_field_of_this : NULL);
1165 if (result.symbol && SYMBOL_CLASS (result.symbol) == LOC_TYPEDEF)
7f9b20bb 1166 {
d12307c1 1167 yylval.tsym.type = SYMBOL_TYPE (result.symbol);
7f9b20bb
KB
1168 return TYPENAME;
1169 }
1170
d12307c1 1171 if (result.symbol)
7f9b20bb 1172 break;
c906108c 1173 }
7f9b20bb 1174
54a5b07d 1175 yylval.tsym.type
46b0da17
DE
1176 = language_lookup_primitive_type (parse_language (pstate),
1177 parse_gdbarch (pstate), tmp);
54a5b07d 1178 if (yylval.tsym.type != NULL)
c906108c
SS
1179 return TYPENAME;
1180
1181 /* Input names that aren't symbols but ARE valid hex numbers,
1182 when the input radix permits them, can be names or numbers
1183 depending on the parse. Note we support radixes > 16 here. */
d12307c1 1184 if (!result.symbol
c906108c
SS
1185 && ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10)
1186 || (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
1187 {
1188 YYSTYPE newlval; /* Its value is ignored. */
410a0ff2 1189 hextype = parse_number (pstate, tokstart, namelen, 0, &newlval);
c906108c
SS
1190 if (hextype == INT)
1191 {
d12307c1 1192 yylval.ssym.sym = result;
1993b719 1193 yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
c906108c
SS
1194 return NAME_OR_INT;
1195 }
1196 }
1197
1198 /* Any other kind of symbol */
d12307c1 1199 yylval.ssym.sym = result;
1993b719 1200 yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
c906108c
SS
1201 return NAME;
1202 }
1203}
1204
410a0ff2
SDJ
1205int
1206f_parse (struct parser_state *par_state)
1207{
1208 int result;
1209 struct cleanup *c = make_cleanup_clear_parser_state (&pstate);
1210
1211 /* Setting up the parser state. */
1212 gdb_assert (par_state != NULL);
1213 pstate = par_state;
1214
1215 result = yyparse ();
1216 do_cleanups (c);
1217 return result;
1218}
1219
c906108c 1220void
d04550a6 1221yyerror (char *msg)
c906108c 1222{
065432a8
PM
1223 if (prev_lexptr)
1224 lexptr = prev_lexptr;
1225
001083c6 1226 error (_("A %s in expression, near `%s'."), (msg ? msg : "error"), lexptr);
c906108c 1227}
This page took 1.219011 seconds and 4 git commands to generate.