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