Rename OP_F90_RANGE to OP_RANGE.
[deliverable/binutils-gdb.git] / gdb / f-exp.y
1
2 /* YACC parser for Fortran expressions, for GDB.
3 Copyright (C) 1986-2016 Free Software Foundation, Inc.
4
5 Contributed by Motorola. Adapted from the C parser by Farooq Butt
6 (fmbutt@engage.sps.mot.com).
7
8 This file is part of GDB.
9
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.
14
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.
19
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/>. */
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"
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 */
54 #include "block.h"
55 #include <ctype.h>
56
57 #define parse_type(ps) builtin_type (parse_gdbarch (ps))
58 #define parse_f_type(ps) builtin_f_type (parse_gdbarch (ps))
59
60 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror,
61 etc). */
62 #define GDB_YY_REMAP_PREFIX f_
63 #include "yy-remap.h"
64
65 /* The state of the parser, used internally when we are parsing the
66 expression. */
67
68 static struct parser_state *pstate = NULL;
69
70 int yyparse (void);
71
72 static int yylex (void);
73
74 void yyerror (char *);
75
76 static void growbuf_by_size (int);
77
78 static int match_string_literal (void);
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 */
110 static int parse_number (struct parser_state *, const char *, int,
111 int, YYSTYPE *);
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
138 %type <sval> name
139 %type <ssym> name_not_typename
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
154 %token LOGICAL_S8_KEYWORD
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 '+' '-'
179 %left '*' '/'
180 %right STARSTAR
181 %right '%'
182 %right UNARY
183 %right '('
184
185 \f
186 %%
187
188 start : exp
189 | type_exp
190 ;
191
192 type_exp: type
193 { write_exp_elt_opcode (pstate, OP_TYPE);
194 write_exp_elt_type (pstate, $1);
195 write_exp_elt_opcode (pstate, OP_TYPE); }
196 ;
197
198 exp : '(' exp ')'
199 { }
200 ;
201
202 /* Expressions, not including the comma operator. */
203 exp : '*' exp %prec UNARY
204 { write_exp_elt_opcode (pstate, UNOP_IND); }
205 ;
206
207 exp : '&' exp %prec UNARY
208 { write_exp_elt_opcode (pstate, UNOP_ADDR); }
209 ;
210
211 exp : '-' exp %prec UNARY
212 { write_exp_elt_opcode (pstate, UNOP_NEG); }
213 ;
214
215 exp : BOOL_NOT exp %prec UNARY
216 { write_exp_elt_opcode (pstate, UNOP_LOGICAL_NOT); }
217 ;
218
219 exp : '~' exp %prec UNARY
220 { write_exp_elt_opcode (pstate, UNOP_COMPLEMENT); }
221 ;
222
223 exp : SIZEOF exp %prec UNARY
224 { write_exp_elt_opcode (pstate, UNOP_SIZEOF); }
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
232 exp : exp '('
233 { start_arglist (); }
234 arglist ')'
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); }
241 ;
242
243 arglist :
244 ;
245
246 arglist : exp
247 { arglist_len = 1; }
248 ;
249
250 arglist : subrange
251 { arglist_len = 1; }
252 ;
253
254 arglist : arglist ',' exp %prec ABOVE_COMMA
255 { arglist_len++; }
256 ;
257
258 /* There are four sorts of subrange types in F90. */
259
260 subrange: exp ':' exp %prec ABOVE_COMMA
261 { write_exp_elt_opcode (pstate, OP_RANGE);
262 write_exp_elt_longcst (pstate, NONE_BOUND_DEFAULT);
263 write_exp_elt_opcode (pstate, OP_RANGE); }
264 ;
265
266 subrange: exp ':' %prec ABOVE_COMMA
267 { write_exp_elt_opcode (pstate, OP_RANGE);
268 write_exp_elt_longcst (pstate, HIGH_BOUND_DEFAULT);
269 write_exp_elt_opcode (pstate, OP_RANGE); }
270 ;
271
272 subrange: ':' exp %prec ABOVE_COMMA
273 { write_exp_elt_opcode (pstate, OP_RANGE);
274 write_exp_elt_longcst (pstate, LOW_BOUND_DEFAULT);
275 write_exp_elt_opcode (pstate, OP_RANGE); }
276 ;
277
278 subrange: ':' %prec ABOVE_COMMA
279 { write_exp_elt_opcode (pstate, OP_RANGE);
280 write_exp_elt_longcst (pstate, BOTH_BOUND_DEFAULT);
281 write_exp_elt_opcode (pstate, OP_RANGE); }
282 ;
283
284 complexnum: exp ',' exp
285 { }
286 ;
287
288 exp : '(' complexnum ')'
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); }
294 ;
295
296 exp : '(' type ')' exp %prec UNARY
297 { write_exp_elt_opcode (pstate, UNOP_CAST);
298 write_exp_elt_type (pstate, $2);
299 write_exp_elt_opcode (pstate, UNOP_CAST); }
300 ;
301
302 exp : exp '%' name
303 { write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
304 write_exp_string (pstate, $3);
305 write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); }
306 ;
307
308 /* Binary operators in order of decreasing precedence. */
309
310 exp : exp '@' exp
311 { write_exp_elt_opcode (pstate, BINOP_REPEAT); }
312 ;
313
314 exp : exp STARSTAR exp
315 { write_exp_elt_opcode (pstate, BINOP_EXP); }
316 ;
317
318 exp : exp '*' exp
319 { write_exp_elt_opcode (pstate, BINOP_MUL); }
320 ;
321
322 exp : exp '/' exp
323 { write_exp_elt_opcode (pstate, BINOP_DIV); }
324 ;
325
326 exp : exp '+' exp
327 { write_exp_elt_opcode (pstate, BINOP_ADD); }
328 ;
329
330 exp : exp '-' exp
331 { write_exp_elt_opcode (pstate, BINOP_SUB); }
332 ;
333
334 exp : exp LSH exp
335 { write_exp_elt_opcode (pstate, BINOP_LSH); }
336 ;
337
338 exp : exp RSH exp
339 { write_exp_elt_opcode (pstate, BINOP_RSH); }
340 ;
341
342 exp : exp EQUAL exp
343 { write_exp_elt_opcode (pstate, BINOP_EQUAL); }
344 ;
345
346 exp : exp NOTEQUAL exp
347 { write_exp_elt_opcode (pstate, BINOP_NOTEQUAL); }
348 ;
349
350 exp : exp LEQ exp
351 { write_exp_elt_opcode (pstate, BINOP_LEQ); }
352 ;
353
354 exp : exp GEQ exp
355 { write_exp_elt_opcode (pstate, BINOP_GEQ); }
356 ;
357
358 exp : exp LESSTHAN exp
359 { write_exp_elt_opcode (pstate, BINOP_LESS); }
360 ;
361
362 exp : exp GREATERTHAN exp
363 { write_exp_elt_opcode (pstate, BINOP_GTR); }
364 ;
365
366 exp : exp '&' exp
367 { write_exp_elt_opcode (pstate, BINOP_BITWISE_AND); }
368 ;
369
370 exp : exp '^' exp
371 { write_exp_elt_opcode (pstate, BINOP_BITWISE_XOR); }
372 ;
373
374 exp : exp '|' exp
375 { write_exp_elt_opcode (pstate, BINOP_BITWISE_IOR); }
376 ;
377
378 exp : exp BOOL_AND exp
379 { write_exp_elt_opcode (pstate, BINOP_LOGICAL_AND); }
380 ;
381
382
383 exp : exp BOOL_OR exp
384 { write_exp_elt_opcode (pstate, BINOP_LOGICAL_OR); }
385 ;
386
387 exp : exp '=' exp
388 { write_exp_elt_opcode (pstate, BINOP_ASSIGN); }
389 ;
390
391 exp : exp ASSIGN_MODIFY exp
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); }
395 ;
396
397 exp : INT
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); }
402 ;
403
404 exp : NAME_OR_INT
405 { YYSTYPE val;
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); }
413 ;
414
415 exp : FLOAT
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); }
422 ;
423
424 exp : variable
425 ;
426
427 exp : VARIABLE
428 ;
429
430 exp : SIZEOF '(' type ')' %prec UNARY
431 { write_exp_elt_opcode (pstate, OP_LONG);
432 write_exp_elt_type (pstate,
433 parse_f_type (pstate)
434 ->builtin_integer);
435 $3 = check_typedef ($3);
436 write_exp_elt_longcst (pstate,
437 (LONGEST) TYPE_LENGTH ($3));
438 write_exp_elt_opcode (pstate, OP_LONG); }
439 ;
440
441 exp : BOOLEAN_LITERAL
442 { write_exp_elt_opcode (pstate, OP_BOOL);
443 write_exp_elt_longcst (pstate, (LONGEST) $1);
444 write_exp_elt_opcode (pstate, OP_BOOL);
445 }
446 ;
447
448 exp : STRING_LITERAL
449 {
450 write_exp_elt_opcode (pstate, OP_STRING);
451 write_exp_string (pstate, $1);
452 write_exp_elt_opcode (pstate, OP_STRING);
453 }
454 ;
455
456 variable: name_not_typename
457 { struct block_symbol sym = $1.sym;
458
459 if (sym.symbol)
460 {
461 if (symbol_read_needs_frame (sym.symbol))
462 {
463 if (innermost_block == 0
464 || contained_in (sym.block,
465 innermost_block))
466 innermost_block = sym.block;
467 }
468 write_exp_elt_opcode (pstate, OP_VAR_VALUE);
469 write_exp_elt_block (pstate, sym.block);
470 write_exp_elt_sym (pstate, sym.symbol);
471 write_exp_elt_opcode (pstate, OP_VAR_VALUE);
472 break;
473 }
474 else
475 {
476 struct bound_minimal_symbol msymbol;
477 char *arg = copy_name ($1.stoken);
478
479 msymbol =
480 lookup_bound_minimal_symbol (arg);
481 if (msymbol.minsym != NULL)
482 write_exp_msymbol (pstate, msymbol);
483 else if (!have_full_symbols () && !have_partial_symbols ())
484 error (_("No symbol table is loaded. Use the \"file\" command."));
485 else
486 error (_("No symbol \"%s\" in current context."),
487 copy_name ($1.stoken));
488 }
489 }
490 ;
491
492
493 type : ptype
494 ;
495
496 ptype : 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 =
522 create_static_range_type ((struct type *) NULL,
523 parse_f_type (pstate)
524 ->builtin_integer,
525 0, array_size - 1);
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
541 abs_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
552 direct_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
560 func_mod: '(' ')'
561 { $$ = 0; }
562 | '(' nonempty_typelist ')'
563 { free ($2); $$ = 0; }
564 ;
565
566 typebase /* Implements (approximately): (type-qualifier)* type-specifier */
567 : TYPENAME
568 { $$ = $1.type; }
569 | INT_KEYWORD
570 { $$ = parse_f_type (pstate)->builtin_integer; }
571 | INT_S2_KEYWORD
572 { $$ = parse_f_type (pstate)->builtin_integer_s2; }
573 | CHARACTER
574 { $$ = parse_f_type (pstate)->builtin_character; }
575 | LOGICAL_S8_KEYWORD
576 { $$ = parse_f_type (pstate)->builtin_logical_s8; }
577 | LOGICAL_KEYWORD
578 { $$ = parse_f_type (pstate)->builtin_logical; }
579 | LOGICAL_S2_KEYWORD
580 { $$ = parse_f_type (pstate)->builtin_logical_s2; }
581 | LOGICAL_S1_KEYWORD
582 { $$ = parse_f_type (pstate)->builtin_logical_s1; }
583 | REAL_KEYWORD
584 { $$ = parse_f_type (pstate)->builtin_real; }
585 | REAL_S8_KEYWORD
586 { $$ = parse_f_type (pstate)->builtin_real_s8; }
587 | REAL_S16_KEYWORD
588 { $$ = parse_f_type (pstate)->builtin_real_s16; }
589 | COMPLEX_S8_KEYWORD
590 { $$ = parse_f_type (pstate)->builtin_complex_s8; }
591 | COMPLEX_S16_KEYWORD
592 { $$ = parse_f_type (pstate)->builtin_complex_s16; }
593 | COMPLEX_S32_KEYWORD
594 { $$ = parse_f_type (pstate)->builtin_complex_s32; }
595 ;
596
597 nonempty_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
610 name : NAME
611 { $$ = $1.stoken; }
612 ;
613
614 name_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
632 static int
633 parse_number (struct parser_state *par_state,
634 const char *p, int len, int parsed_float, YYSTYPE *putithere)
635 {
636 LONGEST n = 0;
637 LONGEST prevn = 0;
638 int c;
639 int base = input_radix;
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
652 tmp = xstrdup (p);
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++;
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;
701 else
702 {
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;
708 else
709 return ERROR; /* Char not a digit */
710 if (i >= base)
711 return ERROR; /* Invalid digit in this base */
712 n *= base;
713 n += i;
714 }
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))
723 range_error (_("Overflow on numeric constant."));
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
730 shifting right and seeing if anything remains, and the
731 target int size is different to the target long size.
732
733 In the expression below, we could have tested
734 (n >> gdbarch_int_bit (parse_gdbarch))
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
740 if ((gdbarch_int_bit (parse_gdbarch (par_state))
741 != gdbarch_long_bit (parse_gdbarch (par_state))
742 && ((n >> 2)
743 >> (gdbarch_int_bit (parse_gdbarch (par_state))-2))) /* Avoid
744 shift warning */
745 || long_p)
746 {
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;
751 }
752 else
753 {
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;
758 }
759
760 putithere->typed_val.val = n;
761
762 /* If the high bit of the worked out type is set then this number
763 has to be unsigned. */
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
773 struct token
774 {
775 char *oper;
776 int token;
777 enum exp_opcode opcode;
778 };
779
780 static 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 },
804 { NULL, 0, BINOP_END }
805 };
806
807 struct f77_boolean_val
808 {
809 char *name;
810 int value;
811 };
812
813 static 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
822 static 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 },
830 { "logical_8", LOGICAL_S8_KEYWORD, BINOP_END },
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 },
839 { NULL, 0, BINOP_END }
840 };
841
842 /* Implementation of a dynamically expandable buffer for processing input
843 characters acquired through lexptr and building a value to return in
844 yylval. Ripped off from ch-exp.y */
845
846 static char *tempbuf; /* Current buffer contents */
847 static int tempbufsize; /* Size of allocated buffer */
848 static 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
861 /* Grow the static temp buffer if necessary, including allocating the
862 first one on demand. */
863
864 static void
865 growbuf_by_size (int count)
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
878 string-literals.
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
886 static int
887 match_string_literal (void)
888 {
889 const char *tokptr = lexptr;
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
918 static int
919 yylex (void)
920 {
921 int c;
922 int namelen;
923 unsigned int i,token;
924 const char *tokstart;
925
926 retry:
927
928 prev_lexptr = lexptr;
929
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 {
939 if (strncmp (tokstart, boolean_values[i].name,
940 strlen (boolean_values[i].name)) == 0)
941 {
942 lexptr += strlen (boolean_values[i].name);
943 yylval.lval = boolean_values[i].value;
944 return BOOLEAN_LITERAL;
945 }
946 }
947 }
948
949 /* See if it is a special .foo. operator. */
950
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)
954 {
955 lexptr += strlen (dot_ops[i].oper);
956 yylval.opcode = dot_ops[i].opcode;
957 return dot_ops[i].token;
958 }
959
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
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')
1007 goto symbol; /* Nope, must be a symbol. */
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;
1023 const char *p = tokstart;
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 }
1031 else if (c == '0' && (p[1]=='t' || p[1]=='T'
1032 || p[1]=='d' || p[1]=='D'))
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 }
1059 toktype = parse_number (pstate, tokstart, p - tokstart,
1060 got_dot|got_e|got_d,
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;
1068 error (_("Invalid number \"%s\"."), err_copy);
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
1099 if (!(c == '_' || c == '$' || c ==':'
1100 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
1101 /* We must have come across a bad character (e.g. ';'). */
1102 error (_("Invalid character '%c' in expression."), c);
1103
1104 namelen = 0;
1105 for (c = tokstart[namelen];
1106 (c == '_' || c == '$' || c == ':' || (c >= '0' && c <= '9')
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
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)
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 {
1134 write_dollar_variable (pstate, yylval.sval);
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);
1143 struct block_symbol result;
1144 struct field_of_this_result is_a_field_of_this;
1145 enum domain_enum_tag lookup_domains[] =
1146 {
1147 STRUCT_DOMAIN,
1148 VAR_DOMAIN,
1149 MODULE_DOMAIN
1150 };
1151 int i;
1152 int hextype;
1153
1154 for (i = 0; i < ARRAY_SIZE (lookup_domains); ++i)
1155 {
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
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)
1166 {
1167 yylval.tsym.type = SYMBOL_TYPE (result.symbol);
1168 return TYPENAME;
1169 }
1170
1171 if (result.symbol)
1172 break;
1173 }
1174
1175 yylval.tsym.type
1176 = language_lookup_primitive_type (parse_language (pstate),
1177 parse_gdbarch (pstate), tmp);
1178 if (yylval.tsym.type != NULL)
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. */
1184 if (!result.symbol
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. */
1189 hextype = parse_number (pstate, tokstart, namelen, 0, &newlval);
1190 if (hextype == INT)
1191 {
1192 yylval.ssym.sym = result;
1193 yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
1194 return NAME_OR_INT;
1195 }
1196 }
1197
1198 /* Any other kind of symbol */
1199 yylval.ssym.sym = result;
1200 yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
1201 return NAME;
1202 }
1203 }
1204
1205 int
1206 f_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
1220 void
1221 yyerror (char *msg)
1222 {
1223 if (prev_lexptr)
1224 lexptr = prev_lexptr;
1225
1226 error (_("A %s in expression, near `%s'."), (msg ? msg : "error"), lexptr);
1227 }
This page took 0.055423 seconds and 4 git commands to generate.