gdb/fortran: Introduce fortran-operator.def file
[deliverable/binutils-gdb.git] / gdb / f-exp.y
CommitLineData
0c9c3474 1
c906108c 2/* YACC parser for Fortran expressions, for GDB.
42a4f53d 3 Copyright (C) 1986-2019 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>
325fac50 56#include <algorithm>
dac43e32 57#include "type-stack.h"
c906108c 58
fa9f5be6
TT
59#define parse_type(ps) builtin_type (ps->gdbarch ())
60#define parse_f_type(ps) builtin_f_type (ps->gdbarch ())
3e79cecf 61
b3f11165
PA
62/* Remap normal yacc parser interface names (yyparse, yylex, yyerror,
63 etc). */
64#define GDB_YY_REMAP_PREFIX f_
65#include "yy-remap.h"
f461f5cf 66
410a0ff2
SDJ
67/* The state of the parser, used internally when we are parsing the
68 expression. */
69
70static struct parser_state *pstate = NULL;
71
28aaf3fd
TT
72/* Depth of parentheses. */
73static int paren_depth;
74
dac43e32
TT
75/* The current type stack. */
76static struct type_stack *type_stack;
77
a14ed312 78int yyparse (void);
c906108c 79
a14ed312 80static int yylex (void);
c906108c 81
69d340c6 82static void yyerror (const char *);
c906108c 83
a14ed312 84static void growbuf_by_size (int);
c906108c 85
a14ed312 86static int match_string_literal (void);
c906108c 87
4d00f5d8
AB
88static void push_kind_type (LONGEST val, struct type *type);
89
90static struct type *convert_to_kind_type (struct type *basetype, int kind);
91
c906108c
SS
92%}
93
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. */
97
98%union
99 {
100 LONGEST lval;
101 struct {
102 LONGEST val;
103 struct type *type;
104 } typed_val;
edd079d9
UW
105 struct {
106 gdb_byte val[16];
107 struct type *type;
108 } typed_val_float;
c906108c
SS
109 struct symbol *sym;
110 struct type *tval;
111 struct stoken sval;
112 struct ttype tsym;
113 struct symtoken ssym;
114 int voidval;
c906108c
SS
115 enum exp_opcode opcode;
116 struct internalvar *ivar;
117
118 struct type **tvec;
119 int *ivec;
120 }
121
122%{
123/* YYSTYPE gets defined by %union */
410a0ff2
SDJ
124static int parse_number (struct parser_state *, const char *, int,
125 int, YYSTYPE *);
c906108c
SS
126%}
127
128%type <voidval> exp type_exp start variable
129%type <tval> type typebase
130%type <tvec> nonempty_typelist
131/* %type <bval> block */
132
133/* Fancy type parsing. */
134%type <voidval> func_mod direct_abs_decl abs_decl
135%type <tval> ptype
136
137%token <typed_val> INT
edd079d9 138%token <typed_val_float> FLOAT
c906108c
SS
139
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. */
147
148%token <sval> STRING_LITERAL
149%token <lval> BOOLEAN_LITERAL
150%token <ssym> NAME
151%token <tsym> TYPENAME
2a5e440c 152%type <sval> name
c906108c 153%type <ssym> name_not_typename
c906108c
SS
154
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. */
159
160%token <ssym> NAME_OR_INT
161
4d00f5d8 162%token SIZEOF KIND
c906108c
SS
163%token ERROR
164
165/* Special type cases, put in to allow the parser to distinguish different
166 legal basetypes. */
167%token INT_KEYWORD INT_S2_KEYWORD LOGICAL_S1_KEYWORD LOGICAL_S2_KEYWORD
ce4b0682 168%token LOGICAL_S8_KEYWORD
c906108c
SS
169%token LOGICAL_KEYWORD REAL_KEYWORD REAL_S8_KEYWORD REAL_S16_KEYWORD
170%token COMPLEX_S8_KEYWORD COMPLEX_S16_KEYWORD COMPLEX_S32_KEYWORD
171%token BOOL_AND BOOL_OR BOOL_NOT
172%token <lval> CHARACTER
173
cfeadda5 174%token <voidval> DOLLAR_VARIABLE
c906108c
SS
175
176%token <opcode> ASSIGN_MODIFY
0841c79a 177%token <opcode> UNOP_INTRINSIC
c906108c
SS
178
179%left ','
180%left ABOVE_COMMA
181%right '=' ASSIGN_MODIFY
182%right '?'
183%left BOOL_OR
184%right BOOL_NOT
185%left BOOL_AND
186%left '|'
187%left '^'
188%left '&'
189%left EQUAL NOTEQUAL
190%left LESSTHAN GREATERTHAN LEQ GEQ
191%left LSH RSH
192%left '@'
193%left '+' '-'
2a5e440c 194%left '*' '/'
bd49c137 195%right STARSTAR
2a5e440c 196%right '%'
c906108c
SS
197%right UNARY
198%right '('
199
200\f
201%%
202
203start : exp
204 | type_exp
205 ;
206
207type_exp: type
410a0ff2
SDJ
208 { write_exp_elt_opcode (pstate, OP_TYPE);
209 write_exp_elt_type (pstate, $1);
210 write_exp_elt_opcode (pstate, OP_TYPE); }
c906108c
SS
211 ;
212
213exp : '(' exp ')'
214 { }
215 ;
216
217/* Expressions, not including the comma operator. */
218exp : '*' exp %prec UNARY
410a0ff2 219 { write_exp_elt_opcode (pstate, UNOP_IND); }
ef944135 220 ;
c906108c
SS
221
222exp : '&' exp %prec UNARY
410a0ff2 223 { write_exp_elt_opcode (pstate, UNOP_ADDR); }
ef944135 224 ;
c906108c
SS
225
226exp : '-' exp %prec UNARY
410a0ff2 227 { write_exp_elt_opcode (pstate, UNOP_NEG); }
c906108c
SS
228 ;
229
230exp : BOOL_NOT exp %prec UNARY
410a0ff2 231 { write_exp_elt_opcode (pstate, UNOP_LOGICAL_NOT); }
c906108c
SS
232 ;
233
234exp : '~' exp %prec UNARY
410a0ff2 235 { write_exp_elt_opcode (pstate, UNOP_COMPLEMENT); }
c906108c
SS
236 ;
237
238exp : SIZEOF exp %prec UNARY
410a0ff2 239 { write_exp_elt_opcode (pstate, UNOP_SIZEOF); }
c906108c
SS
240 ;
241
4d00f5d8 242exp : KIND '(' exp ')' %prec UNARY
83228e93 243 { write_exp_elt_opcode (pstate, UNOP_FORTRAN_KIND); }
4d00f5d8
AB
244 ;
245
c906108c
SS
246/* No more explicit array operators, we treat everything in F77 as
247 a function call. The disambiguation as to whether we are
248 doing a subscript operation or a function call is done
249 later in eval.c. */
250
251exp : exp '('
43476f0b 252 { pstate->start_arglist (); }
c906108c 253 arglist ')'
410a0ff2
SDJ
254 { write_exp_elt_opcode (pstate,
255 OP_F77_UNDETERMINED_ARGLIST);
256 write_exp_elt_longcst (pstate,
43476f0b 257 pstate->end_arglist ());
410a0ff2
SDJ
258 write_exp_elt_opcode (pstate,
259 OP_F77_UNDETERMINED_ARGLIST); }
c906108c
SS
260 ;
261
0841c79a
AB
262exp : UNOP_INTRINSIC '(' exp ')'
263 { write_exp_elt_opcode (pstate, $1); }
264 ;
265
c906108c
SS
266arglist :
267 ;
268
269arglist : exp
43476f0b 270 { pstate->arglist_len = 1; }
c906108c
SS
271 ;
272
0b4e1325 273arglist : subrange
43476f0b 274 { pstate->arglist_len = 1; }
ef944135 275 ;
c906108c
SS
276
277arglist : arglist ',' exp %prec ABOVE_COMMA
43476f0b 278 { pstate->arglist_len++; }
c906108c
SS
279 ;
280
0b4e1325
WZ
281/* There are four sorts of subrange types in F90. */
282
283subrange: exp ':' exp %prec ABOVE_COMMA
01739a3b 284 { write_exp_elt_opcode (pstate, OP_RANGE);
410a0ff2 285 write_exp_elt_longcst (pstate, NONE_BOUND_DEFAULT);
01739a3b 286 write_exp_elt_opcode (pstate, OP_RANGE); }
0b4e1325
WZ
287 ;
288
289subrange: exp ':' %prec ABOVE_COMMA
01739a3b 290 { write_exp_elt_opcode (pstate, OP_RANGE);
410a0ff2 291 write_exp_elt_longcst (pstate, HIGH_BOUND_DEFAULT);
01739a3b 292 write_exp_elt_opcode (pstate, OP_RANGE); }
c906108c
SS
293 ;
294
0b4e1325 295subrange: ':' exp %prec ABOVE_COMMA
01739a3b 296 { write_exp_elt_opcode (pstate, OP_RANGE);
410a0ff2 297 write_exp_elt_longcst (pstate, LOW_BOUND_DEFAULT);
01739a3b 298 write_exp_elt_opcode (pstate, OP_RANGE); }
0b4e1325
WZ
299 ;
300
301subrange: ':' %prec ABOVE_COMMA
01739a3b 302 { write_exp_elt_opcode (pstate, OP_RANGE);
410a0ff2 303 write_exp_elt_longcst (pstate, BOTH_BOUND_DEFAULT);
01739a3b 304 write_exp_elt_opcode (pstate, OP_RANGE); }
0b4e1325 305 ;
c906108c
SS
306
307complexnum: exp ',' exp
308 { }
309 ;
310
311exp : '(' complexnum ')'
410a0ff2
SDJ
312 { write_exp_elt_opcode (pstate, OP_COMPLEX);
313 write_exp_elt_type (pstate,
314 parse_f_type (pstate)
315 ->builtin_complex_s16);
316 write_exp_elt_opcode (pstate, OP_COMPLEX); }
c906108c
SS
317 ;
318
319exp : '(' type ')' exp %prec UNARY
410a0ff2
SDJ
320 { write_exp_elt_opcode (pstate, UNOP_CAST);
321 write_exp_elt_type (pstate, $2);
322 write_exp_elt_opcode (pstate, UNOP_CAST); }
c906108c
SS
323 ;
324
2a5e440c 325exp : exp '%' name
410a0ff2
SDJ
326 { write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
327 write_exp_string (pstate, $3);
328 write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); }
2a5e440c
WZ
329 ;
330
c906108c
SS
331/* Binary operators in order of decreasing precedence. */
332
333exp : exp '@' exp
410a0ff2 334 { write_exp_elt_opcode (pstate, BINOP_REPEAT); }
c906108c
SS
335 ;
336
bd49c137 337exp : exp STARSTAR exp
410a0ff2 338 { write_exp_elt_opcode (pstate, BINOP_EXP); }
bd49c137
WZ
339 ;
340
c906108c 341exp : exp '*' exp
410a0ff2 342 { write_exp_elt_opcode (pstate, BINOP_MUL); }
c906108c
SS
343 ;
344
345exp : exp '/' exp
410a0ff2 346 { write_exp_elt_opcode (pstate, BINOP_DIV); }
c906108c
SS
347 ;
348
c906108c 349exp : exp '+' exp
410a0ff2 350 { write_exp_elt_opcode (pstate, BINOP_ADD); }
c906108c
SS
351 ;
352
353exp : exp '-' exp
410a0ff2 354 { write_exp_elt_opcode (pstate, BINOP_SUB); }
c906108c
SS
355 ;
356
357exp : exp LSH exp
410a0ff2 358 { write_exp_elt_opcode (pstate, BINOP_LSH); }
c906108c
SS
359 ;
360
361exp : exp RSH exp
410a0ff2 362 { write_exp_elt_opcode (pstate, BINOP_RSH); }
c906108c
SS
363 ;
364
365exp : exp EQUAL exp
410a0ff2 366 { write_exp_elt_opcode (pstate, BINOP_EQUAL); }
c906108c
SS
367 ;
368
369exp : exp NOTEQUAL exp
410a0ff2 370 { write_exp_elt_opcode (pstate, BINOP_NOTEQUAL); }
c906108c
SS
371 ;
372
373exp : exp LEQ exp
410a0ff2 374 { write_exp_elt_opcode (pstate, BINOP_LEQ); }
c906108c
SS
375 ;
376
377exp : exp GEQ exp
410a0ff2 378 { write_exp_elt_opcode (pstate, BINOP_GEQ); }
c906108c
SS
379 ;
380
381exp : exp LESSTHAN exp
410a0ff2 382 { write_exp_elt_opcode (pstate, BINOP_LESS); }
c906108c
SS
383 ;
384
385exp : exp GREATERTHAN exp
410a0ff2 386 { write_exp_elt_opcode (pstate, BINOP_GTR); }
c906108c
SS
387 ;
388
389exp : exp '&' exp
410a0ff2 390 { write_exp_elt_opcode (pstate, BINOP_BITWISE_AND); }
c906108c
SS
391 ;
392
393exp : exp '^' exp
410a0ff2 394 { write_exp_elt_opcode (pstate, BINOP_BITWISE_XOR); }
c906108c
SS
395 ;
396
397exp : exp '|' exp
410a0ff2 398 { write_exp_elt_opcode (pstate, BINOP_BITWISE_IOR); }
c906108c
SS
399 ;
400
401exp : exp BOOL_AND exp
410a0ff2 402 { write_exp_elt_opcode (pstate, BINOP_LOGICAL_AND); }
c906108c
SS
403 ;
404
405
406exp : exp BOOL_OR exp
410a0ff2 407 { write_exp_elt_opcode (pstate, BINOP_LOGICAL_OR); }
c906108c
SS
408 ;
409
410exp : exp '=' exp
410a0ff2 411 { write_exp_elt_opcode (pstate, BINOP_ASSIGN); }
c906108c
SS
412 ;
413
414exp : exp ASSIGN_MODIFY exp
410a0ff2
SDJ
415 { write_exp_elt_opcode (pstate, BINOP_ASSIGN_MODIFY);
416 write_exp_elt_opcode (pstate, $2);
417 write_exp_elt_opcode (pstate, BINOP_ASSIGN_MODIFY); }
c906108c
SS
418 ;
419
420exp : INT
410a0ff2
SDJ
421 { write_exp_elt_opcode (pstate, OP_LONG);
422 write_exp_elt_type (pstate, $1.type);
423 write_exp_elt_longcst (pstate, (LONGEST) ($1.val));
424 write_exp_elt_opcode (pstate, OP_LONG); }
c906108c
SS
425 ;
426
427exp : NAME_OR_INT
428 { YYSTYPE val;
410a0ff2
SDJ
429 parse_number (pstate, $1.stoken.ptr,
430 $1.stoken.length, 0, &val);
431 write_exp_elt_opcode (pstate, OP_LONG);
432 write_exp_elt_type (pstate, val.typed_val.type);
433 write_exp_elt_longcst (pstate,
434 (LONGEST)val.typed_val.val);
435 write_exp_elt_opcode (pstate, OP_LONG); }
c906108c
SS
436 ;
437
438exp : FLOAT
edd079d9
UW
439 { write_exp_elt_opcode (pstate, OP_FLOAT);
440 write_exp_elt_type (pstate, $1.type);
441 write_exp_elt_floatcst (pstate, $1.val);
442 write_exp_elt_opcode (pstate, OP_FLOAT); }
c906108c
SS
443 ;
444
445exp : variable
446 ;
447
cfeadda5 448exp : DOLLAR_VARIABLE
c906108c
SS
449 ;
450
451exp : SIZEOF '(' type ')' %prec UNARY
410a0ff2
SDJ
452 { write_exp_elt_opcode (pstate, OP_LONG);
453 write_exp_elt_type (pstate,
454 parse_f_type (pstate)
455 ->builtin_integer);
f168693b 456 $3 = check_typedef ($3);
410a0ff2
SDJ
457 write_exp_elt_longcst (pstate,
458 (LONGEST) TYPE_LENGTH ($3));
459 write_exp_elt_opcode (pstate, OP_LONG); }
c906108c
SS
460 ;
461
462exp : BOOLEAN_LITERAL
410a0ff2
SDJ
463 { write_exp_elt_opcode (pstate, OP_BOOL);
464 write_exp_elt_longcst (pstate, (LONGEST) $1);
465 write_exp_elt_opcode (pstate, OP_BOOL);
c906108c
SS
466 }
467 ;
468
469exp : STRING_LITERAL
470 {
410a0ff2
SDJ
471 write_exp_elt_opcode (pstate, OP_STRING);
472 write_exp_string (pstate, $1);
473 write_exp_elt_opcode (pstate, OP_STRING);
c906108c
SS
474 }
475 ;
476
477variable: name_not_typename
d12307c1 478 { struct block_symbol sym = $1.sym;
c906108c 479
d12307c1 480 if (sym.symbol)
c906108c 481 {
d12307c1 482 if (symbol_read_needs_frame (sym.symbol))
699bd4cf 483 pstate->block_tracker->update (sym);
410a0ff2 484 write_exp_elt_opcode (pstate, OP_VAR_VALUE);
63e43d3a 485 write_exp_elt_block (pstate, sym.block);
d12307c1 486 write_exp_elt_sym (pstate, sym.symbol);
410a0ff2 487 write_exp_elt_opcode (pstate, OP_VAR_VALUE);
c906108c
SS
488 break;
489 }
490 else
491 {
7c7b6655 492 struct bound_minimal_symbol msymbol;
61f4b350 493 std::string arg = copy_name ($1.stoken);
c906108c
SS
494
495 msymbol =
61f4b350 496 lookup_bound_minimal_symbol (arg.c_str ());
7c7b6655 497 if (msymbol.minsym != NULL)
410a0ff2 498 write_exp_msymbol (pstate, msymbol);
c906108c 499 else if (!have_full_symbols () && !have_partial_symbols ())
001083c6 500 error (_("No symbol table is loaded. Use the \"file\" command."));
c906108c 501 else
001083c6 502 error (_("No symbol \"%s\" in current context."),
61f4b350 503 arg.c_str ());
c906108c
SS
504 }
505 }
506 ;
507
508
509type : ptype
510 ;
511
512ptype : typebase
513 | typebase abs_decl
514 {
515 /* This is where the interesting stuff happens. */
516 int done = 0;
517 int array_size;
518 struct type *follow_type = $1;
519 struct type *range_type;
520
521 while (!done)
dac43e32 522 switch (type_stack->pop ())
c906108c
SS
523 {
524 case tp_end:
525 done = 1;
526 break;
527 case tp_pointer:
528 follow_type = lookup_pointer_type (follow_type);
529 break;
530 case tp_reference:
3b224330 531 follow_type = lookup_lvalue_reference_type (follow_type);
c906108c
SS
532 break;
533 case tp_array:
dac43e32 534 array_size = type_stack->pop_int ();
c906108c
SS
535 if (array_size != -1)
536 {
537 range_type =
0c9c3474
SA
538 create_static_range_type ((struct type *) NULL,
539 parse_f_type (pstate)
540 ->builtin_integer,
541 0, array_size - 1);
c906108c
SS
542 follow_type =
543 create_array_type ((struct type *) NULL,
544 follow_type, range_type);
545 }
546 else
547 follow_type = lookup_pointer_type (follow_type);
548 break;
549 case tp_function:
550 follow_type = lookup_function_type (follow_type);
551 break;
4d00f5d8
AB
552 case tp_kind:
553 {
dac43e32 554 int kind_val = type_stack->pop_int ();
4d00f5d8
AB
555 follow_type
556 = convert_to_kind_type (follow_type, kind_val);
557 }
558 break;
c906108c
SS
559 }
560 $$ = follow_type;
561 }
562 ;
563
564abs_decl: '*'
dac43e32 565 { type_stack->push (tp_pointer); $$ = 0; }
c906108c 566 | '*' abs_decl
dac43e32 567 { type_stack->push (tp_pointer); $$ = $2; }
c906108c 568 | '&'
dac43e32 569 { type_stack->push (tp_reference); $$ = 0; }
c906108c 570 | '&' abs_decl
dac43e32 571 { type_stack->push (tp_reference); $$ = $2; }
c906108c
SS
572 | direct_abs_decl
573 ;
574
575direct_abs_decl: '(' abs_decl ')'
576 { $$ = $2; }
4d00f5d8
AB
577 | '(' KIND '=' INT ')'
578 { push_kind_type ($4.val, $4.type); }
efbecbc1
AB
579 | '*' INT
580 { push_kind_type ($2.val, $2.type); }
c906108c 581 | direct_abs_decl func_mod
dac43e32 582 { type_stack->push (tp_function); }
c906108c 583 | func_mod
dac43e32 584 { type_stack->push (tp_function); }
c906108c
SS
585 ;
586
587func_mod: '(' ')'
588 { $$ = 0; }
589 | '(' nonempty_typelist ')'
8dbb1c65 590 { free ($2); $$ = 0; }
c906108c
SS
591 ;
592
593typebase /* Implements (approximately): (type-qualifier)* type-specifier */
594 : TYPENAME
595 { $$ = $1.type; }
596 | INT_KEYWORD
410a0ff2 597 { $$ = parse_f_type (pstate)->builtin_integer; }
c906108c 598 | INT_S2_KEYWORD
410a0ff2 599 { $$ = parse_f_type (pstate)->builtin_integer_s2; }
c906108c 600 | CHARACTER
410a0ff2 601 { $$ = parse_f_type (pstate)->builtin_character; }
ce4b0682 602 | LOGICAL_S8_KEYWORD
410a0ff2 603 { $$ = parse_f_type (pstate)->builtin_logical_s8; }
c906108c 604 | LOGICAL_KEYWORD
410a0ff2 605 { $$ = parse_f_type (pstate)->builtin_logical; }
c906108c 606 | LOGICAL_S2_KEYWORD
410a0ff2 607 { $$ = parse_f_type (pstate)->builtin_logical_s2; }
c906108c 608 | LOGICAL_S1_KEYWORD
410a0ff2 609 { $$ = parse_f_type (pstate)->builtin_logical_s1; }
c906108c 610 | REAL_KEYWORD
410a0ff2 611 { $$ = parse_f_type (pstate)->builtin_real; }
c906108c 612 | REAL_S8_KEYWORD
410a0ff2 613 { $$ = parse_f_type (pstate)->builtin_real_s8; }
c906108c 614 | REAL_S16_KEYWORD
410a0ff2 615 { $$ = parse_f_type (pstate)->builtin_real_s16; }
c906108c 616 | COMPLEX_S8_KEYWORD
410a0ff2 617 { $$ = parse_f_type (pstate)->builtin_complex_s8; }
c906108c 618 | COMPLEX_S16_KEYWORD
410a0ff2 619 { $$ = parse_f_type (pstate)->builtin_complex_s16; }
c906108c 620 | COMPLEX_S32_KEYWORD
410a0ff2 621 { $$ = parse_f_type (pstate)->builtin_complex_s32; }
c906108c
SS
622 ;
623
c906108c
SS
624nonempty_typelist
625 : type
626 { $$ = (struct type **) malloc (sizeof (struct type *) * 2);
627 $<ivec>$[0] = 1; /* Number of types in vector */
628 $$[1] = $1;
629 }
630 | nonempty_typelist ',' type
631 { int len = sizeof (struct type *) * (++($<ivec>1[0]) + 1);
632 $$ = (struct type **) realloc ((char *) $1, len);
633 $$[$<ivec>$[0]] = $3;
634 }
635 ;
636
2a5e440c
WZ
637name : NAME
638 { $$ = $1.stoken; }
639 ;
640
c906108c
SS
641name_not_typename : NAME
642/* These would be useful if name_not_typename was useful, but it is just
643 a fake for "variable", so these cause reduce/reduce conflicts because
644 the parser can't tell whether NAME_OR_INT is a name_not_typename (=variable,
645 =exp) or just an exp. If name_not_typename was ever used in an lvalue
646 context where only a name could occur, this might be useful.
647 | NAME_OR_INT
648 */
649 ;
650
651%%
652
653/* Take care of parsing a number (anything that starts with a digit).
654 Set yylval and return the token type; update lexptr.
655 LEN is the number of characters in it. */
656
657/*** Needs some error checking for the float case ***/
658
659static int
410a0ff2
SDJ
660parse_number (struct parser_state *par_state,
661 const char *p, int len, int parsed_float, YYSTYPE *putithere)
c906108c 662{
710122da
DC
663 LONGEST n = 0;
664 LONGEST prevn = 0;
665 int c;
666 int base = input_radix;
c906108c
SS
667 int unsigned_p = 0;
668 int long_p = 0;
669 ULONGEST high_bit;
670 struct type *signed_type;
671 struct type *unsigned_type;
672
673 if (parsed_float)
674 {
675 /* It's a float since it contains a point or an exponent. */
edd079d9
UW
676 /* [dD] is not understood as an exponent by parse_float,
677 change it to 'e'. */
c906108c
SS
678 char *tmp, *tmp2;
679
4fcf66da 680 tmp = xstrdup (p);
c906108c
SS
681 for (tmp2 = tmp; *tmp2; ++tmp2)
682 if (*tmp2 == 'd' || *tmp2 == 'D')
683 *tmp2 = 'e';
edd079d9
UW
684
685 /* FIXME: Should this use different types? */
686 putithere->typed_val_float.type = parse_f_type (pstate)->builtin_real_s8;
687 bool parsed = parse_float (tmp, len,
688 putithere->typed_val_float.type,
689 putithere->typed_val_float.val);
c906108c 690 free (tmp);
edd079d9 691 return parsed? FLOAT : ERROR;
c906108c
SS
692 }
693
694 /* Handle base-switching prefixes 0x, 0t, 0d, 0 */
695 if (p[0] == '0')
696 switch (p[1])
697 {
698 case 'x':
699 case 'X':
700 if (len >= 3)
701 {
702 p += 2;
703 base = 16;
704 len -= 2;
705 }
706 break;
707
708 case 't':
709 case 'T':
710 case 'd':
711 case 'D':
712 if (len >= 3)
713 {
714 p += 2;
715 base = 10;
716 len -= 2;
717 }
718 break;
719
720 default:
721 base = 8;
722 break;
723 }
724
725 while (len-- > 0)
726 {
727 c = *p++;
0f6e1ba6
AC
728 if (isupper (c))
729 c = tolower (c);
730 if (len == 0 && c == 'l')
731 long_p = 1;
732 else if (len == 0 && c == 'u')
733 unsigned_p = 1;
c906108c
SS
734 else
735 {
0f6e1ba6
AC
736 int i;
737 if (c >= '0' && c <= '9')
738 i = c - '0';
739 else if (c >= 'a' && c <= 'f')
740 i = c - 'a' + 10;
c906108c
SS
741 else
742 return ERROR; /* Char not a digit */
0f6e1ba6
AC
743 if (i >= base)
744 return ERROR; /* Invalid digit in this base */
745 n *= base;
746 n += i;
c906108c 747 }
c906108c
SS
748 /* Portably test for overflow (only works for nonzero values, so make
749 a second check for zero). */
750 if ((prevn >= n) && n != 0)
751 unsigned_p=1; /* Try something unsigned */
752 /* If range checking enabled, portably test for unsigned overflow. */
753 if (RANGE_CHECK && n != 0)
754 {
755 if ((unsigned_p && (unsigned)prevn >= (unsigned)n))
001083c6 756 range_error (_("Overflow on numeric constant."));
c906108c
SS
757 }
758 prevn = n;
759 }
760
761 /* If the number is too big to be an int, or it's got an l suffix
762 then it's a long. Work out if this has to be a long by
7a9dd1b2 763 shifting right and seeing if anything remains, and the
c906108c
SS
764 target int size is different to the target long size.
765
766 In the expression below, we could have tested
3e79cecf 767 (n >> gdbarch_int_bit (parse_gdbarch))
c906108c
SS
768 to see if it was zero,
769 but too many compilers warn about that, when ints and longs
770 are the same size. So we shift it twice, with fewer bits
771 each time, for the same result. */
772
fa9f5be6
TT
773 if ((gdbarch_int_bit (par_state->gdbarch ())
774 != gdbarch_long_bit (par_state->gdbarch ())
9a76efb6 775 && ((n >> 2)
fa9f5be6 776 >> (gdbarch_int_bit (par_state->gdbarch ())-2))) /* Avoid
410a0ff2 777 shift warning */
c906108c
SS
778 || long_p)
779 {
410a0ff2 780 high_bit = ((ULONGEST)1)
fa9f5be6 781 << (gdbarch_long_bit (par_state->gdbarch ())-1);
410a0ff2
SDJ
782 unsigned_type = parse_type (par_state)->builtin_unsigned_long;
783 signed_type = parse_type (par_state)->builtin_long;
c906108c
SS
784 }
785 else
786 {
410a0ff2 787 high_bit =
fa9f5be6 788 ((ULONGEST)1) << (gdbarch_int_bit (par_state->gdbarch ()) - 1);
410a0ff2
SDJ
789 unsigned_type = parse_type (par_state)->builtin_unsigned_int;
790 signed_type = parse_type (par_state)->builtin_int;
c906108c
SS
791 }
792
793 putithere->typed_val.val = n;
794
795 /* If the high bit of the worked out type is set then this number
0963b4bd 796 has to be unsigned. */
c906108c
SS
797
798 if (unsigned_p || (n & high_bit))
799 putithere->typed_val.type = unsigned_type;
800 else
801 putithere->typed_val.type = signed_type;
802
803 return INT;
804}
805
4d00f5d8
AB
806/* Called to setup the type stack when we encounter a '(kind=N)' type
807 modifier, performs some bounds checking on 'N' and then pushes this to
808 the type stack followed by the 'tp_kind' marker. */
809static void
810push_kind_type (LONGEST val, struct type *type)
811{
812 int ival;
813
814 if (TYPE_UNSIGNED (type))
815 {
816 ULONGEST uval = static_cast <ULONGEST> (val);
817 if (uval > INT_MAX)
818 error (_("kind value out of range"));
819 ival = static_cast <int> (uval);
820 }
821 else
822 {
823 if (val > INT_MAX || val < 0)
824 error (_("kind value out of range"));
825 ival = static_cast <int> (val);
826 }
827
dac43e32
TT
828 type_stack->push (ival);
829 type_stack->push (tp_kind);
4d00f5d8
AB
830}
831
832/* Called when a type has a '(kind=N)' modifier after it, for example
833 'character(kind=1)'. The BASETYPE is the type described by 'character'
834 in our example, and KIND is the integer '1'. This function returns a
835 new type that represents the basetype of a specific kind. */
836static struct type *
837convert_to_kind_type (struct type *basetype, int kind)
838{
839 if (basetype == parse_f_type (pstate)->builtin_character)
840 {
841 /* Character of kind 1 is a special case, this is the same as the
842 base character type. */
843 if (kind == 1)
844 return parse_f_type (pstate)->builtin_character;
845 }
3be47f7a
AB
846 else if (basetype == parse_f_type (pstate)->builtin_complex_s8)
847 {
848 if (kind == 4)
849 return parse_f_type (pstate)->builtin_complex_s8;
850 else if (kind == 8)
851 return parse_f_type (pstate)->builtin_complex_s16;
852 else if (kind == 16)
853 return parse_f_type (pstate)->builtin_complex_s32;
854 }
855 else if (basetype == parse_f_type (pstate)->builtin_real)
856 {
857 if (kind == 4)
858 return parse_f_type (pstate)->builtin_real;
859 else if (kind == 8)
860 return parse_f_type (pstate)->builtin_real_s8;
861 else if (kind == 16)
862 return parse_f_type (pstate)->builtin_real_s16;
863 }
864 else if (basetype == parse_f_type (pstate)->builtin_logical)
865 {
866 if (kind == 1)
867 return parse_f_type (pstate)->builtin_logical_s1;
868 else if (kind == 2)
869 return parse_f_type (pstate)->builtin_logical_s2;
870 else if (kind == 4)
871 return parse_f_type (pstate)->builtin_logical;
872 else if (kind == 8)
873 return parse_f_type (pstate)->builtin_logical_s8;
874 }
875 else if (basetype == parse_f_type (pstate)->builtin_integer)
876 {
877 if (kind == 2)
878 return parse_f_type (pstate)->builtin_integer_s2;
879 else if (kind == 4)
880 return parse_f_type (pstate)->builtin_integer;
067630bd
AB
881 else if (kind == 8)
882 return parse_f_type (pstate)->builtin_integer_s8;
3be47f7a 883 }
4d00f5d8
AB
884
885 error (_("unsupported kind %d for type %s"),
886 kind, TYPE_SAFE_NAME (basetype));
887
888 /* Should never get here. */
889 return nullptr;
890}
891
c906108c
SS
892struct token
893{
c8f91604 894 /* The string to match against. */
a121b7c1 895 const char *oper;
c8f91604
AB
896
897 /* The lexer token to return. */
c906108c 898 int token;
c8f91604
AB
899
900 /* The expression opcode to embed within the token. */
c906108c 901 enum exp_opcode opcode;
c8f91604
AB
902
903 /* When this is true the string in OPER is matched exactly including
904 case, when this is false OPER is matched case insensitively. */
905 bool case_sensitive;
c906108c
SS
906};
907
908static const struct token dot_ops[] =
909{
c8f91604
AB
910 { ".and.", BOOL_AND, BINOP_END, false },
911 { ".or.", BOOL_OR, BINOP_END, false },
912 { ".not.", BOOL_NOT, BINOP_END, false },
913 { ".eq.", EQUAL, BINOP_END, false },
914 { ".eqv.", EQUAL, BINOP_END, false },
915 { ".neqv.", NOTEQUAL, BINOP_END, false },
916 { ".ne.", NOTEQUAL, BINOP_END, false },
917 { ".le.", LEQ, BINOP_END, false },
918 { ".ge.", GEQ, BINOP_END, false },
919 { ".gt.", GREATERTHAN, BINOP_END, false },
920 { ".lt.", LESSTHAN, BINOP_END, false },
c906108c
SS
921};
922
dd9f2c76
AB
923/* Holds the Fortran representation of a boolean, and the integer value we
924 substitute in when one of the matching strings is parsed. */
925struct f77_boolean_val
c906108c 926{
dd9f2c76 927 /* The string representing a Fortran boolean. */
a121b7c1 928 const char *name;
dd9f2c76
AB
929
930 /* The integer value to replace it with. */
c906108c 931 int value;
dd9f2c76 932};
c906108c 933
dd9f2c76
AB
934/* The set of Fortran booleans. These are matched case insensitively. */
935static const struct f77_boolean_val boolean_values[] =
c906108c
SS
936{
937 { ".true.", 1 },
dd9f2c76 938 { ".false.", 0 }
c906108c
SS
939};
940
c8f91604 941static const struct token f77_keywords[] =
c906108c 942{
c8f91604
AB
943 /* Historically these have always been lowercase only in GDB. */
944 { "complex_16", COMPLEX_S16_KEYWORD, BINOP_END, true },
945 { "complex_32", COMPLEX_S32_KEYWORD, BINOP_END, true },
946 { "character", CHARACTER, BINOP_END, true },
947 { "integer_2", INT_S2_KEYWORD, BINOP_END, true },
948 { "logical_1", LOGICAL_S1_KEYWORD, BINOP_END, true },
949 { "logical_2", LOGICAL_S2_KEYWORD, BINOP_END, true },
950 { "logical_8", LOGICAL_S8_KEYWORD, BINOP_END, true },
951 { "complex_8", COMPLEX_S8_KEYWORD, BINOP_END, true },
952 { "integer", INT_KEYWORD, BINOP_END, true },
953 { "logical", LOGICAL_KEYWORD, BINOP_END, true },
954 { "real_16", REAL_S16_KEYWORD, BINOP_END, true },
955 { "complex", COMPLEX_S8_KEYWORD, BINOP_END, true },
956 { "sizeof", SIZEOF, BINOP_END, true },
957 { "real_8", REAL_S8_KEYWORD, BINOP_END, true },
958 { "real", REAL_KEYWORD, BINOP_END, true },
4d00f5d8
AB
959 /* The following correspond to actual functions in Fortran and are case
960 insensitive. */
0841c79a
AB
961 { "kind", KIND, BINOP_END, false },
962 { "abs", UNOP_INTRINSIC, UNOP_ABS, false }
c8f91604 963};
c906108c
SS
964
965/* Implementation of a dynamically expandable buffer for processing input
966 characters acquired through lexptr and building a value to return in
0963b4bd 967 yylval. Ripped off from ch-exp.y */
c906108c
SS
968
969static char *tempbuf; /* Current buffer contents */
970static int tempbufsize; /* Size of allocated buffer */
971static int tempbufindex; /* Current index into buffer */
972
973#define GROWBY_MIN_SIZE 64 /* Minimum amount to grow buffer by */
974
975#define CHECKBUF(size) \
976 do { \
977 if (tempbufindex + (size) >= tempbufsize) \
978 { \
979 growbuf_by_size (size); \
980 } \
981 } while (0);
982
983
0963b4bd
MS
984/* Grow the static temp buffer if necessary, including allocating the
985 first one on demand. */
c906108c
SS
986
987static void
d04550a6 988growbuf_by_size (int count)
c906108c
SS
989{
990 int growby;
991
325fac50 992 growby = std::max (count, GROWBY_MIN_SIZE);
c906108c
SS
993 tempbufsize += growby;
994 if (tempbuf == NULL)
995 tempbuf = (char *) malloc (tempbufsize);
996 else
997 tempbuf = (char *) realloc (tempbuf, tempbufsize);
998}
999
1000/* Blatantly ripped off from ch-exp.y. This routine recognizes F77
0963b4bd 1001 string-literals.
c906108c
SS
1002
1003 Recognize a string literal. A string literal is a nonzero sequence
1004 of characters enclosed in matching single quotes, except that
1005 a single character inside single quotes is a character literal, which
1006 we reject as a string literal. To embed the terminator character inside
1007 a string, it is simply doubled (I.E. 'this''is''one''string') */
1008
1009static int
eeae04df 1010match_string_literal (void)
c906108c 1011{
5776fca3 1012 const char *tokptr = pstate->lexptr;
c906108c
SS
1013
1014 for (tempbufindex = 0, tokptr++; *tokptr != '\0'; tokptr++)
1015 {
1016 CHECKBUF (1);
5776fca3 1017 if (*tokptr == *pstate->lexptr)
c906108c 1018 {
5776fca3 1019 if (*(tokptr + 1) == *pstate->lexptr)
c906108c
SS
1020 tokptr++;
1021 else
1022 break;
1023 }
1024 tempbuf[tempbufindex++] = *tokptr;
1025 }
1026 if (*tokptr == '\0' /* no terminator */
1027 || tempbufindex == 0) /* no string */
1028 return 0;
1029 else
1030 {
1031 tempbuf[tempbufindex] = '\0';
1032 yylval.sval.ptr = tempbuf;
1033 yylval.sval.length = tempbufindex;
5776fca3 1034 pstate->lexptr = ++tokptr;
c906108c
SS
1035 return STRING_LITERAL;
1036 }
1037}
1038
1039/* Read one token, getting characters through lexptr. */
1040
1041static int
eeae04df 1042yylex (void)
c906108c
SS
1043{
1044 int c;
1045 int namelen;
b926417a 1046 unsigned int token;
d7561cbb 1047 const char *tokstart;
c906108c
SS
1048
1049 retry:
065432a8 1050
5776fca3 1051 pstate->prev_lexptr = pstate->lexptr;
065432a8 1052
5776fca3 1053 tokstart = pstate->lexptr;
dd9f2c76
AB
1054
1055 /* First of all, let us make sure we are not dealing with the
c906108c 1056 special tokens .true. and .false. which evaluate to 1 and 0. */
dd9f2c76 1057
5776fca3 1058 if (*pstate->lexptr == '.')
dd9f2c76
AB
1059 {
1060 for (int i = 0; i < ARRAY_SIZE (boolean_values); i++)
c906108c 1061 {
dd9f2c76
AB
1062 if (strncasecmp (tokstart, boolean_values[i].name,
1063 strlen (boolean_values[i].name)) == 0)
c906108c 1064 {
5776fca3 1065 pstate->lexptr += strlen (boolean_values[i].name);
dd9f2c76 1066 yylval.lval = boolean_values[i].value;
c906108c
SS
1067 return BOOLEAN_LITERAL;
1068 }
1069 }
1070 }
c8f91604 1071
bd49c137 1072 /* See if it is a special .foo. operator. */
c8f91604
AB
1073 for (int i = 0; i < ARRAY_SIZE (dot_ops); i++)
1074 if (strncasecmp (tokstart, dot_ops[i].oper,
1075 strlen (dot_ops[i].oper)) == 0)
c906108c 1076 {
c8f91604 1077 gdb_assert (!dot_ops[i].case_sensitive);
5776fca3 1078 pstate->lexptr += strlen (dot_ops[i].oper);
c906108c
SS
1079 yylval.opcode = dot_ops[i].opcode;
1080 return dot_ops[i].token;
1081 }
c8f91604 1082
bd49c137
WZ
1083 /* See if it is an exponentiation operator. */
1084
1085 if (strncmp (tokstart, "**", 2) == 0)
1086 {
5776fca3 1087 pstate->lexptr += 2;
bd49c137
WZ
1088 yylval.opcode = BINOP_EXP;
1089 return STARSTAR;
1090 }
1091
c906108c
SS
1092 switch (c = *tokstart)
1093 {
1094 case 0:
1095 return 0;
1096
1097 case ' ':
1098 case '\t':
1099 case '\n':
5776fca3 1100 pstate->lexptr++;
c906108c
SS
1101 goto retry;
1102
1103 case '\'':
1104 token = match_string_literal ();
1105 if (token != 0)
1106 return (token);
1107 break;
1108
1109 case '(':
1110 paren_depth++;
5776fca3 1111 pstate->lexptr++;
c906108c
SS
1112 return c;
1113
1114 case ')':
1115 if (paren_depth == 0)
1116 return 0;
1117 paren_depth--;
5776fca3 1118 pstate->lexptr++;
c906108c
SS
1119 return c;
1120
1121 case ',':
8621b685 1122 if (pstate->comma_terminates && paren_depth == 0)
c906108c 1123 return 0;
5776fca3 1124 pstate->lexptr++;
c906108c
SS
1125 return c;
1126
1127 case '.':
1128 /* Might be a floating point number. */
5776fca3 1129 if (pstate->lexptr[1] < '0' || pstate->lexptr[1] > '9')
0963b4bd 1130 goto symbol; /* Nope, must be a symbol. */
86a73007 1131 /* FALL THRU. */
c906108c
SS
1132
1133 case '0':
1134 case '1':
1135 case '2':
1136 case '3':
1137 case '4':
1138 case '5':
1139 case '6':
1140 case '7':
1141 case '8':
1142 case '9':
1143 {
1144 /* It's a number. */
1145 int got_dot = 0, got_e = 0, got_d = 0, toktype;
d7561cbb 1146 const char *p = tokstart;
c906108c
SS
1147 int hex = input_radix > 10;
1148
1149 if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
1150 {
1151 p += 2;
1152 hex = 1;
1153 }
0963b4bd
MS
1154 else if (c == '0' && (p[1]=='t' || p[1]=='T'
1155 || p[1]=='d' || p[1]=='D'))
c906108c
SS
1156 {
1157 p += 2;
1158 hex = 0;
1159 }
1160
1161 for (;; ++p)
1162 {
1163 if (!hex && !got_e && (*p == 'e' || *p == 'E'))
1164 got_dot = got_e = 1;
1165 else if (!hex && !got_d && (*p == 'd' || *p == 'D'))
1166 got_dot = got_d = 1;
1167 else if (!hex && !got_dot && *p == '.')
1168 got_dot = 1;
1169 else if (((got_e && (p[-1] == 'e' || p[-1] == 'E'))
1170 || (got_d && (p[-1] == 'd' || p[-1] == 'D')))
1171 && (*p == '-' || *p == '+'))
1172 /* This is the sign of the exponent, not the end of the
1173 number. */
1174 continue;
1175 /* We will take any letters or digits. parse_number will
1176 complain if past the radix, or if L or U are not final. */
1177 else if ((*p < '0' || *p > '9')
1178 && ((*p < 'a' || *p > 'z')
1179 && (*p < 'A' || *p > 'Z')))
1180 break;
1181 }
410a0ff2
SDJ
1182 toktype = parse_number (pstate, tokstart, p - tokstart,
1183 got_dot|got_e|got_d,
c906108c
SS
1184 &yylval);
1185 if (toktype == ERROR)
1186 {
1187 char *err_copy = (char *) alloca (p - tokstart + 1);
1188
1189 memcpy (err_copy, tokstart, p - tokstart);
1190 err_copy[p - tokstart] = 0;
001083c6 1191 error (_("Invalid number \"%s\"."), err_copy);
c906108c 1192 }
5776fca3 1193 pstate->lexptr = p;
c906108c
SS
1194 return toktype;
1195 }
1196
1197 case '+':
1198 case '-':
1199 case '*':
1200 case '/':
1201 case '%':
1202 case '|':
1203 case '&':
1204 case '^':
1205 case '~':
1206 case '!':
1207 case '@':
1208 case '<':
1209 case '>':
1210 case '[':
1211 case ']':
1212 case '?':
1213 case ':':
1214 case '=':
1215 case '{':
1216 case '}':
1217 symbol:
5776fca3 1218 pstate->lexptr++;
c906108c
SS
1219 return c;
1220 }
1221
f55ee35c 1222 if (!(c == '_' || c == '$' || c ==':'
c906108c
SS
1223 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
1224 /* We must have come across a bad character (e.g. ';'). */
001083c6 1225 error (_("Invalid character '%c' in expression."), c);
c906108c
SS
1226
1227 namelen = 0;
1228 for (c = tokstart[namelen];
f55ee35c 1229 (c == '_' || c == '$' || c == ':' || (c >= '0' && c <= '9')
c906108c
SS
1230 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
1231 c = tokstart[++namelen]);
1232
1233 /* The token "if" terminates the expression and is NOT
1234 removed from the input stream. */
1235
1236 if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f')
1237 return 0;
1238
5776fca3 1239 pstate->lexptr += namelen;
c906108c
SS
1240
1241 /* Catch specific keywords. */
c8f91604
AB
1242
1243 for (int i = 0; i < ARRAY_SIZE (f77_keywords); i++)
fe978cb0 1244 if (strlen (f77_keywords[i].oper) == namelen
c8f91604
AB
1245 && ((!f77_keywords[i].case_sensitive
1246 && strncasecmp (tokstart, f77_keywords[i].oper, namelen) == 0)
1247 || (f77_keywords[i].case_sensitive
1248 && strncmp (tokstart, f77_keywords[i].oper, namelen) == 0)))
c906108c 1249 {
c906108c
SS
1250 yylval.opcode = f77_keywords[i].opcode;
1251 return f77_keywords[i].token;
1252 }
c8f91604 1253
c906108c
SS
1254 yylval.sval.ptr = tokstart;
1255 yylval.sval.length = namelen;
1256
1257 if (*tokstart == '$')
1258 {
410a0ff2 1259 write_dollar_variable (pstate, yylval.sval);
cfeadda5 1260 return DOLLAR_VARIABLE;
c906108c
SS
1261 }
1262
1263 /* Use token-type TYPENAME for symbols that happen to be defined
1264 currently as names of types; NAME for other symbols.
1265 The caller is not constrained to care about the distinction. */
1266 {
61f4b350 1267 std::string tmp = copy_name (yylval.sval);
d12307c1 1268 struct block_symbol result;
1993b719 1269 struct field_of_this_result is_a_field_of_this;
530e8392
KB
1270 enum domain_enum_tag lookup_domains[] =
1271 {
1272 STRUCT_DOMAIN,
1273 VAR_DOMAIN,
1274 MODULE_DOMAIN
1275 };
c906108c 1276 int hextype;
7f9b20bb 1277
b926417a 1278 for (int i = 0; i < ARRAY_SIZE (lookup_domains); ++i)
c906108c 1279 {
7f9b20bb
KB
1280 /* Initialize this in case we *don't* use it in this call; that
1281 way we can refer to it unconditionally below. */
1282 memset (&is_a_field_of_this, 0, sizeof (is_a_field_of_this));
1283
61f4b350 1284 result = lookup_symbol (tmp.c_str (), pstate->expression_context_block,
d12307c1 1285 lookup_domains[i],
73923d7e 1286 pstate->language ()->la_language
d12307c1
PMR
1287 == language_cplus
1288 ? &is_a_field_of_this : NULL);
1289 if (result.symbol && SYMBOL_CLASS (result.symbol) == LOC_TYPEDEF)
7f9b20bb 1290 {
d12307c1 1291 yylval.tsym.type = SYMBOL_TYPE (result.symbol);
7f9b20bb
KB
1292 return TYPENAME;
1293 }
1294
d12307c1 1295 if (result.symbol)
7f9b20bb 1296 break;
c906108c 1297 }
7f9b20bb 1298
54a5b07d 1299 yylval.tsym.type
73923d7e 1300 = language_lookup_primitive_type (pstate->language (),
61f4b350 1301 pstate->gdbarch (), tmp.c_str ());
54a5b07d 1302 if (yylval.tsym.type != NULL)
c906108c
SS
1303 return TYPENAME;
1304
1305 /* Input names that aren't symbols but ARE valid hex numbers,
1306 when the input radix permits them, can be names or numbers
1307 depending on the parse. Note we support radixes > 16 here. */
d12307c1 1308 if (!result.symbol
c906108c
SS
1309 && ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10)
1310 || (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
1311 {
1312 YYSTYPE newlval; /* Its value is ignored. */
410a0ff2 1313 hextype = parse_number (pstate, tokstart, namelen, 0, &newlval);
c906108c
SS
1314 if (hextype == INT)
1315 {
d12307c1 1316 yylval.ssym.sym = result;
1993b719 1317 yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
c906108c
SS
1318 return NAME_OR_INT;
1319 }
1320 }
1321
1322 /* Any other kind of symbol */
d12307c1 1323 yylval.ssym.sym = result;
1993b719 1324 yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
c906108c
SS
1325 return NAME;
1326 }
1327}
1328
410a0ff2
SDJ
1329int
1330f_parse (struct parser_state *par_state)
1331{
410a0ff2 1332 /* Setting up the parser state. */
eae49211 1333 scoped_restore pstate_restore = make_scoped_restore (&pstate);
e454224f
AB
1334 scoped_restore restore_yydebug = make_scoped_restore (&yydebug,
1335 parser_debug);
410a0ff2
SDJ
1336 gdb_assert (par_state != NULL);
1337 pstate = par_state;
28aaf3fd 1338 paren_depth = 0;
410a0ff2 1339
dac43e32
TT
1340 struct type_stack stack;
1341 scoped_restore restore_type_stack = make_scoped_restore (&type_stack,
1342 &stack);
1343
eae49211 1344 return yyparse ();
410a0ff2
SDJ
1345}
1346
69d340c6 1347static void
a121b7c1 1348yyerror (const char *msg)
c906108c 1349{
5776fca3
TT
1350 if (pstate->prev_lexptr)
1351 pstate->lexptr = pstate->prev_lexptr;
065432a8 1352
5776fca3 1353 error (_("A %s in expression, near `%s'."), msg, pstate->lexptr);
c906108c 1354}
This page took 1.935008 seconds and 4 git commands to generate.