2002-02-20 Daniel Jacobowitz <drow@mvista.com>
[external/binutils.git] / gdb / jv-exp.y
1 /* YACC parser for Java expressions, for GDB.
2    Copyright 1997, 1998, 1999, 2000
3    Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 /* Parse a Java expression from text in a string,
22    and return the result as a  struct expression  pointer.
23    That structure contains arithmetic operations in reverse polish,
24    with constants represented by operations that are followed by special data.
25    See expression.h for the details of the format.
26    What is important here is that it can be built up sequentially
27    during the process of parsing; the lower levels of the tree always
28    come first in the result.  Well, almost always; see ArrayAccess.
29
30    Note that malloc's and realloc's in this file are transformed to
31    xmalloc and xrealloc respectively by the same sed command in the
32    makefile that remaps any other malloc/realloc inserted by the parser
33    generator.  Doing this with #defines and trying to control the interaction
34    with include files (<malloc.h> and <stdlib.h> for example) just became
35    too messy, particularly when such includes can be inserted at random
36    times by the parser generator.  */
37   
38 %{
39
40 #include "defs.h"
41 #include "gdb_string.h"
42 #include <ctype.h>
43 #include "expression.h"
44 #include "value.h"
45 #include "parser-defs.h"
46 #include "language.h"
47 #include "jv-lang.h"
48 #include "bfd.h" /* Required by objfiles.h.  */
49 #include "symfile.h" /* Required by objfiles.h.  */
50 #include "objfiles.h" /* For have_full_symbols and have_partial_symbols */
51
52 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
53    as well as gratuitiously global symbol names, so we can have multiple
54    yacc generated parsers in gdb.  Note that these are only the variables
55    produced by yacc.  If other parser generators (bison, byacc, etc) produce
56    additional global names that conflict at link time, then those parser
57    generators need to be fixed instead of adding those names to this list. */
58
59 #define yymaxdepth java_maxdepth
60 #define yyparse java_parse
61 #define yylex   java_lex
62 #define yyerror java_error
63 #define yylval  java_lval
64 #define yychar  java_char
65 #define yydebug java_debug
66 #define yypact  java_pact       
67 #define yyr1    java_r1                 
68 #define yyr2    java_r2                 
69 #define yydef   java_def                
70 #define yychk   java_chk                
71 #define yypgo   java_pgo                
72 #define yyact   java_act                
73 #define yyexca  java_exca
74 #define yyerrflag java_errflag
75 #define yynerrs java_nerrs
76 #define yyps    java_ps
77 #define yypv    java_pv
78 #define yys     java_s
79 #define yy_yys  java_yys
80 #define yystate java_state
81 #define yytmp   java_tmp
82 #define yyv     java_v
83 #define yy_yyv  java_yyv
84 #define yyval   java_val
85 #define yylloc  java_lloc
86 #define yyreds  java_reds               /* With YYDEBUG defined */
87 #define yytoks  java_toks               /* With YYDEBUG defined */
88 #define yylhs   java_yylhs
89 #define yylen   java_yylen
90 #define yydefred java_yydefred
91 #define yydgoto java_yydgoto
92 #define yysindex java_yysindex
93 #define yyrindex java_yyrindex
94 #define yygindex java_yygindex
95 #define yytable  java_yytable
96 #define yycheck  java_yycheck
97
98 #ifndef YYDEBUG
99 #define YYDEBUG 0               /* Default to no yydebug support */
100 #endif
101
102 int yyparse (void);
103
104 static int yylex (void);
105
106 void yyerror (char *);
107
108 static struct type *java_type_from_name (struct stoken);
109 static void push_expression_name (struct stoken);
110 static void push_fieldnames (struct stoken);
111
112 static struct expression *copy_exp (struct expression *, int);
113 static void insert_exp (int, struct expression *);
114
115 %}
116
117 /* Although the yacc "value" of an expression is not used,
118    since the result is stored in the structure being created,
119    other node types do have values.  */
120
121 %union
122   {
123     LONGEST lval;
124     struct {
125       LONGEST val;
126       struct type *type;
127     } typed_val_int;
128     struct {
129       DOUBLEST dval;
130       struct type *type;
131     } typed_val_float;
132     struct symbol *sym;
133     struct type *tval;
134     struct stoken sval;
135     struct ttype tsym;
136     struct symtoken ssym;
137     struct block *bval;
138     enum exp_opcode opcode;
139     struct internalvar *ivar;
140     int *ivec;
141   }
142
143 %{
144 /* YYSTYPE gets defined by %union */
145 static int parse_number (char *, int, int, YYSTYPE *);
146 %}
147
148 %type <lval> rcurly Dims Dims_opt
149 %type <tval> ClassOrInterfaceType ClassType /* ReferenceType Type ArrayType */
150 %type <tval> IntegralType FloatingPointType NumericType PrimitiveType ArrayType PrimitiveOrArrayType
151
152 %token <typed_val_int> INTEGER_LITERAL
153 %token <typed_val_float> FLOATING_POINT_LITERAL
154
155 %token <sval> IDENTIFIER
156 %token <sval> STRING_LITERAL
157 %token <lval> BOOLEAN_LITERAL
158 %token <tsym> TYPENAME
159 %type <sval> Name SimpleName QualifiedName ForcedName
160
161 /* A NAME_OR_INT is a symbol which is not known in the symbol table,
162    but which would parse as a valid number in the current input radix.
163    E.g. "c" when input_radix==16.  Depending on the parse, it will be
164    turned into a name or into a number.  */
165
166 %token <sval> NAME_OR_INT 
167
168 %token ERROR
169
170 /* Special type cases, put in to allow the parser to distinguish different
171    legal basetypes.  */
172 %token LONG SHORT BYTE INT CHAR BOOLEAN DOUBLE FLOAT
173
174 %token VARIABLE
175
176 %token <opcode> ASSIGN_MODIFY
177
178 %token THIS SUPER NEW
179
180 %left ','
181 %right '=' ASSIGN_MODIFY
182 %right '?'
183 %left OROR
184 %left ANDAND
185 %left '|'
186 %left '^'
187 %left '&'
188 %left EQUAL NOTEQUAL
189 %left '<' '>' LEQ GEQ
190 %left LSH RSH
191 %left '+' '-'
192 %left '*' '/' '%'
193 %right INCREMENT DECREMENT
194 %right '.' '[' '('
195
196 \f
197 %%
198
199 start   :       exp1
200         |       type_exp
201         ;
202
203 type_exp:       PrimitiveOrArrayType
204                 {
205                   write_exp_elt_opcode(OP_TYPE);
206                   write_exp_elt_type($1);
207                   write_exp_elt_opcode(OP_TYPE);
208                 }
209         ;
210
211 PrimitiveOrArrayType:
212                 PrimitiveType
213         |       ArrayType
214         ;
215
216 StringLiteral:
217         STRING_LITERAL
218                 {
219                   write_exp_elt_opcode (OP_STRING);
220                   write_exp_string ($1);
221                   write_exp_elt_opcode (OP_STRING);
222                 }
223 ;
224
225 Literal:
226         INTEGER_LITERAL
227                 { write_exp_elt_opcode (OP_LONG);
228                   write_exp_elt_type ($1.type);
229                   write_exp_elt_longcst ((LONGEST)($1.val));
230                   write_exp_elt_opcode (OP_LONG); }
231 |       NAME_OR_INT
232                 { YYSTYPE val;
233                   parse_number ($1.ptr, $1.length, 0, &val);
234                   write_exp_elt_opcode (OP_LONG);
235                   write_exp_elt_type (val.typed_val_int.type);
236                   write_exp_elt_longcst ((LONGEST)val.typed_val_int.val);
237                   write_exp_elt_opcode (OP_LONG);
238                 }
239 |       FLOATING_POINT_LITERAL
240                 { write_exp_elt_opcode (OP_DOUBLE);
241                   write_exp_elt_type ($1.type);
242                   write_exp_elt_dblcst ($1.dval);
243                   write_exp_elt_opcode (OP_DOUBLE); }
244 |       BOOLEAN_LITERAL
245                 { write_exp_elt_opcode (OP_LONG);
246                   write_exp_elt_type (java_boolean_type);
247                   write_exp_elt_longcst ((LONGEST)$1);
248                   write_exp_elt_opcode (OP_LONG); }
249 |       StringLiteral
250         ;
251
252 /* UNUSED:
253 Type:
254         PrimitiveType
255 |       ReferenceType
256 ;
257 */
258
259 PrimitiveType:
260         NumericType
261 |       BOOLEAN
262                 { $$ = java_boolean_type; }
263 ;
264
265 NumericType:
266         IntegralType
267 |       FloatingPointType
268 ;
269
270 IntegralType:
271         BYTE
272                 { $$ = java_byte_type; }
273 |       SHORT
274                 { $$ = java_short_type; }
275 |       INT
276                 { $$ = java_int_type; }
277 |       LONG
278                 { $$ = java_long_type; }
279 |       CHAR
280                 { $$ = java_char_type; }
281 ;
282
283 FloatingPointType:
284         FLOAT
285                 { $$ = java_float_type; }
286 |       DOUBLE
287                 { $$ = java_double_type; }
288 ;
289
290 /* UNUSED:
291 ReferenceType:
292         ClassOrInterfaceType
293 |       ArrayType
294 ;
295 */
296
297 ClassOrInterfaceType:
298         Name
299                 { $$ = java_type_from_name ($1); }
300 ;
301
302 ClassType:
303         ClassOrInterfaceType
304 ;
305
306 ArrayType:
307         PrimitiveType Dims
308                 { $$ = java_array_type ($1, $2); }
309 |       Name Dims
310                 { $$ = java_array_type (java_type_from_name ($1), $2); }
311 ;
312
313 Name:
314         IDENTIFIER
315 |       QualifiedName
316 ;
317
318 ForcedName:
319         SimpleName
320 |       QualifiedName
321 ;
322
323 SimpleName:
324         IDENTIFIER
325 |       NAME_OR_INT
326 ;
327
328 QualifiedName:
329         Name '.' SimpleName
330                 { $$.length = $1.length + $3.length + 1;
331                   if ($1.ptr + $1.length + 1 == $3.ptr
332                       && $1.ptr[$1.length] == '.')
333                     $$.ptr = $1.ptr;  /* Optimization. */
334                   else
335                     {
336                       $$.ptr = (char *) malloc ($$.length + 1);
337                       make_cleanup (free, $$.ptr);
338                       sprintf ($$.ptr, "%.*s.%.*s",
339                                $1.length, $1.ptr, $3.length, $3.ptr);
340                 } }
341 ;
342
343 /*
344 type_exp:       type
345                         { write_exp_elt_opcode(OP_TYPE);
346                           write_exp_elt_type($1);
347                           write_exp_elt_opcode(OP_TYPE);}
348         ;
349         */
350
351 /* Expressions, including the comma operator.  */
352 exp1    :       Expression
353         |       exp1 ',' Expression
354                         { write_exp_elt_opcode (BINOP_COMMA); }
355         ;
356
357 Primary:
358         PrimaryNoNewArray
359 |       ArrayCreationExpression
360 ;
361
362 PrimaryNoNewArray:
363         Literal
364 |       THIS
365                 { write_exp_elt_opcode (OP_THIS);
366                   write_exp_elt_opcode (OP_THIS); }
367 |       '(' Expression ')'
368 |       ClassInstanceCreationExpression
369 |       FieldAccess
370 |       MethodInvocation
371 |       ArrayAccess
372 |       lcurly ArgumentList rcurly
373                 { write_exp_elt_opcode (OP_ARRAY);
374                   write_exp_elt_longcst ((LONGEST) 0);
375                   write_exp_elt_longcst ((LONGEST) $3);
376                   write_exp_elt_opcode (OP_ARRAY); }
377 ;
378
379 lcurly:
380         '{'
381                 { start_arglist (); }
382 ;
383
384 rcurly:
385         '}'
386                 { $$ = end_arglist () - 1; }
387 ;
388
389 ClassInstanceCreationExpression:
390         NEW ClassType '(' ArgumentList_opt ')'
391                 { error ("FIXME - ClassInstanceCreationExpression"); }
392 ;
393
394 ArgumentList:
395         Expression
396                 { arglist_len = 1; }
397 |       ArgumentList ',' Expression
398                 { arglist_len++; }
399 ;
400
401 ArgumentList_opt:
402         /* EMPTY */
403                 { arglist_len = 0; }
404 | ArgumentList
405 ;
406
407 ArrayCreationExpression:
408         NEW PrimitiveType DimExprs Dims_opt
409                 { error ("FIXME - ArrayCreatiionExpression"); }
410 |       NEW ClassOrInterfaceType DimExprs Dims_opt
411                 { error ("FIXME - ArrayCreatiionExpression"); }
412 ;
413
414 DimExprs:
415         DimExpr
416 |       DimExprs DimExpr
417 ;
418
419 DimExpr:
420         '[' Expression ']'
421 ;
422
423 Dims:
424         '[' ']'
425                 { $$ = 1; }
426 |       Dims '[' ']'
427         { $$ = $1 + 1; }
428 ;
429
430 Dims_opt:
431         Dims
432 |       /* EMPTY */
433                 { $$ = 0; }
434 ;
435
436 FieldAccess:
437         Primary '.' SimpleName
438                 { push_fieldnames ($3); }
439 |       VARIABLE '.' SimpleName
440                 { push_fieldnames ($3); }
441 /*|     SUPER '.' SimpleName { FIXME } */
442 ;
443
444 MethodInvocation:
445         Name '(' ArgumentList_opt ')'
446                 { error ("method invocation not implemented"); }
447 |       Primary '.' SimpleName '(' ArgumentList_opt ')'
448                 { error ("method invocation not implemented"); }
449 |       SUPER '.' SimpleName '(' ArgumentList_opt ')'
450                 { error ("method invocation not implemented"); }
451 ;
452
453 ArrayAccess:
454         Name '[' Expression ']'
455                 {
456                   /* Emit code for the Name now, then exchange it in the
457                      expout array with the Expression's code.  We could
458                      introduce a OP_SWAP code or a reversed version of
459                      BINOP_SUBSCRIPT, but that makes the rest of GDB pay
460                      for our parsing kludges.  */
461                   struct expression *name_expr;
462
463                   push_expression_name ($1);
464                   name_expr = copy_exp (expout, expout_ptr);
465                   expout_ptr -= name_expr->nelts;
466                   insert_exp (expout_ptr-length_of_subexp (expout, expout_ptr),
467                               name_expr);
468                   free (name_expr);
469                   write_exp_elt_opcode (BINOP_SUBSCRIPT);
470                 }
471 |       VARIABLE '[' Expression ']'
472                 { write_exp_elt_opcode (BINOP_SUBSCRIPT); }
473 |       PrimaryNoNewArray '[' Expression ']'
474                 { write_exp_elt_opcode (BINOP_SUBSCRIPT); }
475 ;
476
477 PostfixExpression:
478         Primary
479 |       Name
480                 { push_expression_name ($1); }
481 |       VARIABLE
482                 /* Already written by write_dollar_variable. */
483 |       PostIncrementExpression
484 |       PostDecrementExpression
485 ;
486
487 PostIncrementExpression:
488         PostfixExpression INCREMENT
489                 { write_exp_elt_opcode (UNOP_POSTINCREMENT); }
490 ;
491
492 PostDecrementExpression:
493         PostfixExpression DECREMENT
494                 { write_exp_elt_opcode (UNOP_POSTDECREMENT); }
495 ;
496
497 UnaryExpression:
498         PreIncrementExpression
499 |       PreDecrementExpression
500 |       '+' UnaryExpression
501 |       '-' UnaryExpression
502                 { write_exp_elt_opcode (UNOP_NEG); }
503 |       '*' UnaryExpression 
504                 { write_exp_elt_opcode (UNOP_IND); } /*FIXME not in Java  */
505 |       UnaryExpressionNotPlusMinus
506 ;
507
508 PreIncrementExpression:
509         INCREMENT UnaryExpression
510                 { write_exp_elt_opcode (UNOP_PREINCREMENT); }
511 ;
512
513 PreDecrementExpression:
514         DECREMENT UnaryExpression
515                 { write_exp_elt_opcode (UNOP_PREDECREMENT); }
516 ;
517
518 UnaryExpressionNotPlusMinus:
519         PostfixExpression
520 |       '~' UnaryExpression
521                 { write_exp_elt_opcode (UNOP_COMPLEMENT); }
522 |       '!' UnaryExpression
523                 { write_exp_elt_opcode (UNOP_LOGICAL_NOT); }
524 |       CastExpression
525         ;
526
527 CastExpression:
528         '(' PrimitiveType Dims_opt ')' UnaryExpression
529                 { write_exp_elt_opcode (UNOP_CAST);
530                   write_exp_elt_type (java_array_type ($2, $3));
531                   write_exp_elt_opcode (UNOP_CAST); }
532 |       '(' Expression ')' UnaryExpressionNotPlusMinus
533                 {
534                   int exp_size = expout_ptr;
535                   int last_exp_size = length_of_subexp(expout, expout_ptr);
536                   struct type *type;
537                   int i;
538                   int base = expout_ptr - last_exp_size - 3;
539                   if (base < 0 || expout->elts[base+2].opcode != OP_TYPE)
540                     error ("invalid cast expression");
541                   type = expout->elts[base+1].type;
542                   /* Remove the 'Expression' and slide the
543                      UnaryExpressionNotPlusMinus down to replace it. */
544                   for (i = 0;  i < last_exp_size;  i++)
545                     expout->elts[base + i] = expout->elts[base + i + 3];
546                   expout_ptr -= 3;
547                   if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
548                     type = lookup_pointer_type (type);
549                   write_exp_elt_opcode (UNOP_CAST);
550                   write_exp_elt_type (type);
551                   write_exp_elt_opcode (UNOP_CAST);
552                 }
553 |       '(' Name Dims ')' UnaryExpressionNotPlusMinus
554                 { write_exp_elt_opcode (UNOP_CAST);
555                   write_exp_elt_type (java_array_type (java_type_from_name ($2), $3));
556                   write_exp_elt_opcode (UNOP_CAST); }
557 ;
558
559
560 MultiplicativeExpression:
561         UnaryExpression
562 |       MultiplicativeExpression '*' UnaryExpression
563                 { write_exp_elt_opcode (BINOP_MUL); }
564 |       MultiplicativeExpression '/' UnaryExpression
565                 { write_exp_elt_opcode (BINOP_DIV); }
566 |       MultiplicativeExpression '%' UnaryExpression
567                 { write_exp_elt_opcode (BINOP_REM); }
568 ;
569
570 AdditiveExpression:
571         MultiplicativeExpression
572 |       AdditiveExpression '+' MultiplicativeExpression
573                 { write_exp_elt_opcode (BINOP_ADD); }
574 |       AdditiveExpression '-' MultiplicativeExpression
575                 { write_exp_elt_opcode (BINOP_SUB); }
576 ;
577
578 ShiftExpression:
579         AdditiveExpression
580 |       ShiftExpression LSH AdditiveExpression
581                 { write_exp_elt_opcode (BINOP_LSH); }
582 |       ShiftExpression RSH AdditiveExpression
583                 { write_exp_elt_opcode (BINOP_RSH); }
584 /* |    ShiftExpression >>> AdditiveExpression { FIXME } */
585 ;
586
587 RelationalExpression:
588         ShiftExpression
589 |       RelationalExpression '<' ShiftExpression
590                 { write_exp_elt_opcode (BINOP_LESS); }
591 |       RelationalExpression '>' ShiftExpression
592                 { write_exp_elt_opcode (BINOP_GTR); }
593 |       RelationalExpression LEQ ShiftExpression
594                 { write_exp_elt_opcode (BINOP_LEQ); }
595 |       RelationalExpression GEQ ShiftExpression
596                 { write_exp_elt_opcode (BINOP_GEQ); }
597 /* | RelationalExpresion INSTANCEOF ReferenceType { FIXME } */
598 ;
599
600 EqualityExpression:
601         RelationalExpression
602 |       EqualityExpression EQUAL RelationalExpression
603                 { write_exp_elt_opcode (BINOP_EQUAL); }
604 |       EqualityExpression NOTEQUAL RelationalExpression
605                 { write_exp_elt_opcode (BINOP_NOTEQUAL); }
606 ;
607
608 AndExpression:
609         EqualityExpression
610 |       AndExpression '&' EqualityExpression
611                 { write_exp_elt_opcode (BINOP_BITWISE_AND); }
612 ;
613
614 ExclusiveOrExpression:
615         AndExpression
616 |       ExclusiveOrExpression '^' AndExpression
617                 { write_exp_elt_opcode (BINOP_BITWISE_XOR); }
618 ;
619 InclusiveOrExpression:
620         ExclusiveOrExpression
621 |       InclusiveOrExpression '|' ExclusiveOrExpression
622                 { write_exp_elt_opcode (BINOP_BITWISE_IOR); }
623 ;
624
625 ConditionalAndExpression:
626         InclusiveOrExpression
627 |       ConditionalAndExpression ANDAND InclusiveOrExpression
628                 { write_exp_elt_opcode (BINOP_LOGICAL_AND); }
629 ;
630
631 ConditionalOrExpression:
632         ConditionalAndExpression
633 |       ConditionalOrExpression OROR ConditionalAndExpression
634                 { write_exp_elt_opcode (BINOP_LOGICAL_OR); }
635 ;
636
637 ConditionalExpression:
638         ConditionalOrExpression
639 |       ConditionalOrExpression '?' Expression ':' ConditionalExpression
640                 { write_exp_elt_opcode (TERNOP_COND); }
641 ;
642
643 AssignmentExpression:
644         ConditionalExpression
645 |       Assignment
646 ;
647                           
648 Assignment:
649         LeftHandSide '=' ConditionalExpression
650                 { write_exp_elt_opcode (BINOP_ASSIGN); }
651 |       LeftHandSide ASSIGN_MODIFY ConditionalExpression
652                 { write_exp_elt_opcode (BINOP_ASSIGN_MODIFY);
653                   write_exp_elt_opcode ($2);
654                   write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); }
655 ;
656
657 LeftHandSide:
658         ForcedName
659                 { push_expression_name ($1); }
660 |       VARIABLE
661                 /* Already written by write_dollar_variable. */
662 |       FieldAccess
663 |       ArrayAccess
664 ;
665
666
667 Expression:
668         AssignmentExpression
669 ;
670
671 %%
672 /* Take care of parsing a number (anything that starts with a digit).
673    Set yylval and return the token type; update lexptr.
674    LEN is the number of characters in it.  */
675
676 /*** Needs some error checking for the float case ***/
677
678 static int
679 parse_number (p, len, parsed_float, putithere)
680      register char *p;
681      register int len;
682      int parsed_float;
683      YYSTYPE *putithere;
684 {
685   register ULONGEST n = 0;
686   ULONGEST limit, limit_div_base;
687
688   register int c;
689   register int base = input_radix;
690
691   struct type *type;
692
693   if (parsed_float)
694     {
695       /* It's a float since it contains a point or an exponent.  */
696       char c;
697       int num = 0;      /* number of tokens scanned by scanf */
698       char saved_char = p[len];
699
700       p[len] = 0;       /* null-terminate the token */
701       if (sizeof (putithere->typed_val_float.dval) <= sizeof (float))
702         num = sscanf (p, "%g%c", (float *) &putithere->typed_val_float.dval, &c);
703       else if (sizeof (putithere->typed_val_float.dval) <= sizeof (double))
704         num = sscanf (p, "%lg%c", (double *) &putithere->typed_val_float.dval, &c);
705       else
706         {
707 #ifdef SCANF_HAS_LONG_DOUBLE
708           num = sscanf (p, "%Lg%c", &putithere->typed_val_float.dval, &c);
709 #else
710           /* Scan it into a double, then assign it to the long double.
711              This at least wins with values representable in the range
712              of doubles. */
713           double temp;
714           num = sscanf (p, "%lg%c", &temp, &c);
715           putithere->typed_val_float.dval = temp;
716 #endif
717         }
718       p[len] = saved_char;      /* restore the input stream */
719       if (num != 1)             /* check scanf found ONLY a float ... */
720         return ERROR;
721       /* See if it has `f' or `d' suffix (float or double).  */
722
723       c = tolower (p[len - 1]);
724
725       if (c == 'f' || c == 'F')
726         putithere->typed_val_float.type = builtin_type_float;
727       else if (isdigit (c) || c == '.' || c == 'd' || c == 'D')
728         putithere->typed_val_float.type = builtin_type_double;
729       else
730         return ERROR;
731
732       return FLOATING_POINT_LITERAL;
733     }
734
735   /* Handle base-switching prefixes 0x, 0t, 0d, 0 */
736   if (p[0] == '0')
737     switch (p[1])
738       {
739       case 'x':
740       case 'X':
741         if (len >= 3)
742           {
743             p += 2;
744             base = 16;
745             len -= 2;
746           }
747         break;
748
749       case 't':
750       case 'T':
751       case 'd':
752       case 'D':
753         if (len >= 3)
754           {
755             p += 2;
756             base = 10;
757             len -= 2;
758           }
759         break;
760
761       default:
762         base = 8;
763         break;
764       }
765
766   c = p[len-1];
767   /* A paranoid calculation of (1<<64)-1. */
768   limit = (ULONGEST)0xffffffff;
769   limit = ((limit << 16) << 16) | limit;
770   if (c == 'l' || c == 'L')
771     {
772       type = java_long_type;
773       len--;
774     }
775   else
776     {
777       type = java_int_type;
778     }
779   limit_div_base = limit / (ULONGEST) base;
780
781   while (--len >= 0)
782     {
783       c = *p++;
784       if (c >= '0' && c <= '9')
785         c -= '0';
786       else if (c >= 'A' && c <= 'Z')
787         c -= 'A' - 10;
788       else if (c >= 'a' && c <= 'z')
789         c -= 'a' - 10;
790       else
791         return ERROR;   /* Char not a digit */
792       if (c >= base)
793         return ERROR;
794       if (n > limit_div_base
795           || (n *= base) > limit - c)
796         error ("Numeric constant too large.");
797       n += c;
798         }
799
800   if (type == java_int_type && n > (ULONGEST)0xffffffff)
801     type = java_long_type;
802
803   putithere->typed_val_int.val = n;
804   putithere->typed_val_int.type = type;
805
806   return INTEGER_LITERAL;
807 }
808
809 struct token
810 {
811   char *operator;
812   int token;
813   enum exp_opcode opcode;
814 };
815
816 static const struct token tokentab3[] =
817   {
818     {">>=", ASSIGN_MODIFY, BINOP_RSH},
819     {"<<=", ASSIGN_MODIFY, BINOP_LSH}
820   };
821
822 static const struct token tokentab2[] =
823   {
824     {"+=", ASSIGN_MODIFY, BINOP_ADD},
825     {"-=", ASSIGN_MODIFY, BINOP_SUB},
826     {"*=", ASSIGN_MODIFY, BINOP_MUL},
827     {"/=", ASSIGN_MODIFY, BINOP_DIV},
828     {"%=", ASSIGN_MODIFY, BINOP_REM},
829     {"|=", ASSIGN_MODIFY, BINOP_BITWISE_IOR},
830     {"&=", ASSIGN_MODIFY, BINOP_BITWISE_AND},
831     {"^=", ASSIGN_MODIFY, BINOP_BITWISE_XOR},
832     {"++", INCREMENT, BINOP_END},
833     {"--", DECREMENT, BINOP_END},
834     {"&&", ANDAND, BINOP_END},
835     {"||", OROR, BINOP_END},
836     {"<<", LSH, BINOP_END},
837     {">>", RSH, BINOP_END},
838     {"==", EQUAL, BINOP_END},
839     {"!=", NOTEQUAL, BINOP_END},
840     {"<=", LEQ, BINOP_END},
841     {">=", GEQ, BINOP_END}
842   };
843
844 /* Read one token, getting characters through lexptr.  */
845
846 static int
847 yylex ()
848 {
849   int c;
850   int namelen;
851   unsigned int i;
852   char *tokstart;
853   char *tokptr;
854   int tempbufindex;
855   static char *tempbuf;
856   static int tempbufsize;
857   
858  retry:
859
860   tokstart = lexptr;
861   /* See if it is a special token of length 3.  */
862   for (i = 0; i < sizeof tokentab3 / sizeof tokentab3[0]; i++)
863     if (STREQN (tokstart, tokentab3[i].operator, 3))
864       {
865         lexptr += 3;
866         yylval.opcode = tokentab3[i].opcode;
867         return tokentab3[i].token;
868       }
869
870   /* See if it is a special token of length 2.  */
871   for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++)
872     if (STREQN (tokstart, tokentab2[i].operator, 2))
873       {
874         lexptr += 2;
875         yylval.opcode = tokentab2[i].opcode;
876         return tokentab2[i].token;
877       }
878
879   switch (c = *tokstart)
880     {
881     case 0:
882       return 0;
883
884     case ' ':
885     case '\t':
886     case '\n':
887       lexptr++;
888       goto retry;
889
890     case '\'':
891       /* We either have a character constant ('0' or '\177' for example)
892          or we have a quoted symbol reference ('foo(int,int)' in C++
893          for example). */
894       lexptr++;
895       c = *lexptr++;
896       if (c == '\\')
897         c = parse_escape (&lexptr);
898       else if (c == '\'')
899         error ("Empty character constant.");
900
901       yylval.typed_val_int.val = c;
902       yylval.typed_val_int.type = java_char_type;
903
904       c = *lexptr++;
905       if (c != '\'')
906         {
907           namelen = skip_quoted (tokstart) - tokstart;
908           if (namelen > 2)
909             {
910               lexptr = tokstart + namelen;
911               if (lexptr[-1] != '\'')
912                 error ("Unmatched single quote.");
913               namelen -= 2;
914               tokstart++;
915               goto tryname;
916             }
917           error ("Invalid character constant.");
918         }
919       return INTEGER_LITERAL;
920
921     case '(':
922       paren_depth++;
923       lexptr++;
924       return c;
925
926     case ')':
927       if (paren_depth == 0)
928         return 0;
929       paren_depth--;
930       lexptr++;
931       return c;
932
933     case ',':
934       if (comma_terminates && paren_depth == 0)
935         return 0;
936       lexptr++;
937       return c;
938
939     case '.':
940       /* Might be a floating point number.  */
941       if (lexptr[1] < '0' || lexptr[1] > '9')
942         goto symbol;            /* Nope, must be a symbol. */
943       /* FALL THRU into number case.  */
944
945     case '0':
946     case '1':
947     case '2':
948     case '3':
949     case '4':
950     case '5':
951     case '6':
952     case '7':
953     case '8':
954     case '9':
955       {
956         /* It's a number.  */
957         int got_dot = 0, got_e = 0, toktype;
958         register char *p = tokstart;
959         int hex = input_radix > 10;
960
961         if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
962           {
963             p += 2;
964             hex = 1;
965           }
966         else if (c == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D'))
967           {
968             p += 2;
969             hex = 0;
970           }
971
972         for (;; ++p)
973           {
974             /* This test includes !hex because 'e' is a valid hex digit
975                and thus does not indicate a floating point number when
976                the radix is hex.  */
977             if (!hex && !got_e && (*p == 'e' || *p == 'E'))
978               got_dot = got_e = 1;
979             /* This test does not include !hex, because a '.' always indicates
980                a decimal floating point number regardless of the radix.  */
981             else if (!got_dot && *p == '.')
982               got_dot = 1;
983             else if (got_e && (p[-1] == 'e' || p[-1] == 'E')
984                      && (*p == '-' || *p == '+'))
985               /* This is the sign of the exponent, not the end of the
986                  number.  */
987               continue;
988             /* We will take any letters or digits.  parse_number will
989                complain if past the radix, or if L or U are not final.  */
990             else if ((*p < '0' || *p > '9')
991                      && ((*p < 'a' || *p > 'z')
992                                   && (*p < 'A' || *p > 'Z')))
993               break;
994           }
995         toktype = parse_number (tokstart, p - tokstart, got_dot|got_e, &yylval);
996         if (toktype == ERROR)
997           {
998             char *err_copy = (char *) alloca (p - tokstart + 1);
999
1000             memcpy (err_copy, tokstart, p - tokstart);
1001             err_copy[p - tokstart] = 0;
1002             error ("Invalid number \"%s\".", err_copy);
1003           }
1004         lexptr = p;
1005         return toktype;
1006       }
1007
1008     case '+':
1009     case '-':
1010     case '*':
1011     case '/':
1012     case '%':
1013     case '|':
1014     case '&':
1015     case '^':
1016     case '~':
1017     case '!':
1018     case '<':
1019     case '>':
1020     case '[':
1021     case ']':
1022     case '?':
1023     case ':':
1024     case '=':
1025     case '{':
1026     case '}':
1027     symbol:
1028       lexptr++;
1029       return c;
1030
1031     case '"':
1032
1033       /* Build the gdb internal form of the input string in tempbuf,
1034          translating any standard C escape forms seen.  Note that the
1035          buffer is null byte terminated *only* for the convenience of
1036          debugging gdb itself and printing the buffer contents when
1037          the buffer contains no embedded nulls.  Gdb does not depend
1038          upon the buffer being null byte terminated, it uses the length
1039          string instead.  This allows gdb to handle C strings (as well
1040          as strings in other languages) with embedded null bytes */
1041
1042       tokptr = ++tokstart;
1043       tempbufindex = 0;
1044
1045       do {
1046         /* Grow the static temp buffer if necessary, including allocating
1047            the first one on demand. */
1048         if (tempbufindex + 1 >= tempbufsize)
1049           {
1050             tempbuf = (char *) realloc (tempbuf, tempbufsize += 64);
1051           }
1052         switch (*tokptr)
1053           {
1054           case '\0':
1055           case '"':
1056             /* Do nothing, loop will terminate. */
1057             break;
1058           case '\\':
1059             tokptr++;
1060             c = parse_escape (&tokptr);
1061             if (c == -1)
1062               {
1063                 continue;
1064               }
1065             tempbuf[tempbufindex++] = c;
1066             break;
1067           default:
1068             tempbuf[tempbufindex++] = *tokptr++;
1069             break;
1070           }
1071       } while ((*tokptr != '"') && (*tokptr != '\0'));
1072       if (*tokptr++ != '"')
1073         {
1074           error ("Unterminated string in expression.");
1075         }
1076       tempbuf[tempbufindex] = '\0';     /* See note above */
1077       yylval.sval.ptr = tempbuf;
1078       yylval.sval.length = tempbufindex;
1079       lexptr = tokptr;
1080       return (STRING_LITERAL);
1081     }
1082
1083   if (!(c == '_' || c == '$'
1084         || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
1085     /* We must have come across a bad character (e.g. ';').  */
1086     error ("Invalid character '%c' in expression.", c);
1087
1088   /* It's a name.  See how long it is.  */
1089   namelen = 0;
1090   for (c = tokstart[namelen];
1091        (c == '_'
1092         || c == '$'
1093         || (c >= '0' && c <= '9')
1094         || (c >= 'a' && c <= 'z')
1095         || (c >= 'A' && c <= 'Z')
1096         || c == '<');
1097        )
1098     {
1099       if (c == '<')
1100         {
1101           int i = namelen;
1102           while (tokstart[++i] && tokstart[i] != '>');
1103           if (tokstart[i] == '>')
1104             namelen = i;
1105         }
1106        c = tokstart[++namelen];
1107      }
1108
1109   /* The token "if" terminates the expression and is NOT 
1110      removed from the input stream.  */
1111   if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f')
1112     {
1113       return 0;
1114     }
1115
1116   lexptr += namelen;
1117
1118   tryname:
1119
1120   /* Catch specific keywords.  Should be done with a data structure.  */
1121   switch (namelen)
1122     {
1123     case 7:
1124       if (STREQN (tokstart, "boolean", 7))
1125         return BOOLEAN;
1126       break;
1127     case 6:
1128       if (STREQN (tokstart, "double", 6))      
1129         return DOUBLE;
1130       break;
1131     case 5:
1132       if (STREQN (tokstart, "short", 5))
1133         return SHORT;
1134       if (STREQN (tokstart, "false", 5))
1135         {
1136           yylval.lval = 0;
1137           return BOOLEAN_LITERAL;
1138         }
1139       if (STREQN (tokstart, "super", 5))
1140         return SUPER;
1141       if (STREQN (tokstart, "float", 5))
1142         return FLOAT;
1143       break;
1144     case 4:
1145       if (STREQN (tokstart, "long", 4))
1146         return LONG;
1147       if (STREQN (tokstart, "byte", 4))
1148         return BYTE;
1149       if (STREQN (tokstart, "char", 4))
1150         return CHAR;
1151       if (STREQN (tokstart, "true", 4))
1152         {
1153           yylval.lval = 1;
1154           return BOOLEAN_LITERAL;
1155         }
1156       if (current_language->la_language == language_cplus
1157           && STREQN (tokstart, "this", 4))
1158         {
1159           static const char this_name[] =
1160                                  { CPLUS_MARKER, 't', 'h', 'i', 's', '\0' };
1161
1162           if (lookup_symbol (this_name, expression_context_block,
1163                              VAR_NAMESPACE, (int *) NULL,
1164                              (struct symtab **) NULL))
1165             return THIS;
1166         }
1167       break;
1168     case 3:
1169       if (STREQN (tokstart, "int", 3))
1170         return INT;
1171       if (STREQN (tokstart, "new", 3))
1172         return NEW;
1173       break;
1174     default:
1175       break;
1176     }
1177
1178   yylval.sval.ptr = tokstart;
1179   yylval.sval.length = namelen;
1180
1181   if (*tokstart == '$')
1182     {
1183       write_dollar_variable (yylval.sval);
1184       return VARIABLE;
1185     }
1186
1187   /* Input names that aren't symbols but ARE valid hex numbers,
1188      when the input radix permits them, can be names or numbers
1189      depending on the parse.  Note we support radixes > 16 here.  */
1190   if (((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10) ||
1191        (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
1192     {
1193       YYSTYPE newlval;  /* Its value is ignored.  */
1194       int hextype = parse_number (tokstart, namelen, 0, &newlval);
1195       if (hextype == INTEGER_LITERAL)
1196         return NAME_OR_INT;
1197     }
1198   return IDENTIFIER;
1199 }
1200
1201 void
1202 yyerror (msg)
1203      char *msg;
1204 {
1205   error ("A %s in expression, near `%s'.", (msg ? msg : "error"), lexptr);
1206 }
1207
1208 static struct type *
1209 java_type_from_name (name)
1210      struct stoken name;
1211  
1212 {
1213   char *tmp = copy_name (name);
1214   struct type *typ = java_lookup_class (tmp);
1215   if (typ == NULL || TYPE_CODE (typ) != TYPE_CODE_STRUCT)
1216     error ("No class named %s.", tmp);
1217   return typ;
1218 }
1219
1220 /* If NAME is a valid variable name in this scope, push it and return 1.
1221    Otherwise, return 0. */
1222
1223 static int
1224 push_variable (name)
1225      struct stoken name;
1226  
1227 {
1228   char *tmp = copy_name (name);
1229   int is_a_field_of_this = 0;
1230   struct symbol *sym;
1231   sym = lookup_symbol (tmp, expression_context_block, VAR_NAMESPACE,
1232                        &is_a_field_of_this, (struct symtab **) NULL);
1233   if (sym && SYMBOL_CLASS (sym) != LOC_TYPEDEF)
1234     {
1235       if (symbol_read_needs_frame (sym))
1236         {
1237           if (innermost_block == 0 ||
1238               contained_in (block_found, innermost_block))
1239             innermost_block = block_found;
1240         }
1241
1242       write_exp_elt_opcode (OP_VAR_VALUE);
1243       /* We want to use the selected frame, not another more inner frame
1244          which happens to be in the same block.  */
1245       write_exp_elt_block (NULL);
1246       write_exp_elt_sym (sym);
1247       write_exp_elt_opcode (OP_VAR_VALUE);
1248       return 1;
1249     }
1250   if (is_a_field_of_this)
1251     {
1252       /* it hangs off of `this'.  Must not inadvertently convert from a
1253          method call to data ref.  */
1254       if (innermost_block == 0 || 
1255           contained_in (block_found, innermost_block))
1256         innermost_block = block_found;
1257       write_exp_elt_opcode (OP_THIS);
1258       write_exp_elt_opcode (OP_THIS);
1259       write_exp_elt_opcode (STRUCTOP_PTR);
1260       write_exp_string (name);
1261       write_exp_elt_opcode (STRUCTOP_PTR);
1262       return 1;
1263     }
1264   return 0;
1265 }
1266
1267 /* Assuming a reference expression has been pushed, emit the
1268    STRUCTOP_STRUCT ops to access the field named NAME.  If NAME is a
1269    qualified name (has '.'), generate a field access for each part. */
1270
1271 static void
1272 push_fieldnames (name)
1273      struct stoken name;
1274 {
1275   int i;
1276   struct stoken token;
1277   token.ptr = name.ptr;
1278   for (i = 0;  ;  i++)
1279     {
1280       if (i == name.length || name.ptr[i] == '.')
1281         {
1282           /* token.ptr is start of current field name. */
1283           token.length = &name.ptr[i] - token.ptr;
1284           write_exp_elt_opcode (STRUCTOP_STRUCT);
1285           write_exp_string (token);
1286           write_exp_elt_opcode (STRUCTOP_STRUCT);
1287           token.ptr += token.length + 1;
1288         }
1289       if (i >= name.length)
1290         break;
1291     }
1292 }
1293
1294 /* Helper routine for push_expression_name.
1295    Handle a qualified name, where DOT_INDEX is the index of the first '.' */
1296
1297 static void
1298 push_qualified_expression_name (name, dot_index)
1299      struct stoken name;
1300      int dot_index;
1301 {
1302   struct stoken token;
1303   char *tmp;
1304   struct type *typ;
1305
1306   token.ptr = name.ptr;
1307   token.length = dot_index;
1308
1309   if (push_variable (token))
1310     {
1311       token.ptr = name.ptr + dot_index + 1;
1312       token.length = name.length - dot_index - 1;
1313       push_fieldnames (token);
1314       return;
1315     }
1316
1317   token.ptr = name.ptr;
1318   for (;;)
1319     {
1320       token.length = dot_index;
1321       tmp = copy_name (token);
1322       typ = java_lookup_class (tmp);
1323       if (typ != NULL)
1324         {
1325           if (dot_index == name.length)
1326             {
1327               write_exp_elt_opcode(OP_TYPE);
1328               write_exp_elt_type(typ);
1329               write_exp_elt_opcode(OP_TYPE);
1330               return;
1331             }
1332           dot_index++;  /* Skip '.' */
1333           name.ptr += dot_index;
1334           name.length -= dot_index;
1335           dot_index = 0;
1336           while (dot_index < name.length && name.ptr[dot_index] != '.') 
1337             dot_index++;
1338           token.ptr = name.ptr;
1339           token.length = dot_index;
1340           write_exp_elt_opcode (OP_SCOPE);
1341           write_exp_elt_type (typ);
1342           write_exp_string (token);
1343           write_exp_elt_opcode (OP_SCOPE); 
1344           if (dot_index < name.length)
1345             {
1346               dot_index++;
1347               name.ptr += dot_index;
1348               name.length -= dot_index;
1349               push_fieldnames (name);
1350             }
1351           return;
1352         }
1353       else if (dot_index >= name.length)
1354         break;
1355       dot_index++;  /* Skip '.' */
1356       while (dot_index < name.length && name.ptr[dot_index] != '.')
1357         dot_index++;
1358     }
1359   error ("unknown type `%.*s'", name.length, name.ptr);
1360 }
1361
1362 /* Handle Name in an expression (or LHS).
1363    Handle VAR, TYPE, TYPE.FIELD1....FIELDN and VAR.FIELD1....FIELDN. */
1364
1365 static void
1366 push_expression_name (name)
1367      struct stoken name;
1368 {
1369   char *tmp;
1370   struct type *typ;
1371   char *ptr;
1372   int i;
1373
1374   for (i = 0;  i < name.length;  i++)
1375     {
1376       if (name.ptr[i] == '.')
1377         {
1378           /* It's a Qualified Expression Name. */
1379           push_qualified_expression_name (name, i);
1380           return;
1381         }
1382     }
1383
1384   /* It's a Simple Expression Name. */
1385   
1386   if (push_variable (name))
1387     return;
1388   tmp = copy_name (name);
1389   typ = java_lookup_class (tmp);
1390   if (typ != NULL)
1391     {
1392       write_exp_elt_opcode(OP_TYPE);
1393       write_exp_elt_type(typ);
1394       write_exp_elt_opcode(OP_TYPE);
1395     }
1396   else
1397     {
1398       struct minimal_symbol *msymbol;
1399
1400       msymbol = lookup_minimal_symbol (tmp, NULL, NULL);
1401       if (msymbol != NULL)
1402         {
1403           write_exp_msymbol (msymbol,
1404                              lookup_function_type (builtin_type_int),
1405                              builtin_type_int);
1406         }
1407       else if (!have_full_symbols () && !have_partial_symbols ())
1408         error ("No symbol table is loaded.  Use the \"file\" command.");
1409       else
1410         error ("No symbol \"%s\" in current context.", tmp);
1411     }
1412
1413 }
1414
1415
1416 /* The following two routines, copy_exp and insert_exp, aren't specific to
1417    Java, so they could go in parse.c, but their only purpose is to support
1418    the parsing kludges we use in this file, so maybe it's best to isolate
1419    them here.  */
1420
1421 /* Copy the expression whose last element is at index ENDPOS - 1 in EXPR
1422    into a freshly malloc'ed struct expression.  Its language_defn is set
1423    to null.  */
1424 static struct expression *
1425 copy_exp (expr, endpos)
1426      struct expression *expr;
1427      int endpos;
1428 {
1429   int len = length_of_subexp (expr, endpos);
1430   struct expression *new
1431     = (struct expression *) malloc (sizeof (*new) + EXP_ELEM_TO_BYTES (len));
1432   new->nelts = len;
1433   memcpy (new->elts, expr->elts + endpos - len, EXP_ELEM_TO_BYTES (len));
1434   new->language_defn = 0;
1435
1436   return new;
1437 }
1438
1439 /* Insert the expression NEW into the current expression (expout) at POS.  */
1440 static void
1441 insert_exp (pos, new)
1442      int pos;
1443      struct expression *new;
1444 {
1445   int newlen = new->nelts;
1446
1447   /* Grow expout if necessary.  In this function's only use at present,
1448      this should never be necessary.  */
1449   if (expout_ptr + newlen > expout_size)
1450     {
1451       expout_size = max (expout_size * 2, expout_ptr + newlen + 10);
1452       expout = (struct expression *)
1453         realloc ((char *) expout, (sizeof (struct expression)
1454                                     + EXP_ELEM_TO_BYTES (expout_size)));
1455     }
1456
1457   {
1458     int i;
1459
1460     for (i = expout_ptr - 1; i >= pos; i--)
1461       expout->elts[i + newlen] = expout->elts[i];
1462   }
1463   
1464   memcpy (expout->elts + pos, new->elts, EXP_ELEM_TO_BYTES (newlen));
1465   expout_ptr += newlen;
1466 }