1 /* YACC parser for Java expressions, for GDB.
2 Copyright 1997, 1998, 1999, 2000
3 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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. */
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.
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. */
41 #include "gdb_string.h"
43 #include "expression.h"
45 #include "parser-defs.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 */
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. */
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
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
79 #define yy_yys java_yys
80 #define yystate java_state
81 #define yytmp java_tmp
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 yyname java_name /* With YYDEBUG defined */
89 #define yyrule java_rule /* With YYDEBUG defined */
90 #define yylhs java_yylhs
91 #define yylen java_yylen
92 #define yydefred java_yydefred
93 #define yydgoto java_yydgoto
94 #define yysindex java_yysindex
95 #define yyrindex java_yyrindex
96 #define yygindex java_yygindex
97 #define yytable java_yytable
98 #define yycheck java_yycheck
101 #define YYDEBUG 1 /* Default to yydebug support */
104 #define YYFPRINTF parser_fprintf
108 static int yylex (void);
110 void yyerror (char *);
112 static struct type *java_type_from_name (struct stoken);
113 static void push_expression_name (struct stoken);
114 static void push_fieldnames (struct stoken);
116 static struct expression *copy_exp (struct expression *, int);
117 static void insert_exp (int, struct expression *);
121 /* Although the yacc "value" of an expression is not used,
122 since the result is stored in the structure being created,
123 other node types do have values. */
140 struct symtoken ssym;
142 enum exp_opcode opcode;
143 struct internalvar *ivar;
148 /* YYSTYPE gets defined by %union */
149 static int parse_number (char *, int, int, YYSTYPE *);
152 %type <lval> rcurly Dims Dims_opt
153 %type <tval> ClassOrInterfaceType ClassType /* ReferenceType Type ArrayType */
154 %type <tval> IntegralType FloatingPointType NumericType PrimitiveType ArrayType PrimitiveOrArrayType
156 %token <typed_val_int> INTEGER_LITERAL
157 %token <typed_val_float> FLOATING_POINT_LITERAL
159 %token <sval> IDENTIFIER
160 %token <sval> STRING_LITERAL
161 %token <lval> BOOLEAN_LITERAL
162 %token <tsym> TYPENAME
163 %type <sval> Name SimpleName QualifiedName ForcedName
165 /* A NAME_OR_INT is a symbol which is not known in the symbol table,
166 but which would parse as a valid number in the current input radix.
167 E.g. "c" when input_radix==16. Depending on the parse, it will be
168 turned into a name or into a number. */
170 %token <sval> NAME_OR_INT
174 /* Special type cases, put in to allow the parser to distinguish different
176 %token LONG SHORT BYTE INT CHAR BOOLEAN DOUBLE FLOAT
180 %token <opcode> ASSIGN_MODIFY
182 %token THIS SUPER NEW
185 %right '=' ASSIGN_MODIFY
193 %left '<' '>' LEQ GEQ
197 %right INCREMENT DECREMENT
207 type_exp: PrimitiveOrArrayType
209 write_exp_elt_opcode(OP_TYPE);
210 write_exp_elt_type($1);
211 write_exp_elt_opcode(OP_TYPE);
215 PrimitiveOrArrayType:
223 write_exp_elt_opcode (OP_STRING);
224 write_exp_string ($1);
225 write_exp_elt_opcode (OP_STRING);
231 { write_exp_elt_opcode (OP_LONG);
232 write_exp_elt_type ($1.type);
233 write_exp_elt_longcst ((LONGEST)($1.val));
234 write_exp_elt_opcode (OP_LONG); }
237 parse_number ($1.ptr, $1.length, 0, &val);
238 write_exp_elt_opcode (OP_LONG);
239 write_exp_elt_type (val.typed_val_int.type);
240 write_exp_elt_longcst ((LONGEST)val.typed_val_int.val);
241 write_exp_elt_opcode (OP_LONG);
243 | FLOATING_POINT_LITERAL
244 { write_exp_elt_opcode (OP_DOUBLE);
245 write_exp_elt_type ($1.type);
246 write_exp_elt_dblcst ($1.dval);
247 write_exp_elt_opcode (OP_DOUBLE); }
249 { write_exp_elt_opcode (OP_LONG);
250 write_exp_elt_type (java_boolean_type);
251 write_exp_elt_longcst ((LONGEST)$1);
252 write_exp_elt_opcode (OP_LONG); }
266 { $$ = java_boolean_type; }
276 { $$ = java_byte_type; }
278 { $$ = java_short_type; }
280 { $$ = java_int_type; }
282 { $$ = java_long_type; }
284 { $$ = java_char_type; }
289 { $$ = java_float_type; }
291 { $$ = java_double_type; }
301 ClassOrInterfaceType:
303 { $$ = java_type_from_name ($1); }
312 { $$ = java_array_type ($1, $2); }
314 { $$ = java_array_type (java_type_from_name ($1), $2); }
334 { $$.length = $1.length + $3.length + 1;
335 if ($1.ptr + $1.length + 1 == $3.ptr
336 && $1.ptr[$1.length] == '.')
337 $$.ptr = $1.ptr; /* Optimization. */
340 $$.ptr = (char *) malloc ($$.length + 1);
341 make_cleanup (free, $$.ptr);
342 sprintf ($$.ptr, "%.*s.%.*s",
343 $1.length, $1.ptr, $3.length, $3.ptr);
349 { write_exp_elt_opcode(OP_TYPE);
350 write_exp_elt_type($1);
351 write_exp_elt_opcode(OP_TYPE);}
355 /* Expressions, including the comma operator. */
357 | exp1 ',' Expression
358 { write_exp_elt_opcode (BINOP_COMMA); }
363 | ArrayCreationExpression
369 { write_exp_elt_opcode (OP_THIS);
370 write_exp_elt_opcode (OP_THIS); }
372 | ClassInstanceCreationExpression
376 | lcurly ArgumentList rcurly
377 { write_exp_elt_opcode (OP_ARRAY);
378 write_exp_elt_longcst ((LONGEST) 0);
379 write_exp_elt_longcst ((LONGEST) $3);
380 write_exp_elt_opcode (OP_ARRAY); }
385 { start_arglist (); }
390 { $$ = end_arglist () - 1; }
393 ClassInstanceCreationExpression:
394 NEW ClassType '(' ArgumentList_opt ')'
395 { internal_error (__FILE__, __LINE__,
396 _("FIXME - ClassInstanceCreationExpression")); }
402 | ArgumentList ',' Expression
412 ArrayCreationExpression:
413 NEW PrimitiveType DimExprs Dims_opt
414 { internal_error (__FILE__, __LINE__,
415 _("FIXME - ArrayCreationExpression")); }
416 | NEW ClassOrInterfaceType DimExprs Dims_opt
417 { internal_error (__FILE__, __LINE__,
418 _("FIXME - ArrayCreationExpression")); }
444 Primary '.' SimpleName
445 { push_fieldnames ($3); }
446 | VARIABLE '.' SimpleName
447 { push_fieldnames ($3); }
448 /*| SUPER '.' SimpleName { FIXME } */
452 Name '(' ArgumentList_opt ')'
453 { error (_("Method invocation not implemented")); }
454 | Primary '.' SimpleName '(' ArgumentList_opt ')'
455 { error (_("Method invocation not implemented")); }
456 | SUPER '.' SimpleName '(' ArgumentList_opt ')'
457 { error (_("Method invocation not implemented")); }
461 Name '[' Expression ']'
463 /* Emit code for the Name now, then exchange it in the
464 expout array with the Expression's code. We could
465 introduce a OP_SWAP code or a reversed version of
466 BINOP_SUBSCRIPT, but that makes the rest of GDB pay
467 for our parsing kludges. */
468 struct expression *name_expr;
470 push_expression_name ($1);
471 name_expr = copy_exp (expout, expout_ptr);
472 expout_ptr -= name_expr->nelts;
473 insert_exp (expout_ptr-length_of_subexp (expout, expout_ptr),
476 write_exp_elt_opcode (BINOP_SUBSCRIPT);
478 | VARIABLE '[' Expression ']'
479 { write_exp_elt_opcode (BINOP_SUBSCRIPT); }
480 | PrimaryNoNewArray '[' Expression ']'
481 { write_exp_elt_opcode (BINOP_SUBSCRIPT); }
487 { push_expression_name ($1); }
489 /* Already written by write_dollar_variable. */
490 | PostIncrementExpression
491 | PostDecrementExpression
494 PostIncrementExpression:
495 PostfixExpression INCREMENT
496 { write_exp_elt_opcode (UNOP_POSTINCREMENT); }
499 PostDecrementExpression:
500 PostfixExpression DECREMENT
501 { write_exp_elt_opcode (UNOP_POSTDECREMENT); }
505 PreIncrementExpression
506 | PreDecrementExpression
507 | '+' UnaryExpression
508 | '-' UnaryExpression
509 { write_exp_elt_opcode (UNOP_NEG); }
510 | '*' UnaryExpression
511 { write_exp_elt_opcode (UNOP_IND); } /*FIXME not in Java */
512 | UnaryExpressionNotPlusMinus
515 PreIncrementExpression:
516 INCREMENT UnaryExpression
517 { write_exp_elt_opcode (UNOP_PREINCREMENT); }
520 PreDecrementExpression:
521 DECREMENT UnaryExpression
522 { write_exp_elt_opcode (UNOP_PREDECREMENT); }
525 UnaryExpressionNotPlusMinus:
527 | '~' UnaryExpression
528 { write_exp_elt_opcode (UNOP_COMPLEMENT); }
529 | '!' UnaryExpression
530 { write_exp_elt_opcode (UNOP_LOGICAL_NOT); }
535 '(' PrimitiveType Dims_opt ')' UnaryExpression
536 { write_exp_elt_opcode (UNOP_CAST);
537 write_exp_elt_type (java_array_type ($2, $3));
538 write_exp_elt_opcode (UNOP_CAST); }
539 | '(' Expression ')' UnaryExpressionNotPlusMinus
541 int exp_size = expout_ptr;
542 int last_exp_size = length_of_subexp(expout, expout_ptr);
545 int base = expout_ptr - last_exp_size - 3;
546 if (base < 0 || expout->elts[base+2].opcode != OP_TYPE)
547 error (_("Invalid cast expression"));
548 type = expout->elts[base+1].type;
549 /* Remove the 'Expression' and slide the
550 UnaryExpressionNotPlusMinus down to replace it. */
551 for (i = 0; i < last_exp_size; i++)
552 expout->elts[base + i] = expout->elts[base + i + 3];
554 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
555 type = lookup_pointer_type (type);
556 write_exp_elt_opcode (UNOP_CAST);
557 write_exp_elt_type (type);
558 write_exp_elt_opcode (UNOP_CAST);
560 | '(' Name Dims ')' UnaryExpressionNotPlusMinus
561 { write_exp_elt_opcode (UNOP_CAST);
562 write_exp_elt_type (java_array_type (java_type_from_name ($2), $3));
563 write_exp_elt_opcode (UNOP_CAST); }
567 MultiplicativeExpression:
569 | MultiplicativeExpression '*' UnaryExpression
570 { write_exp_elt_opcode (BINOP_MUL); }
571 | MultiplicativeExpression '/' UnaryExpression
572 { write_exp_elt_opcode (BINOP_DIV); }
573 | MultiplicativeExpression '%' UnaryExpression
574 { write_exp_elt_opcode (BINOP_REM); }
578 MultiplicativeExpression
579 | AdditiveExpression '+' MultiplicativeExpression
580 { write_exp_elt_opcode (BINOP_ADD); }
581 | AdditiveExpression '-' MultiplicativeExpression
582 { write_exp_elt_opcode (BINOP_SUB); }
587 | ShiftExpression LSH AdditiveExpression
588 { write_exp_elt_opcode (BINOP_LSH); }
589 | ShiftExpression RSH AdditiveExpression
590 { write_exp_elt_opcode (BINOP_RSH); }
591 /* | ShiftExpression >>> AdditiveExpression { FIXME } */
594 RelationalExpression:
596 | RelationalExpression '<' ShiftExpression
597 { write_exp_elt_opcode (BINOP_LESS); }
598 | RelationalExpression '>' ShiftExpression
599 { write_exp_elt_opcode (BINOP_GTR); }
600 | RelationalExpression LEQ ShiftExpression
601 { write_exp_elt_opcode (BINOP_LEQ); }
602 | RelationalExpression GEQ ShiftExpression
603 { write_exp_elt_opcode (BINOP_GEQ); }
604 /* | RelationalExpresion INSTANCEOF ReferenceType { FIXME } */
609 | EqualityExpression EQUAL RelationalExpression
610 { write_exp_elt_opcode (BINOP_EQUAL); }
611 | EqualityExpression NOTEQUAL RelationalExpression
612 { write_exp_elt_opcode (BINOP_NOTEQUAL); }
617 | AndExpression '&' EqualityExpression
618 { write_exp_elt_opcode (BINOP_BITWISE_AND); }
621 ExclusiveOrExpression:
623 | ExclusiveOrExpression '^' AndExpression
624 { write_exp_elt_opcode (BINOP_BITWISE_XOR); }
626 InclusiveOrExpression:
627 ExclusiveOrExpression
628 | InclusiveOrExpression '|' ExclusiveOrExpression
629 { write_exp_elt_opcode (BINOP_BITWISE_IOR); }
632 ConditionalAndExpression:
633 InclusiveOrExpression
634 | ConditionalAndExpression ANDAND InclusiveOrExpression
635 { write_exp_elt_opcode (BINOP_LOGICAL_AND); }
638 ConditionalOrExpression:
639 ConditionalAndExpression
640 | ConditionalOrExpression OROR ConditionalAndExpression
641 { write_exp_elt_opcode (BINOP_LOGICAL_OR); }
644 ConditionalExpression:
645 ConditionalOrExpression
646 | ConditionalOrExpression '?' Expression ':' ConditionalExpression
647 { write_exp_elt_opcode (TERNOP_COND); }
650 AssignmentExpression:
651 ConditionalExpression
656 LeftHandSide '=' ConditionalExpression
657 { write_exp_elt_opcode (BINOP_ASSIGN); }
658 | LeftHandSide ASSIGN_MODIFY ConditionalExpression
659 { write_exp_elt_opcode (BINOP_ASSIGN_MODIFY);
660 write_exp_elt_opcode ($2);
661 write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); }
666 { push_expression_name ($1); }
668 /* Already written by write_dollar_variable. */
679 /* Take care of parsing a number (anything that starts with a digit).
680 Set yylval and return the token type; update lexptr.
681 LEN is the number of characters in it. */
683 /*** Needs some error checking for the float case ***/
686 parse_number (p, len, parsed_float, putithere)
692 register ULONGEST n = 0;
693 ULONGEST limit, limit_div_base;
696 register int base = input_radix;
702 /* It's a float since it contains a point or an exponent. */
704 int num = 0; /* number of tokens scanned by scanf */
705 char saved_char = p[len];
707 p[len] = 0; /* null-terminate the token */
708 if (sizeof (putithere->typed_val_float.dval) <= sizeof (float))
709 num = sscanf (p, "%g%c", (float *) &putithere->typed_val_float.dval, &c);
710 else if (sizeof (putithere->typed_val_float.dval) <= sizeof (double))
711 num = sscanf (p, "%lg%c", (double *) &putithere->typed_val_float.dval, &c);
714 #ifdef SCANF_HAS_LONG_DOUBLE
715 num = sscanf (p, "%Lg%c", &putithere->typed_val_float.dval, &c);
717 /* Scan it into a double, then assign it to the long double.
718 This at least wins with values representable in the range
721 num = sscanf (p, "%lg%c", &temp, &c);
722 putithere->typed_val_float.dval = temp;
725 p[len] = saved_char; /* restore the input stream */
726 if (num != 1) /* check scanf found ONLY a float ... */
728 /* See if it has `f' or `d' suffix (float or double). */
730 c = tolower (p[len - 1]);
732 if (c == 'f' || c == 'F')
733 putithere->typed_val_float.type = builtin_type_float;
734 else if (isdigit (c) || c == '.' || c == 'd' || c == 'D')
735 putithere->typed_val_float.type = builtin_type_double;
739 return FLOATING_POINT_LITERAL;
742 /* Handle base-switching prefixes 0x, 0t, 0d, 0 */
774 /* A paranoid calculation of (1<<64)-1. */
775 limit = (ULONGEST)0xffffffff;
776 limit = ((limit << 16) << 16) | limit;
777 if (c == 'l' || c == 'L')
779 type = java_long_type;
784 type = java_int_type;
786 limit_div_base = limit / (ULONGEST) base;
791 if (c >= '0' && c <= '9')
793 else if (c >= 'A' && c <= 'Z')
795 else if (c >= 'a' && c <= 'z')
798 return ERROR; /* Char not a digit */
801 if (n > limit_div_base
802 || (n *= base) > limit - c)
803 error (_("Numeric constant too large"));
807 /* If the type is bigger than a 32-bit signed integer can be, implicitly
808 promote to long. Java does not do this, so mark it as builtin_type_uint64
809 rather than java_long_type. 0x80000000 will become -0x80000000 instead
810 of 0x80000000L, because we don't know the sign at this point.
812 if (type == java_int_type && n > (ULONGEST)0x80000000)
813 type = builtin_type_uint64;
815 putithere->typed_val_int.val = n;
816 putithere->typed_val_int.type = type;
818 return INTEGER_LITERAL;
825 enum exp_opcode opcode;
828 static const struct token tokentab3[] =
830 {">>=", ASSIGN_MODIFY, BINOP_RSH},
831 {"<<=", ASSIGN_MODIFY, BINOP_LSH}
834 static const struct token tokentab2[] =
836 {"+=", ASSIGN_MODIFY, BINOP_ADD},
837 {"-=", ASSIGN_MODIFY, BINOP_SUB},
838 {"*=", ASSIGN_MODIFY, BINOP_MUL},
839 {"/=", ASSIGN_MODIFY, BINOP_DIV},
840 {"%=", ASSIGN_MODIFY, BINOP_REM},
841 {"|=", ASSIGN_MODIFY, BINOP_BITWISE_IOR},
842 {"&=", ASSIGN_MODIFY, BINOP_BITWISE_AND},
843 {"^=", ASSIGN_MODIFY, BINOP_BITWISE_XOR},
844 {"++", INCREMENT, BINOP_END},
845 {"--", DECREMENT, BINOP_END},
846 {"&&", ANDAND, BINOP_END},
847 {"||", OROR, BINOP_END},
848 {"<<", LSH, BINOP_END},
849 {">>", RSH, BINOP_END},
850 {"==", EQUAL, BINOP_END},
851 {"!=", NOTEQUAL, BINOP_END},
852 {"<=", LEQ, BINOP_END},
853 {">=", GEQ, BINOP_END}
856 /* Read one token, getting characters through lexptr. */
867 static char *tempbuf;
868 static int tempbufsize;
872 prev_lexptr = lexptr;
875 /* See if it is a special token of length 3. */
876 for (i = 0; i < sizeof tokentab3 / sizeof tokentab3[0]; i++)
877 if (STREQN (tokstart, tokentab3[i].operator, 3))
880 yylval.opcode = tokentab3[i].opcode;
881 return tokentab3[i].token;
884 /* See if it is a special token of length 2. */
885 for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++)
886 if (STREQN (tokstart, tokentab2[i].operator, 2))
889 yylval.opcode = tokentab2[i].opcode;
890 return tokentab2[i].token;
893 switch (c = *tokstart)
905 /* We either have a character constant ('0' or '\177' for example)
906 or we have a quoted symbol reference ('foo(int,int)' in C++
911 c = parse_escape (&lexptr);
913 error (_("Empty character constant"));
915 yylval.typed_val_int.val = c;
916 yylval.typed_val_int.type = java_char_type;
921 namelen = skip_quoted (tokstart) - tokstart;
924 lexptr = tokstart + namelen;
925 if (lexptr[-1] != '\'')
926 error (_("Unmatched single quote"));
931 error (_("Invalid character constant"));
933 return INTEGER_LITERAL;
941 if (paren_depth == 0)
948 if (comma_terminates && paren_depth == 0)
954 /* Might be a floating point number. */
955 if (lexptr[1] < '0' || lexptr[1] > '9')
956 goto symbol; /* Nope, must be a symbol. */
957 /* FALL THRU into number case. */
971 int got_dot = 0, got_e = 0, toktype;
972 register char *p = tokstart;
973 int hex = input_radix > 10;
975 if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
980 else if (c == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D'))
988 /* This test includes !hex because 'e' is a valid hex digit
989 and thus does not indicate a floating point number when
991 if (!hex && !got_e && (*p == 'e' || *p == 'E'))
993 /* This test does not include !hex, because a '.' always indicates
994 a decimal floating point number regardless of the radix. */
995 else if (!got_dot && *p == '.')
997 else if (got_e && (p[-1] == 'e' || p[-1] == 'E')
998 && (*p == '-' || *p == '+'))
999 /* This is the sign of the exponent, not the end of the
1002 /* We will take any letters or digits. parse_number will
1003 complain if past the radix, or if L or U are not final. */
1004 else if ((*p < '0' || *p > '9')
1005 && ((*p < 'a' || *p > 'z')
1006 && (*p < 'A' || *p > 'Z')))
1009 toktype = parse_number (tokstart, p - tokstart, got_dot|got_e, &yylval);
1010 if (toktype == ERROR)
1012 char *err_copy = (char *) alloca (p - tokstart + 1);
1014 memcpy (err_copy, tokstart, p - tokstart);
1015 err_copy[p - tokstart] = 0;
1016 error (_("Invalid number \"%s\""), err_copy);
1047 /* Build the gdb internal form of the input string in tempbuf,
1048 translating any standard C escape forms seen. Note that the
1049 buffer is null byte terminated *only* for the convenience of
1050 debugging gdb itself and printing the buffer contents when
1051 the buffer contains no embedded nulls. Gdb does not depend
1052 upon the buffer being null byte terminated, it uses the length
1053 string instead. This allows gdb to handle C strings (as well
1054 as strings in other languages) with embedded null bytes */
1056 tokptr = ++tokstart;
1060 /* Grow the static temp buffer if necessary, including allocating
1061 the first one on demand. */
1062 if (tempbufindex + 1 >= tempbufsize)
1064 tempbuf = (char *) realloc (tempbuf, tempbufsize += 64);
1070 /* Do nothing, loop will terminate. */
1074 c = parse_escape (&tokptr);
1079 tempbuf[tempbufindex++] = c;
1082 tempbuf[tempbufindex++] = *tokptr++;
1085 } while ((*tokptr != '"') && (*tokptr != '\0'));
1086 if (*tokptr++ != '"')
1088 error (_("Unterminated string in expression"));
1090 tempbuf[tempbufindex] = '\0'; /* See note above */
1091 yylval.sval.ptr = tempbuf;
1092 yylval.sval.length = tempbufindex;
1094 return (STRING_LITERAL);
1097 if (!(c == '_' || c == '$'
1098 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
1099 /* We must have come across a bad character (e.g. ';'). */
1100 error (_("Invalid character '%c' in expression"), c);
1102 /* It's a name. See how long it is. */
1104 for (c = tokstart[namelen];
1107 || (c >= '0' && c <= '9')
1108 || (c >= 'a' && c <= 'z')
1109 || (c >= 'A' && c <= 'Z')
1116 while (tokstart[++i] && tokstart[i] != '>');
1117 if (tokstart[i] == '>')
1120 c = tokstart[++namelen];
1123 /* The token "if" terminates the expression and is NOT
1124 removed from the input stream. */
1125 if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f')
1134 /* Catch specific keywords. Should be done with a data structure. */
1138 if (STREQN (tokstart, "boolean", 7))
1142 if (STREQN (tokstart, "double", 6))
1146 if (STREQN (tokstart, "short", 5))
1148 if (STREQN (tokstart, "false", 5))
1151 return BOOLEAN_LITERAL;
1153 if (STREQN (tokstart, "super", 5))
1155 if (STREQN (tokstart, "float", 5))
1159 if (STREQN (tokstart, "long", 4))
1161 if (STREQN (tokstart, "byte", 4))
1163 if (STREQN (tokstart, "char", 4))
1165 if (STREQN (tokstart, "true", 4))
1168 return BOOLEAN_LITERAL;
1170 if (current_language->la_language == language_cplus
1171 && STREQN (tokstart, "this", 4))
1173 static const char this_name[] =
1174 { CPLUS_MARKER, 't', 'h', 'i', 's', '\0' };
1176 if (lookup_symbol (this_name, expression_context_block,
1177 VAR_NAMESPACE, (int *) NULL,
1178 (struct symtab **) NULL))
1183 if (STREQN (tokstart, "int", 3))
1185 if (STREQN (tokstart, "new", 3))
1192 yylval.sval.ptr = tokstart;
1193 yylval.sval.length = namelen;
1195 if (*tokstart == '$')
1197 write_dollar_variable (yylval.sval);
1201 /* Input names that aren't symbols but ARE valid hex numbers,
1202 when the input radix permits them, can be names or numbers
1203 depending on the parse. Note we support radixes > 16 here. */
1204 if (((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10) ||
1205 (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
1207 YYSTYPE newlval; /* Its value is ignored. */
1208 int hextype = parse_number (tokstart, namelen, 0, &newlval);
1209 if (hextype == INTEGER_LITERAL)
1220 lexptr = prev_lexptr;
1223 error (_("%s: near `%s'"), msg, lexptr);
1225 error (_("error in expression, near `%s'"), lexptr);
1228 static struct type *
1229 java_type_from_name (name)
1233 char *tmp = copy_name (name);
1234 struct type *typ = java_lookup_class (tmp);
1235 if (typ == NULL || TYPE_CODE (typ) != TYPE_CODE_STRUCT)
1236 error (_("No class named `%s'"), tmp);
1240 /* If NAME is a valid variable name in this scope, push it and return 1.
1241 Otherwise, return 0. */
1244 push_variable (name)
1248 char *tmp = copy_name (name);
1249 int is_a_field_of_this = 0;
1251 sym = lookup_symbol (tmp, expression_context_block, VAR_NAMESPACE,
1252 &is_a_field_of_this, (struct symtab **) NULL);
1253 if (sym && SYMBOL_CLASS (sym) != LOC_TYPEDEF)
1255 if (symbol_read_needs_frame (sym))
1257 if (innermost_block == 0 ||
1258 contained_in (block_found, innermost_block))
1259 innermost_block = block_found;
1262 write_exp_elt_opcode (OP_VAR_VALUE);
1263 /* We want to use the selected frame, not another more inner frame
1264 which happens to be in the same block. */
1265 write_exp_elt_block (NULL);
1266 write_exp_elt_sym (sym);
1267 write_exp_elt_opcode (OP_VAR_VALUE);
1270 if (is_a_field_of_this)
1272 /* it hangs off of `this'. Must not inadvertently convert from a
1273 method call to data ref. */
1274 if (innermost_block == 0 ||
1275 contained_in (block_found, innermost_block))
1276 innermost_block = block_found;
1277 write_exp_elt_opcode (OP_THIS);
1278 write_exp_elt_opcode (OP_THIS);
1279 write_exp_elt_opcode (STRUCTOP_PTR);
1280 write_exp_string (name);
1281 write_exp_elt_opcode (STRUCTOP_PTR);
1287 /* Assuming a reference expression has been pushed, emit the
1288 STRUCTOP_STRUCT ops to access the field named NAME. If NAME is a
1289 qualified name (has '.'), generate a field access for each part. */
1292 push_fieldnames (name)
1296 struct stoken token;
1297 token.ptr = name.ptr;
1300 if (i == name.length || name.ptr[i] == '.')
1302 /* token.ptr is start of current field name. */
1303 token.length = &name.ptr[i] - token.ptr;
1304 write_exp_elt_opcode (STRUCTOP_STRUCT);
1305 write_exp_string (token);
1306 write_exp_elt_opcode (STRUCTOP_STRUCT);
1307 token.ptr += token.length + 1;
1309 if (i >= name.length)
1314 /* Helper routine for push_expression_name.
1315 Handle a qualified name, where DOT_INDEX is the index of the first '.' */
1318 push_qualified_expression_name (name, dot_index)
1322 struct stoken token;
1326 token.ptr = name.ptr;
1327 token.length = dot_index;
1329 if (push_variable (token))
1331 token.ptr = name.ptr + dot_index + 1;
1332 token.length = name.length - dot_index - 1;
1333 push_fieldnames (token);
1337 token.ptr = name.ptr;
1340 token.length = dot_index;
1341 tmp = copy_name (token);
1342 typ = java_lookup_class (tmp);
1345 if (dot_index == name.length)
1347 write_exp_elt_opcode(OP_TYPE);
1348 write_exp_elt_type(typ);
1349 write_exp_elt_opcode(OP_TYPE);
1352 dot_index++; /* Skip '.' */
1353 name.ptr += dot_index;
1354 name.length -= dot_index;
1356 while (dot_index < name.length && name.ptr[dot_index] != '.')
1358 token.ptr = name.ptr;
1359 token.length = dot_index;
1360 write_exp_elt_opcode (OP_SCOPE);
1361 write_exp_elt_type (typ);
1362 write_exp_string (token);
1363 write_exp_elt_opcode (OP_SCOPE);
1364 if (dot_index < name.length)
1367 name.ptr += dot_index;
1368 name.length -= dot_index;
1369 push_fieldnames (name);
1373 else if (dot_index >= name.length)
1375 dot_index++; /* Skip '.' */
1376 while (dot_index < name.length && name.ptr[dot_index] != '.')
1379 error (_("unknown type `%.*s'"), name.length, name.ptr);
1382 /* Handle Name in an expression (or LHS).
1383 Handle VAR, TYPE, TYPE.FIELD1....FIELDN and VAR.FIELD1....FIELDN. */
1386 push_expression_name (name)
1394 for (i = 0; i < name.length; i++)
1396 if (name.ptr[i] == '.')
1398 /* It's a Qualified Expression Name. */
1399 push_qualified_expression_name (name, i);
1404 /* It's a Simple Expression Name. */
1406 if (push_variable (name))
1408 tmp = copy_name (name);
1409 typ = java_lookup_class (tmp);
1412 write_exp_elt_opcode(OP_TYPE);
1413 write_exp_elt_type(typ);
1414 write_exp_elt_opcode(OP_TYPE);
1418 struct minimal_symbol *msymbol;
1420 msymbol = lookup_minimal_symbol (tmp, NULL, NULL);
1421 if (msymbol != NULL)
1423 write_exp_msymbol (msymbol,
1424 lookup_function_type (builtin_type_int),
1427 else if (!have_full_symbols () && !have_partial_symbols ())
1428 error (_("No symbol table is loaded. Use the \"file\" command"));
1430 error (_("No symbol \"%s\" in current context"), tmp);
1436 /* The following two routines, copy_exp and insert_exp, aren't specific to
1437 Java, so they could go in parse.c, but their only purpose is to support
1438 the parsing kludges we use in this file, so maybe it's best to isolate
1441 /* Copy the expression whose last element is at index ENDPOS - 1 in EXPR
1442 into a freshly malloc'ed struct expression. Its language_defn is set
1444 static struct expression *
1445 copy_exp (expr, endpos)
1446 struct expression *expr;
1449 int len = length_of_subexp (expr, endpos);
1450 struct expression *new
1451 = (struct expression *) malloc (sizeof (*new) + EXP_ELEM_TO_BYTES (len));
1453 memcpy (new->elts, expr->elts + endpos - len, EXP_ELEM_TO_BYTES (len));
1454 new->language_defn = 0;
1459 /* Insert the expression NEW into the current expression (expout) at POS. */
1461 insert_exp (pos, new)
1463 struct expression *new;
1465 int newlen = new->nelts;
1467 /* Grow expout if necessary. In this function's only use at present,
1468 this should never be necessary. */
1469 if (expout_ptr + newlen > expout_size)
1471 expout_size = max (expout_size * 2, expout_ptr + newlen + 10);
1472 expout = (struct expression *)
1473 realloc ((char *) expout, (sizeof (struct expression)
1474 + EXP_ELEM_TO_BYTES (expout_size)));
1480 for (i = expout_ptr - 1; i >= pos; i--)
1481 expout->elts[i + newlen] = expout->elts[i];
1484 memcpy (expout->elts + pos, new->elts, EXP_ELEM_TO_BYTES (newlen));
1485 expout_ptr += newlen;