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