2 /* YACC parser for Fortran expressions, for GDB.
3 Copyright (C) 1986-2016 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 #define parse_type(ps) builtin_type (parse_gdbarch (ps))
58 #define parse_f_type(ps) builtin_f_type (parse_gdbarch (ps))
60 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror,
62 #define GDB_YY_REMAP_PREFIX f_
65 /* The state of the parser, used internally when we are parsing the
68 static struct parser_state *pstate = NULL;
72 static int yylex (void);
74 void yyerror (char *);
76 static void growbuf_by_size (int);
78 static int match_string_literal (void);
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. */
101 enum exp_opcode opcode;
102 struct internalvar *ivar;
109 /* YYSTYPE gets defined by %union */
110 static int parse_number (struct parser_state *, const char *, int,
114 %type <voidval> exp type_exp start variable
115 %type <tval> type typebase
116 %type <tvec> nonempty_typelist
117 /* %type <bval> block */
119 /* Fancy type parsing. */
120 %type <voidval> func_mod direct_abs_decl abs_decl
123 %token <typed_val> INT
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. */
134 %token <sval> STRING_LITERAL
135 %token <lval> BOOLEAN_LITERAL
137 %token <tsym> TYPENAME
139 %type <ssym> name_not_typename
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. */
146 %token <ssym> NAME_OR_INT
151 /* Special type cases, put in to allow the parser to distinguish different
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
160 %token <voidval> VARIABLE
162 %token <opcode> ASSIGN_MODIFY
166 %right '=' ASSIGN_MODIFY
175 %left LESSTHAN GREATERTHAN LEQ GEQ
193 { write_exp_elt_opcode (pstate, OP_TYPE);
194 write_exp_elt_type (pstate, $1);
195 write_exp_elt_opcode (pstate, OP_TYPE); }
202 /* Expressions, not including the comma operator. */
203 exp : '*' exp %prec UNARY
204 { write_exp_elt_opcode (pstate, UNOP_IND); }
207 exp : '&' exp %prec UNARY
208 { write_exp_elt_opcode (pstate, UNOP_ADDR); }
211 exp : '-' exp %prec UNARY
212 { write_exp_elt_opcode (pstate, UNOP_NEG); }
215 exp : BOOL_NOT exp %prec UNARY
216 { write_exp_elt_opcode (pstate, UNOP_LOGICAL_NOT); }
219 exp : '~' exp %prec UNARY
220 { write_exp_elt_opcode (pstate, UNOP_COMPLEMENT); }
223 exp : SIZEOF exp %prec UNARY
224 { write_exp_elt_opcode (pstate, UNOP_SIZEOF); }
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
233 { start_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); }
254 arglist : arglist ',' exp %prec ABOVE_COMMA
258 /* There are four sorts of subrange types in F90. */
260 subrange: exp ':' exp %prec ABOVE_COMMA
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); }
266 subrange: exp ':' %prec ABOVE_COMMA
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); }
272 subrange: ':' exp %prec ABOVE_COMMA
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); }
278 subrange: ':' %prec ABOVE_COMMA
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); }
284 complexnum: exp ',' exp
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); }
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); }
303 { write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
304 write_exp_string (pstate, $3);
305 write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); }
308 /* Binary operators in order of decreasing precedence. */
311 { write_exp_elt_opcode (pstate, BINOP_REPEAT); }
314 exp : exp STARSTAR exp
315 { write_exp_elt_opcode (pstate, BINOP_EXP); }
319 { write_exp_elt_opcode (pstate, BINOP_MUL); }
323 { write_exp_elt_opcode (pstate, BINOP_DIV); }
327 { write_exp_elt_opcode (pstate, BINOP_ADD); }
331 { write_exp_elt_opcode (pstate, BINOP_SUB); }
335 { write_exp_elt_opcode (pstate, BINOP_LSH); }
339 { write_exp_elt_opcode (pstate, BINOP_RSH); }
343 { write_exp_elt_opcode (pstate, BINOP_EQUAL); }
346 exp : exp NOTEQUAL exp
347 { write_exp_elt_opcode (pstate, BINOP_NOTEQUAL); }
351 { write_exp_elt_opcode (pstate, BINOP_LEQ); }
355 { write_exp_elt_opcode (pstate, BINOP_GEQ); }
358 exp : exp LESSTHAN exp
359 { write_exp_elt_opcode (pstate, BINOP_LESS); }
362 exp : exp GREATERTHAN exp
363 { write_exp_elt_opcode (pstate, BINOP_GTR); }
367 { write_exp_elt_opcode (pstate, BINOP_BITWISE_AND); }
371 { write_exp_elt_opcode (pstate, BINOP_BITWISE_XOR); }
375 { write_exp_elt_opcode (pstate, BINOP_BITWISE_IOR); }
378 exp : exp BOOL_AND exp
379 { write_exp_elt_opcode (pstate, BINOP_LOGICAL_AND); }
383 exp : exp BOOL_OR exp
384 { write_exp_elt_opcode (pstate, BINOP_LOGICAL_OR); }
388 { write_exp_elt_opcode (pstate, BINOP_ASSIGN); }
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); }
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); }
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); }
416 { write_exp_elt_opcode (pstate, OP_DOUBLE);
417 write_exp_elt_type (pstate,
418 parse_f_type (pstate)
420 write_exp_elt_dblcst (pstate, $1);
421 write_exp_elt_opcode (pstate, OP_DOUBLE); }
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)
435 $3 = check_typedef ($3);
436 write_exp_elt_longcst (pstate,
437 (LONGEST) TYPE_LENGTH ($3));
438 write_exp_elt_opcode (pstate, OP_LONG); }
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);
450 write_exp_elt_opcode (pstate, OP_STRING);
451 write_exp_string (pstate, $1);
452 write_exp_elt_opcode (pstate, OP_STRING);
456 variable: name_not_typename
457 { struct block_symbol sym = $1.sym;
461 if (symbol_read_needs_frame (sym.symbol))
463 if (innermost_block == 0
464 || contained_in (sym.block,
466 innermost_block = sym.block;
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);
476 struct bound_minimal_symbol msymbol;
477 char *arg = copy_name ($1.stoken);
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."));
486 error (_("No symbol \"%s\" in current context."),
487 copy_name ($1.stoken));
499 /* This is where the interesting stuff happens. */
502 struct type *follow_type = $1;
503 struct type *range_type;
512 follow_type = lookup_pointer_type (follow_type);
515 follow_type = lookup_reference_type (follow_type);
518 array_size = pop_type_int ();
519 if (array_size != -1)
522 create_static_range_type ((struct type *) NULL,
523 parse_f_type (pstate)
527 create_array_type ((struct type *) NULL,
528 follow_type, range_type);
531 follow_type = lookup_pointer_type (follow_type);
534 follow_type = lookup_function_type (follow_type);
542 { push_type (tp_pointer); $$ = 0; }
544 { push_type (tp_pointer); $$ = $2; }
546 { push_type (tp_reference); $$ = 0; }
548 { push_type (tp_reference); $$ = $2; }
552 direct_abs_decl: '(' abs_decl ')'
554 | direct_abs_decl func_mod
555 { push_type (tp_function); }
557 { push_type (tp_function); }
562 | '(' nonempty_typelist ')'
563 { free ($2); $$ = 0; }
566 typebase /* Implements (approximately): (type-qualifier)* type-specifier */
570 { $$ = parse_f_type (pstate)->builtin_integer; }
572 { $$ = parse_f_type (pstate)->builtin_integer_s2; }
574 { $$ = parse_f_type (pstate)->builtin_character; }
576 { $$ = parse_f_type (pstate)->builtin_logical_s8; }
578 { $$ = parse_f_type (pstate)->builtin_logical; }
580 { $$ = parse_f_type (pstate)->builtin_logical_s2; }
582 { $$ = parse_f_type (pstate)->builtin_logical_s1; }
584 { $$ = parse_f_type (pstate)->builtin_real; }
586 { $$ = parse_f_type (pstate)->builtin_real_s8; }
588 { $$ = parse_f_type (pstate)->builtin_real_s16; }
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; }
599 { $$ = (struct type **) malloc (sizeof (struct type *) * 2);
600 $<ivec>$[0] = 1; /* Number of types in vector */
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;
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.
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. */
630 /*** Needs some error checking for the float case ***/
633 parse_number (struct parser_state *par_state,
634 const char *p, int len, int parsed_float, YYSTYPE *putithere)
639 int base = input_radix;
643 struct type *signed_type;
644 struct type *unsigned_type;
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'. */
653 for (tmp2 = tmp; *tmp2; ++tmp2)
654 if (*tmp2 == 'd' || *tmp2 == 'D')
656 putithere->dval = atof (tmp);
661 /* Handle base-switching prefixes 0x, 0t, 0d, 0 */
697 if (len == 0 && c == 'l')
699 else if (len == 0 && c == 'u')
704 if (c >= '0' && c <= '9')
706 else if (c >= 'a' && c <= 'f')
709 return ERROR; /* Char not a digit */
711 return ERROR; /* Invalid digit in this base */
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)
722 if ((unsigned_p && (unsigned)prevn >= (unsigned)n))
723 range_error (_("Overflow on numeric constant."));
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.
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. */
740 if ((gdbarch_int_bit (parse_gdbarch (par_state))
741 != gdbarch_long_bit (parse_gdbarch (par_state))
743 >> (gdbarch_int_bit (parse_gdbarch (par_state))-2))) /* Avoid
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;
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;
760 putithere->typed_val.val = n;
762 /* If the high bit of the worked out type is set then this number
763 has to be unsigned. */
765 if (unsigned_p || (n & high_bit))
766 putithere->typed_val.type = unsigned_type;
768 putithere->typed_val.type = signed_type;
777 enum exp_opcode opcode;
780 static const struct token dot_ops[] =
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 }
807 struct f77_boolean_val
813 static const struct f77_boolean_val boolean_values[] =
822 static const struct token f77_keywords[] =
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 }
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 */
846 static char *tempbuf; /* Current buffer contents */
847 static int tempbufsize; /* Size of allocated buffer */
848 static int tempbufindex; /* Current index into buffer */
850 #define GROWBY_MIN_SIZE 64 /* Minimum amount to grow buffer by */
852 #define CHECKBUF(size) \
854 if (tempbufindex + (size) >= tempbufsize) \
856 growbuf_by_size (size); \
861 /* Grow the static temp buffer if necessary, including allocating the
862 first one on demand. */
865 growbuf_by_size (int count)
869 growby = max (count, GROWBY_MIN_SIZE);
870 tempbufsize += growby;
872 tempbuf = (char *) malloc (tempbufsize);
874 tempbuf = (char *) realloc (tempbuf, tempbufsize);
877 /* Blatantly ripped off from ch-exp.y. This routine recognizes F77
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') */
887 match_string_literal (void)
889 const char *tokptr = lexptr;
891 for (tempbufindex = 0, tokptr++; *tokptr != '\0'; tokptr++)
894 if (*tokptr == *lexptr)
896 if (*(tokptr + 1) == *lexptr)
901 tempbuf[tempbufindex++] = *tokptr;
903 if (*tokptr == '\0' /* no terminator */
904 || tempbufindex == 0) /* no string */
908 tempbuf[tempbufindex] = '\0';
909 yylval.sval.ptr = tempbuf;
910 yylval.sval.length = tempbufindex;
912 return STRING_LITERAL;
916 /* Read one token, getting characters through lexptr. */
923 unsigned int i,token;
924 const char *tokstart;
928 prev_lexptr = lexptr;
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. */
937 for (i = 0; boolean_values[i].name != NULL; i++)
939 if (strncmp (tokstart, boolean_values[i].name,
940 strlen (boolean_values[i].name)) == 0)
942 lexptr += strlen (boolean_values[i].name);
943 yylval.lval = boolean_values[i].value;
944 return BOOLEAN_LITERAL;
949 /* See if it is a special .foo. operator. */
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)
955 lexptr += strlen (dot_ops[i].oper);
956 yylval.opcode = dot_ops[i].opcode;
957 return dot_ops[i].token;
960 /* See if it is an exponentiation operator. */
962 if (strncmp (tokstart, "**", 2) == 0)
965 yylval.opcode = BINOP_EXP;
969 switch (c = *tokstart)
981 token = match_string_literal ();
992 if (paren_depth == 0)
999 if (comma_terminates && paren_depth == 0)
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. */
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;
1026 if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
1031 else if (c == '0' && (p[1]=='t' || p[1]=='T'
1032 || p[1]=='d' || p[1]=='D'))
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 == '.')
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
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')))
1059 toktype = parse_number (pstate, tokstart, p - tokstart,
1060 got_dot|got_e|got_d,
1062 if (toktype == ERROR)
1064 char *err_copy = (char *) alloca (p - tokstart + 1);
1066 memcpy (err_copy, tokstart, p - tokstart);
1067 err_copy[p - tokstart] = 0;
1068 error (_("Invalid number \"%s\"."), err_copy);
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);
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]);
1110 /* The token "if" terminates the expression and is NOT
1111 removed from the input stream. */
1113 if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f')
1118 /* Catch specific keywords. */
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)
1124 /* lexptr += strlen(f77_keywords[i].operator); */
1125 yylval.opcode = f77_keywords[i].opcode;
1126 return f77_keywords[i].token;
1129 yylval.sval.ptr = tokstart;
1130 yylval.sval.length = namelen;
1132 if (*tokstart == '$')
1134 write_dollar_variable (pstate, yylval.sval);
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. */
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[] =
1154 for (i = 0; i < ARRAY_SIZE (lookup_domains); ++i)
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));
1160 result = lookup_symbol (tmp, expression_context_block,
1162 parse_language (pstate)->la_language
1164 ? &is_a_field_of_this : NULL);
1165 if (result.symbol && SYMBOL_CLASS (result.symbol) == LOC_TYPEDEF)
1167 yylval.tsym.type = SYMBOL_TYPE (result.symbol);
1176 = language_lookup_primitive_type (parse_language (pstate),
1177 parse_gdbarch (pstate), tmp);
1178 if (yylval.tsym.type != NULL)
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. */
1185 && ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10)
1186 || (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
1188 YYSTYPE newlval; /* Its value is ignored. */
1189 hextype = parse_number (pstate, tokstart, namelen, 0, &newlval);
1192 yylval.ssym.sym = result;
1193 yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
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;
1206 f_parse (struct parser_state *par_state)
1209 struct cleanup *c = make_cleanup_clear_parser_state (&pstate);
1211 /* Setting up the parser state. */
1212 gdb_assert (par_state != NULL);
1215 result = yyparse ();
1224 lexptr = prev_lexptr;
1226 error (_("A %s in expression, near `%s'."), (msg ? msg : "error"), lexptr);