2 /* YACC parser for Fortran expressions, for GDB.
3 Copyright (C) 1986-2020 Free Software Foundation, Inc.
5 Contributed by Motorola. Adapted from the C parser by Farooq Butt
6 (fmbutt@engage.sps.mot.com).
8 This file is part of GDB.
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.
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.
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/>. */
23 /* This was blantantly ripped off the C expression parser, please
24 be aware of that as you look at its basic structure -FMB */
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.
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. */
46 #include "expression.h"
48 #include "parser-defs.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 */
57 #include "type-stack.h"
59 #define parse_type(ps) builtin_type (ps->gdbarch ())
60 #define parse_f_type(ps) builtin_f_type (ps->gdbarch ())
62 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror,
64 #define GDB_YY_REMAP_PREFIX f_
67 /* The state of the parser, used internally when we are parsing the
70 static struct parser_state *pstate = NULL;
72 /* Depth of parentheses. */
73 static int paren_depth;
75 /* The current type stack. */
76 static struct type_stack *type_stack;
80 static int yylex (void);
82 static void yyerror (const char *);
84 static void growbuf_by_size (int);
86 static int match_string_literal (void);
88 static void push_kind_type (LONGEST val, struct type *type);
90 static struct type *convert_to_kind_type (struct type *basetype, int kind);
94 /* Although the yacc "value" of an expression is not used,
95 since the result is stored in the structure being created,
96 other node types do have values. */
113 struct symtoken ssym;
115 enum exp_opcode opcode;
116 struct internalvar *ivar;
123 /* YYSTYPE gets defined by %union */
124 static int parse_number (struct parser_state *, const char *, int,
128 %type <voidval> exp type_exp start variable
129 %type <tval> type typebase
130 %type <tvec> nonempty_typelist
131 /* %type <bval> block */
133 /* Fancy type parsing. */
134 %type <voidval> func_mod direct_abs_decl abs_decl
137 %token <typed_val> INT
138 %token <typed_val_float> FLOAT
140 /* Both NAME and TYPENAME tokens represent symbols in the input,
141 and both convey their data as strings.
142 But a TYPENAME is a string that happens to be defined as a typedef
143 or builtin type name (such as int or char)
144 and a NAME is any other symbol.
145 Contexts where this distinction is not important can use the
146 nonterminal "name", which matches either NAME or TYPENAME. */
148 %token <sval> STRING_LITERAL
149 %token <lval> BOOLEAN_LITERAL
151 %token <tsym> TYPENAME
153 %type <ssym> name_not_typename
155 /* A NAME_OR_INT is a symbol which is not known in the symbol table,
156 but which would parse as a valid number in the current input radix.
157 E.g. "c" when input_radix==16. Depending on the parse, it will be
158 turned into a name or into a number. */
160 %token <ssym> NAME_OR_INT
165 /* Special type cases, put in to allow the parser to distinguish different
167 %token INT_KEYWORD INT_S2_KEYWORD LOGICAL_S1_KEYWORD LOGICAL_S2_KEYWORD
168 %token LOGICAL_S8_KEYWORD
169 %token LOGICAL_KEYWORD REAL_KEYWORD REAL_S8_KEYWORD REAL_S16_KEYWORD
170 %token COMPLEX_KEYWORD
171 %token COMPLEX_S8_KEYWORD COMPLEX_S16_KEYWORD COMPLEX_S32_KEYWORD
172 %token BOOL_AND BOOL_OR BOOL_NOT
173 %token SINGLE DOUBLE PRECISION
174 %token <lval> CHARACTER
176 %token <voidval> DOLLAR_VARIABLE
178 %token <opcode> ASSIGN_MODIFY
179 %token <opcode> UNOP_INTRINSIC BINOP_INTRINSIC
183 %right '=' ASSIGN_MODIFY
192 %left LESSTHAN GREATERTHAN LEQ GEQ
210 { write_exp_elt_opcode (pstate, OP_TYPE);
211 write_exp_elt_type (pstate, $1);
212 write_exp_elt_opcode (pstate, OP_TYPE); }
219 /* Expressions, not including the comma operator. */
220 exp : '*' exp %prec UNARY
221 { write_exp_elt_opcode (pstate, UNOP_IND); }
224 exp : '&' exp %prec UNARY
225 { write_exp_elt_opcode (pstate, UNOP_ADDR); }
228 exp : '-' exp %prec UNARY
229 { write_exp_elt_opcode (pstate, UNOP_NEG); }
232 exp : BOOL_NOT exp %prec UNARY
233 { write_exp_elt_opcode (pstate, UNOP_LOGICAL_NOT); }
236 exp : '~' exp %prec UNARY
237 { write_exp_elt_opcode (pstate, UNOP_COMPLEMENT); }
240 exp : SIZEOF exp %prec UNARY
241 { write_exp_elt_opcode (pstate, UNOP_SIZEOF); }
244 exp : KIND '(' exp ')' %prec UNARY
245 { write_exp_elt_opcode (pstate, UNOP_FORTRAN_KIND); }
248 /* No more explicit array operators, we treat everything in F77 as
249 a function call. The disambiguation as to whether we are
250 doing a subscript operation or a function call is done
254 { pstate->start_arglist (); }
256 { write_exp_elt_opcode (pstate,
257 OP_F77_UNDETERMINED_ARGLIST);
258 write_exp_elt_longcst (pstate,
259 pstate->end_arglist ());
260 write_exp_elt_opcode (pstate,
261 OP_F77_UNDETERMINED_ARGLIST); }
264 exp : UNOP_INTRINSIC '(' exp ')'
265 { write_exp_elt_opcode (pstate, $1); }
268 exp : BINOP_INTRINSIC '(' exp ',' exp ')'
269 { write_exp_elt_opcode (pstate, $1); }
276 { pstate->arglist_len = 1; }
280 { pstate->arglist_len = 1; }
283 arglist : arglist ',' exp %prec ABOVE_COMMA
284 { pstate->arglist_len++; }
287 /* There are four sorts of subrange types in F90. */
289 subrange: exp ':' exp %prec ABOVE_COMMA
290 { write_exp_elt_opcode (pstate, OP_RANGE);
291 write_exp_elt_longcst (pstate, NONE_BOUND_DEFAULT);
292 write_exp_elt_opcode (pstate, OP_RANGE); }
295 subrange: exp ':' %prec ABOVE_COMMA
296 { write_exp_elt_opcode (pstate, OP_RANGE);
297 write_exp_elt_longcst (pstate, HIGH_BOUND_DEFAULT);
298 write_exp_elt_opcode (pstate, OP_RANGE); }
301 subrange: ':' exp %prec ABOVE_COMMA
302 { write_exp_elt_opcode (pstate, OP_RANGE);
303 write_exp_elt_longcst (pstate, LOW_BOUND_DEFAULT);
304 write_exp_elt_opcode (pstate, OP_RANGE); }
307 subrange: ':' %prec ABOVE_COMMA
308 { write_exp_elt_opcode (pstate, OP_RANGE);
309 write_exp_elt_longcst (pstate, BOTH_BOUND_DEFAULT);
310 write_exp_elt_opcode (pstate, OP_RANGE); }
313 complexnum: exp ',' exp
317 exp : '(' complexnum ')'
318 { write_exp_elt_opcode (pstate, OP_COMPLEX);
319 write_exp_elt_type (pstate,
320 parse_f_type (pstate)
321 ->builtin_complex_s16);
322 write_exp_elt_opcode (pstate, OP_COMPLEX); }
325 exp : '(' type ')' exp %prec UNARY
326 { write_exp_elt_opcode (pstate, UNOP_CAST);
327 write_exp_elt_type (pstate, $2);
328 write_exp_elt_opcode (pstate, UNOP_CAST); }
332 { write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
333 write_exp_string (pstate, $3);
334 write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); }
337 /* Binary operators in order of decreasing precedence. */
340 { write_exp_elt_opcode (pstate, BINOP_REPEAT); }
343 exp : exp STARSTAR exp
344 { write_exp_elt_opcode (pstate, BINOP_EXP); }
348 { write_exp_elt_opcode (pstate, BINOP_MUL); }
352 { write_exp_elt_opcode (pstate, BINOP_DIV); }
356 { write_exp_elt_opcode (pstate, BINOP_ADD); }
360 { write_exp_elt_opcode (pstate, BINOP_SUB); }
364 { write_exp_elt_opcode (pstate, BINOP_LSH); }
368 { write_exp_elt_opcode (pstate, BINOP_RSH); }
372 { write_exp_elt_opcode (pstate, BINOP_EQUAL); }
375 exp : exp NOTEQUAL exp
376 { write_exp_elt_opcode (pstate, BINOP_NOTEQUAL); }
380 { write_exp_elt_opcode (pstate, BINOP_LEQ); }
384 { write_exp_elt_opcode (pstate, BINOP_GEQ); }
387 exp : exp LESSTHAN exp
388 { write_exp_elt_opcode (pstate, BINOP_LESS); }
391 exp : exp GREATERTHAN exp
392 { write_exp_elt_opcode (pstate, BINOP_GTR); }
396 { write_exp_elt_opcode (pstate, BINOP_BITWISE_AND); }
400 { write_exp_elt_opcode (pstate, BINOP_BITWISE_XOR); }
404 { write_exp_elt_opcode (pstate, BINOP_BITWISE_IOR); }
407 exp : exp BOOL_AND exp
408 { write_exp_elt_opcode (pstate, BINOP_LOGICAL_AND); }
412 exp : exp BOOL_OR exp
413 { write_exp_elt_opcode (pstate, BINOP_LOGICAL_OR); }
417 { write_exp_elt_opcode (pstate, BINOP_ASSIGN); }
420 exp : exp ASSIGN_MODIFY exp
421 { write_exp_elt_opcode (pstate, BINOP_ASSIGN_MODIFY);
422 write_exp_elt_opcode (pstate, $2);
423 write_exp_elt_opcode (pstate, BINOP_ASSIGN_MODIFY); }
427 { write_exp_elt_opcode (pstate, OP_LONG);
428 write_exp_elt_type (pstate, $1.type);
429 write_exp_elt_longcst (pstate, (LONGEST) ($1.val));
430 write_exp_elt_opcode (pstate, OP_LONG); }
435 parse_number (pstate, $1.stoken.ptr,
436 $1.stoken.length, 0, &val);
437 write_exp_elt_opcode (pstate, OP_LONG);
438 write_exp_elt_type (pstate, val.typed_val.type);
439 write_exp_elt_longcst (pstate,
440 (LONGEST)val.typed_val.val);
441 write_exp_elt_opcode (pstate, OP_LONG); }
445 { write_exp_elt_opcode (pstate, OP_FLOAT);
446 write_exp_elt_type (pstate, $1.type);
447 write_exp_elt_floatcst (pstate, $1.val);
448 write_exp_elt_opcode (pstate, OP_FLOAT); }
454 exp : DOLLAR_VARIABLE
457 exp : SIZEOF '(' type ')' %prec UNARY
458 { write_exp_elt_opcode (pstate, OP_LONG);
459 write_exp_elt_type (pstate,
460 parse_f_type (pstate)
462 $3 = check_typedef ($3);
463 write_exp_elt_longcst (pstate,
464 (LONGEST) TYPE_LENGTH ($3));
465 write_exp_elt_opcode (pstate, OP_LONG); }
468 exp : BOOLEAN_LITERAL
469 { write_exp_elt_opcode (pstate, OP_BOOL);
470 write_exp_elt_longcst (pstate, (LONGEST) $1);
471 write_exp_elt_opcode (pstate, OP_BOOL);
477 write_exp_elt_opcode (pstate, OP_STRING);
478 write_exp_string (pstate, $1);
479 write_exp_elt_opcode (pstate, OP_STRING);
483 variable: name_not_typename
484 { struct block_symbol sym = $1.sym;
488 if (symbol_read_needs_frame (sym.symbol))
489 pstate->block_tracker->update (sym);
490 write_exp_elt_opcode (pstate, OP_VAR_VALUE);
491 write_exp_elt_block (pstate, sym.block);
492 write_exp_elt_sym (pstate, sym.symbol);
493 write_exp_elt_opcode (pstate, OP_VAR_VALUE);
498 struct bound_minimal_symbol msymbol;
499 std::string arg = copy_name ($1.stoken);
502 lookup_bound_minimal_symbol (arg.c_str ());
503 if (msymbol.minsym != NULL)
504 write_exp_msymbol (pstate, msymbol);
505 else if (!have_full_symbols () && !have_partial_symbols ())
506 error (_("No symbol table is loaded. Use the \"file\" command."));
508 error (_("No symbol \"%s\" in current context."),
521 /* This is where the interesting stuff happens. */
524 struct type *follow_type = $1;
525 struct type *range_type;
528 switch (type_stack->pop ())
534 follow_type = lookup_pointer_type (follow_type);
537 follow_type = lookup_lvalue_reference_type (follow_type);
540 array_size = type_stack->pop_int ();
541 if (array_size != -1)
544 create_static_range_type ((struct type *) NULL,
545 parse_f_type (pstate)
549 create_array_type ((struct type *) NULL,
550 follow_type, range_type);
553 follow_type = lookup_pointer_type (follow_type);
556 follow_type = lookup_function_type (follow_type);
560 int kind_val = type_stack->pop_int ();
562 = convert_to_kind_type (follow_type, kind_val);
571 { type_stack->push (tp_pointer); $$ = 0; }
573 { type_stack->push (tp_pointer); $$ = $2; }
575 { type_stack->push (tp_reference); $$ = 0; }
577 { type_stack->push (tp_reference); $$ = $2; }
581 direct_abs_decl: '(' abs_decl ')'
583 | '(' KIND '=' INT ')'
584 { push_kind_type ($4.val, $4.type); }
586 { push_kind_type ($2.val, $2.type); }
587 | direct_abs_decl func_mod
588 { type_stack->push (tp_function); }
590 { type_stack->push (tp_function); }
595 | '(' nonempty_typelist ')'
596 { free ($2); $$ = 0; }
599 typebase /* Implements (approximately): (type-qualifier)* type-specifier */
603 { $$ = parse_f_type (pstate)->builtin_integer; }
605 { $$ = parse_f_type (pstate)->builtin_integer_s2; }
607 { $$ = parse_f_type (pstate)->builtin_character; }
609 { $$ = parse_f_type (pstate)->builtin_logical_s8; }
611 { $$ = parse_f_type (pstate)->builtin_logical; }
613 { $$ = parse_f_type (pstate)->builtin_logical_s2; }
615 { $$ = parse_f_type (pstate)->builtin_logical_s1; }
617 { $$ = parse_f_type (pstate)->builtin_real; }
619 { $$ = parse_f_type (pstate)->builtin_real_s8; }
621 { $$ = parse_f_type (pstate)->builtin_real_s16; }
623 { $$ = parse_f_type (pstate)->builtin_complex_s8; }
625 { $$ = parse_f_type (pstate)->builtin_complex_s8; }
626 | COMPLEX_S16_KEYWORD
627 { $$ = parse_f_type (pstate)->builtin_complex_s16; }
628 | COMPLEX_S32_KEYWORD
629 { $$ = parse_f_type (pstate)->builtin_complex_s32; }
631 { $$ = parse_f_type (pstate)->builtin_real;}
633 { $$ = parse_f_type (pstate)->builtin_real_s8;}
634 | SINGLE COMPLEX_KEYWORD
635 { $$ = parse_f_type (pstate)->builtin_complex_s8;}
636 | DOUBLE COMPLEX_KEYWORD
637 { $$ = parse_f_type (pstate)->builtin_complex_s16;}
642 { $$ = (struct type **) malloc (sizeof (struct type *) * 2);
643 $<ivec>$[0] = 1; /* Number of types in vector */
646 | nonempty_typelist ',' type
647 { int len = sizeof (struct type *) * (++($<ivec>1[0]) + 1);
648 $$ = (struct type **) realloc ((char *) $1, len);
649 $$[$<ivec>$[0]] = $3;
657 name_not_typename : NAME
658 /* These would be useful if name_not_typename was useful, but it is just
659 a fake for "variable", so these cause reduce/reduce conflicts because
660 the parser can't tell whether NAME_OR_INT is a name_not_typename (=variable,
661 =exp) or just an exp. If name_not_typename was ever used in an lvalue
662 context where only a name could occur, this might be useful.
669 /* Take care of parsing a number (anything that starts with a digit).
670 Set yylval and return the token type; update lexptr.
671 LEN is the number of characters in it. */
673 /*** Needs some error checking for the float case ***/
676 parse_number (struct parser_state *par_state,
677 const char *p, int len, int parsed_float, YYSTYPE *putithere)
682 int base = input_radix;
686 struct type *signed_type;
687 struct type *unsigned_type;
691 /* It's a float since it contains a point or an exponent. */
692 /* [dD] is not understood as an exponent by parse_float,
697 for (tmp2 = tmp; *tmp2; ++tmp2)
698 if (*tmp2 == 'd' || *tmp2 == 'D')
701 /* FIXME: Should this use different types? */
702 putithere->typed_val_float.type = parse_f_type (pstate)->builtin_real_s8;
703 bool parsed = parse_float (tmp, len,
704 putithere->typed_val_float.type,
705 putithere->typed_val_float.val);
707 return parsed? FLOAT : ERROR;
710 /* Handle base-switching prefixes 0x, 0t, 0d, 0 */
746 if (len == 0 && c == 'l')
748 else if (len == 0 && c == 'u')
753 if (c >= '0' && c <= '9')
755 else if (c >= 'a' && c <= 'f')
758 return ERROR; /* Char not a digit */
760 return ERROR; /* Invalid digit in this base */
764 /* Portably test for overflow (only works for nonzero values, so make
765 a second check for zero). */
766 if ((prevn >= n) && n != 0)
767 unsigned_p=1; /* Try something unsigned */
768 /* If range checking enabled, portably test for unsigned overflow. */
769 if (RANGE_CHECK && n != 0)
771 if ((unsigned_p && (unsigned)prevn >= (unsigned)n))
772 range_error (_("Overflow on numeric constant."));
777 /* If the number is too big to be an int, or it's got an l suffix
778 then it's a long. Work out if this has to be a long by
779 shifting right and seeing if anything remains, and the
780 target int size is different to the target long size.
782 In the expression below, we could have tested
783 (n >> gdbarch_int_bit (parse_gdbarch))
784 to see if it was zero,
785 but too many compilers warn about that, when ints and longs
786 are the same size. So we shift it twice, with fewer bits
787 each time, for the same result. */
789 if ((gdbarch_int_bit (par_state->gdbarch ())
790 != gdbarch_long_bit (par_state->gdbarch ())
792 >> (gdbarch_int_bit (par_state->gdbarch ())-2))) /* Avoid
796 high_bit = ((ULONGEST)1)
797 << (gdbarch_long_bit (par_state->gdbarch ())-1);
798 unsigned_type = parse_type (par_state)->builtin_unsigned_long;
799 signed_type = parse_type (par_state)->builtin_long;
804 ((ULONGEST)1) << (gdbarch_int_bit (par_state->gdbarch ()) - 1);
805 unsigned_type = parse_type (par_state)->builtin_unsigned_int;
806 signed_type = parse_type (par_state)->builtin_int;
809 putithere->typed_val.val = n;
811 /* If the high bit of the worked out type is set then this number
812 has to be unsigned. */
814 if (unsigned_p || (n & high_bit))
815 putithere->typed_val.type = unsigned_type;
817 putithere->typed_val.type = signed_type;
822 /* Called to setup the type stack when we encounter a '(kind=N)' type
823 modifier, performs some bounds checking on 'N' and then pushes this to
824 the type stack followed by the 'tp_kind' marker. */
826 push_kind_type (LONGEST val, struct type *type)
830 if (TYPE_UNSIGNED (type))
832 ULONGEST uval = static_cast <ULONGEST> (val);
834 error (_("kind value out of range"));
835 ival = static_cast <int> (uval);
839 if (val > INT_MAX || val < 0)
840 error (_("kind value out of range"));
841 ival = static_cast <int> (val);
844 type_stack->push (ival);
845 type_stack->push (tp_kind);
848 /* Called when a type has a '(kind=N)' modifier after it, for example
849 'character(kind=1)'. The BASETYPE is the type described by 'character'
850 in our example, and KIND is the integer '1'. This function returns a
851 new type that represents the basetype of a specific kind. */
853 convert_to_kind_type (struct type *basetype, int kind)
855 if (basetype == parse_f_type (pstate)->builtin_character)
857 /* Character of kind 1 is a special case, this is the same as the
858 base character type. */
860 return parse_f_type (pstate)->builtin_character;
862 else if (basetype == parse_f_type (pstate)->builtin_complex_s8)
865 return parse_f_type (pstate)->builtin_complex_s8;
867 return parse_f_type (pstate)->builtin_complex_s16;
869 return parse_f_type (pstate)->builtin_complex_s32;
871 else if (basetype == parse_f_type (pstate)->builtin_real)
874 return parse_f_type (pstate)->builtin_real;
876 return parse_f_type (pstate)->builtin_real_s8;
878 return parse_f_type (pstate)->builtin_real_s16;
880 else if (basetype == parse_f_type (pstate)->builtin_logical)
883 return parse_f_type (pstate)->builtin_logical_s1;
885 return parse_f_type (pstate)->builtin_logical_s2;
887 return parse_f_type (pstate)->builtin_logical;
889 return parse_f_type (pstate)->builtin_logical_s8;
891 else if (basetype == parse_f_type (pstate)->builtin_integer)
894 return parse_f_type (pstate)->builtin_integer_s2;
896 return parse_f_type (pstate)->builtin_integer;
898 return parse_f_type (pstate)->builtin_integer_s8;
901 error (_("unsupported kind %d for type %s"),
902 kind, TYPE_SAFE_NAME (basetype));
904 /* Should never get here. */
910 /* The string to match against. */
913 /* The lexer token to return. */
916 /* The expression opcode to embed within the token. */
917 enum exp_opcode opcode;
919 /* When this is true the string in OPER is matched exactly including
920 case, when this is false OPER is matched case insensitively. */
924 static const struct token dot_ops[] =
926 { ".and.", BOOL_AND, BINOP_END, false },
927 { ".or.", BOOL_OR, BINOP_END, false },
928 { ".not.", BOOL_NOT, BINOP_END, false },
929 { ".eq.", EQUAL, BINOP_END, false },
930 { ".eqv.", EQUAL, BINOP_END, false },
931 { ".neqv.", NOTEQUAL, BINOP_END, false },
932 { ".ne.", NOTEQUAL, BINOP_END, false },
933 { ".le.", LEQ, BINOP_END, false },
934 { ".ge.", GEQ, BINOP_END, false },
935 { ".gt.", GREATERTHAN, BINOP_END, false },
936 { ".lt.", LESSTHAN, BINOP_END, false },
939 /* Holds the Fortran representation of a boolean, and the integer value we
940 substitute in when one of the matching strings is parsed. */
941 struct f77_boolean_val
943 /* The string representing a Fortran boolean. */
946 /* The integer value to replace it with. */
950 /* The set of Fortran booleans. These are matched case insensitively. */
951 static const struct f77_boolean_val boolean_values[] =
957 static const struct token f77_keywords[] =
959 /* Historically these have always been lowercase only in GDB. */
960 { "complex_16", COMPLEX_S16_KEYWORD, BINOP_END, true },
961 { "complex_32", COMPLEX_S32_KEYWORD, BINOP_END, true },
962 { "character", CHARACTER, BINOP_END, true },
963 { "integer_2", INT_S2_KEYWORD, BINOP_END, true },
964 { "logical_1", LOGICAL_S1_KEYWORD, BINOP_END, true },
965 { "logical_2", LOGICAL_S2_KEYWORD, BINOP_END, true },
966 { "logical_8", LOGICAL_S8_KEYWORD, BINOP_END, true },
967 { "complex_8", COMPLEX_S8_KEYWORD, BINOP_END, true },
968 { "integer", INT_KEYWORD, BINOP_END, true },
969 { "logical", LOGICAL_KEYWORD, BINOP_END, true },
970 { "real_16", REAL_S16_KEYWORD, BINOP_END, true },
971 { "complex", COMPLEX_KEYWORD, BINOP_END, true },
972 { "sizeof", SIZEOF, BINOP_END, true },
973 { "real_8", REAL_S8_KEYWORD, BINOP_END, true },
974 { "real", REAL_KEYWORD, BINOP_END, true },
975 { "single", SINGLE, BINOP_END, true },
976 { "double", DOUBLE, BINOP_END, true },
977 { "precision", PRECISION, BINOP_END, true },
978 /* The following correspond to actual functions in Fortran and are case
980 { "kind", KIND, BINOP_END, false },
981 { "abs", UNOP_INTRINSIC, UNOP_ABS, false },
982 { "mod", BINOP_INTRINSIC, BINOP_MOD, false },
983 { "floor", UNOP_INTRINSIC, UNOP_FORTRAN_FLOOR, false },
984 { "ceiling", UNOP_INTRINSIC, UNOP_FORTRAN_CEILING, false },
985 { "modulo", BINOP_INTRINSIC, BINOP_FORTRAN_MODULO, false },
986 { "cmplx", BINOP_INTRINSIC, BINOP_FORTRAN_CMPLX, false },
989 /* Implementation of a dynamically expandable buffer for processing input
990 characters acquired through lexptr and building a value to return in
991 yylval. Ripped off from ch-exp.y */
993 static char *tempbuf; /* Current buffer contents */
994 static int tempbufsize; /* Size of allocated buffer */
995 static int tempbufindex; /* Current index into buffer */
997 #define GROWBY_MIN_SIZE 64 /* Minimum amount to grow buffer by */
999 #define CHECKBUF(size) \
1001 if (tempbufindex + (size) >= tempbufsize) \
1003 growbuf_by_size (size); \
1008 /* Grow the static temp buffer if necessary, including allocating the
1009 first one on demand. */
1012 growbuf_by_size (int count)
1016 growby = std::max (count, GROWBY_MIN_SIZE);
1017 tempbufsize += growby;
1018 if (tempbuf == NULL)
1019 tempbuf = (char *) malloc (tempbufsize);
1021 tempbuf = (char *) realloc (tempbuf, tempbufsize);
1024 /* Blatantly ripped off from ch-exp.y. This routine recognizes F77
1027 Recognize a string literal. A string literal is a nonzero sequence
1028 of characters enclosed in matching single quotes, except that
1029 a single character inside single quotes is a character literal, which
1030 we reject as a string literal. To embed the terminator character inside
1031 a string, it is simply doubled (I.E. 'this''is''one''string') */
1034 match_string_literal (void)
1036 const char *tokptr = pstate->lexptr;
1038 for (tempbufindex = 0, tokptr++; *tokptr != '\0'; tokptr++)
1041 if (*tokptr == *pstate->lexptr)
1043 if (*(tokptr + 1) == *pstate->lexptr)
1048 tempbuf[tempbufindex++] = *tokptr;
1050 if (*tokptr == '\0' /* no terminator */
1051 || tempbufindex == 0) /* no string */
1055 tempbuf[tempbufindex] = '\0';
1056 yylval.sval.ptr = tempbuf;
1057 yylval.sval.length = tempbufindex;
1058 pstate->lexptr = ++tokptr;
1059 return STRING_LITERAL;
1063 /* Read one token, getting characters through lexptr. */
1071 const char *tokstart;
1075 pstate->prev_lexptr = pstate->lexptr;
1077 tokstart = pstate->lexptr;
1079 /* First of all, let us make sure we are not dealing with the
1080 special tokens .true. and .false. which evaluate to 1 and 0. */
1082 if (*pstate->lexptr == '.')
1084 for (int i = 0; i < ARRAY_SIZE (boolean_values); i++)
1086 if (strncasecmp (tokstart, boolean_values[i].name,
1087 strlen (boolean_values[i].name)) == 0)
1089 pstate->lexptr += strlen (boolean_values[i].name);
1090 yylval.lval = boolean_values[i].value;
1091 return BOOLEAN_LITERAL;
1096 /* See if it is a special .foo. operator. */
1097 for (int i = 0; i < ARRAY_SIZE (dot_ops); i++)
1098 if (strncasecmp (tokstart, dot_ops[i].oper,
1099 strlen (dot_ops[i].oper)) == 0)
1101 gdb_assert (!dot_ops[i].case_sensitive);
1102 pstate->lexptr += strlen (dot_ops[i].oper);
1103 yylval.opcode = dot_ops[i].opcode;
1104 return dot_ops[i].token;
1107 /* See if it is an exponentiation operator. */
1109 if (strncmp (tokstart, "**", 2) == 0)
1111 pstate->lexptr += 2;
1112 yylval.opcode = BINOP_EXP;
1116 switch (c = *tokstart)
1128 token = match_string_literal ();
1139 if (paren_depth == 0)
1146 if (pstate->comma_terminates && paren_depth == 0)
1152 /* Might be a floating point number. */
1153 if (pstate->lexptr[1] < '0' || pstate->lexptr[1] > '9')
1154 goto symbol; /* Nope, must be a symbol. */
1168 /* It's a number. */
1169 int got_dot = 0, got_e = 0, got_d = 0, toktype;
1170 const char *p = tokstart;
1171 int hex = input_radix > 10;
1173 if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
1178 else if (c == '0' && (p[1]=='t' || p[1]=='T'
1179 || p[1]=='d' || p[1]=='D'))
1187 if (!hex && !got_e && (*p == 'e' || *p == 'E'))
1188 got_dot = got_e = 1;
1189 else if (!hex && !got_d && (*p == 'd' || *p == 'D'))
1190 got_dot = got_d = 1;
1191 else if (!hex && !got_dot && *p == '.')
1193 else if (((got_e && (p[-1] == 'e' || p[-1] == 'E'))
1194 || (got_d && (p[-1] == 'd' || p[-1] == 'D')))
1195 && (*p == '-' || *p == '+'))
1196 /* This is the sign of the exponent, not the end of the
1199 /* We will take any letters or digits. parse_number will
1200 complain if past the radix, or if L or U are not final. */
1201 else if ((*p < '0' || *p > '9')
1202 && ((*p < 'a' || *p > 'z')
1203 && (*p < 'A' || *p > 'Z')))
1206 toktype = parse_number (pstate, tokstart, p - tokstart,
1207 got_dot|got_e|got_d,
1209 if (toktype == ERROR)
1211 char *err_copy = (char *) alloca (p - tokstart + 1);
1213 memcpy (err_copy, tokstart, p - tokstart);
1214 err_copy[p - tokstart] = 0;
1215 error (_("Invalid number \"%s\"."), err_copy);
1246 if (!(c == '_' || c == '$' || c ==':'
1247 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
1248 /* We must have come across a bad character (e.g. ';'). */
1249 error (_("Invalid character '%c' in expression."), c);
1252 for (c = tokstart[namelen];
1253 (c == '_' || c == '$' || c == ':' || (c >= '0' && c <= '9')
1254 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
1255 c = tokstart[++namelen]);
1257 /* The token "if" terminates the expression and is NOT
1258 removed from the input stream. */
1260 if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f')
1263 pstate->lexptr += namelen;
1265 /* Catch specific keywords. */
1267 for (int i = 0; i < ARRAY_SIZE (f77_keywords); i++)
1268 if (strlen (f77_keywords[i].oper) == namelen
1269 && ((!f77_keywords[i].case_sensitive
1270 && strncasecmp (tokstart, f77_keywords[i].oper, namelen) == 0)
1271 || (f77_keywords[i].case_sensitive
1272 && strncmp (tokstart, f77_keywords[i].oper, namelen) == 0)))
1274 yylval.opcode = f77_keywords[i].opcode;
1275 return f77_keywords[i].token;
1278 yylval.sval.ptr = tokstart;
1279 yylval.sval.length = namelen;
1281 if (*tokstart == '$')
1283 write_dollar_variable (pstate, yylval.sval);
1284 return DOLLAR_VARIABLE;
1287 /* Use token-type TYPENAME for symbols that happen to be defined
1288 currently as names of types; NAME for other symbols.
1289 The caller is not constrained to care about the distinction. */
1291 std::string tmp = copy_name (yylval.sval);
1292 struct block_symbol result;
1293 enum domain_enum_tag lookup_domains[] =
1301 for (int i = 0; i < ARRAY_SIZE (lookup_domains); ++i)
1303 result = lookup_symbol (tmp.c_str (), pstate->expression_context_block,
1304 lookup_domains[i], NULL);
1305 if (result.symbol && SYMBOL_CLASS (result.symbol) == LOC_TYPEDEF)
1307 yylval.tsym.type = SYMBOL_TYPE (result.symbol);
1316 = language_lookup_primitive_type (pstate->language (),
1317 pstate->gdbarch (), tmp.c_str ());
1318 if (yylval.tsym.type != NULL)
1321 /* Input names that aren't symbols but ARE valid hex numbers,
1322 when the input radix permits them, can be names or numbers
1323 depending on the parse. Note we support radixes > 16 here. */
1325 && ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10)
1326 || (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
1328 YYSTYPE newlval; /* Its value is ignored. */
1329 hextype = parse_number (pstate, tokstart, namelen, 0, &newlval);
1332 yylval.ssym.sym = result;
1333 yylval.ssym.is_a_field_of_this = false;
1338 /* Any other kind of symbol */
1339 yylval.ssym.sym = result;
1340 yylval.ssym.is_a_field_of_this = false;
1346 f_parse (struct parser_state *par_state)
1348 /* Setting up the parser state. */
1349 scoped_restore pstate_restore = make_scoped_restore (&pstate);
1350 scoped_restore restore_yydebug = make_scoped_restore (&yydebug,
1352 gdb_assert (par_state != NULL);
1356 struct type_stack stack;
1357 scoped_restore restore_type_stack = make_scoped_restore (&type_stack,
1364 yyerror (const char *msg)
1366 if (pstate->prev_lexptr)
1367 pstate->lexptr = pstate->prev_lexptr;
1369 error (_("A %s in expression, near `%s'."), msg, pstate->lexptr);