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