Fix: symbols eliminated by --gc-sections still trigger warnings for gnu.warning.SYM
[binutils-gdb.git] / gdb / p-exp.y
blob2360a500476cfc9999dd90a71583f1dfba71d464
1 /* YACC parser for Pascal expressions, for GDB.
2 Copyright (C) 2000-2023 Free Software Foundation, Inc.
4 This file is part of GDB.
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.
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.
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/>. */
19 /* This file is derived from c-exp.y */
21 /* Parse a Pascal 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.
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. */
38 /* Known bugs or limitations:
39 - pascal string operations are not supported at all.
40 - there are some problems with boolean types.
41 - Pascal type hexadecimal constants are not supported
42 because they conflict with the internal variables format.
43 Probably also lots of other problems, less well defined PM. */
46 #include "defs.h"
47 #include <ctype.h>
48 #include "expression.h"
49 #include "value.h"
50 #include "parser-defs.h"
51 #include "language.h"
52 #include "p-lang.h"
53 #include "block.h"
54 #include "expop.h"
56 #define parse_type(ps) builtin_type (ps->gdbarch ())
58 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror,
59 etc). */
60 #define GDB_YY_REMAP_PREFIX pascal_
61 #include "yy-remap.h"
63 /* The state of the parser, used internally when we are parsing the
64 expression. */
66 static struct parser_state *pstate = NULL;
68 /* Depth of parentheses. */
69 static int paren_depth;
71 int yyparse (void);
73 static int yylex (void);
75 static void yyerror (const char *);
77 static char *uptok (const char *, int);
79 using namespace expr;
82 /* Although the yacc "value" of an expression is not used,
83 since the result is stored in the structure being created,
84 other node types do have values. */
86 %union
88 LONGEST lval;
89 struct {
90 LONGEST val;
91 struct type *type;
92 } typed_val_int;
93 struct {
94 gdb_byte val[16];
95 struct type *type;
96 } typed_val_float;
97 struct symbol *sym;
98 struct type *tval;
99 struct stoken sval;
100 struct ttype tsym;
101 struct symtoken ssym;
102 int voidval;
103 const struct block *bval;
104 enum exp_opcode opcode;
105 struct internalvar *ivar;
107 struct type **tvec;
108 int *ivec;
112 /* YYSTYPE gets defined by %union */
113 static int parse_number (struct parser_state *,
114 const char *, int, int, YYSTYPE *);
116 static struct type *current_type;
117 static int leftdiv_is_integer;
118 static void push_current_type (void);
119 static void pop_current_type (void);
120 static int search_field;
123 %type <voidval> exp exp1 type_exp start normal_start variable qualified_name
124 %type <tval> type typebase
125 /* %type <bval> block */
127 /* Fancy type parsing. */
128 %type <tval> ptype
130 %token <typed_val_int> INT
131 %token <typed_val_float> FLOAT
133 /* Both NAME and TYPENAME tokens represent symbols in the input,
134 and both convey their data as strings.
135 But a TYPENAME is a string that happens to be defined as a typedef
136 or builtin type name (such as int or char)
137 and a NAME is any other symbol.
138 Contexts where this distinction is not important can use the
139 nonterminal "name", which matches either NAME or TYPENAME. */
141 %token <sval> STRING
142 %token <sval> FIELDNAME
143 %token <voidval> COMPLETE
144 %token <ssym> NAME /* BLOCKNAME defined below to give it higher precedence. */
145 %token <tsym> TYPENAME
146 %type <sval> name
147 %type <ssym> name_not_typename
149 /* A NAME_OR_INT is a symbol which is not known in the symbol table,
150 but which would parse as a valid number in the current input radix.
151 E.g. "c" when input_radix==16. Depending on the parse, it will be
152 turned into a name or into a number. */
154 %token <ssym> NAME_OR_INT
156 %token STRUCT CLASS SIZEOF COLONCOLON
157 %token ERROR
159 /* Special type cases, put in to allow the parser to distinguish different
160 legal basetypes. */
162 %token <sval> DOLLAR_VARIABLE
165 /* Object pascal */
166 %token THIS
167 %token <lval> TRUEKEYWORD FALSEKEYWORD
169 %left ','
170 %left ABOVE_COMMA
171 %right ASSIGN
172 %left NOT
173 %left OR
174 %left XOR
175 %left ANDAND
176 %left '=' NOTEQUAL
177 %left '<' '>' LEQ GEQ
178 %left LSH RSH DIV MOD
179 %left '@'
180 %left '+' '-'
181 %left '*' '/'
182 %right UNARY INCREMENT DECREMENT
183 %right ARROW '.' '[' '('
184 %left '^'
185 %token <ssym> BLOCKNAME
186 %type <bval> block
187 %left COLONCOLON
192 start : { current_type = NULL;
193 search_field = 0;
194 leftdiv_is_integer = 0;
196 normal_start {}
199 normal_start :
200 exp1
201 | type_exp
204 type_exp: type
206 pstate->push_new<type_operation> ($1);
207 current_type = $1; } ;
209 /* Expressions, including the comma operator. */
210 exp1 : exp
211 | exp1 ',' exp
212 { pstate->wrap2<comma_operation> (); }
215 /* Expressions, not including the comma operator. */
216 exp : exp '^' %prec UNARY
217 { pstate->wrap<unop_ind_operation> ();
218 if (current_type)
219 current_type = current_type->target_type (); }
222 exp : '@' exp %prec UNARY
223 { pstate->wrap<unop_addr_operation> ();
224 if (current_type)
225 current_type = TYPE_POINTER_TYPE (current_type); }
228 exp : '-' exp %prec UNARY
229 { pstate->wrap<unary_neg_operation> (); }
232 exp : NOT exp %prec UNARY
233 { pstate->wrap<unary_logical_not_operation> (); }
236 exp : INCREMENT '(' exp ')' %prec UNARY
237 { pstate->wrap<preinc_operation> (); }
240 exp : DECREMENT '(' exp ')' %prec UNARY
241 { pstate->wrap<predec_operation> (); }
245 field_exp : exp '.' %prec UNARY
246 { search_field = 1; }
249 exp : field_exp FIELDNAME
251 pstate->push_new<structop_operation>
252 (pstate->pop (), copy_name ($2));
253 search_field = 0;
254 if (current_type)
256 while (current_type->code ()
257 == TYPE_CODE_PTR)
258 current_type =
259 current_type->target_type ();
260 current_type = lookup_struct_elt_type (
261 current_type, $2.ptr, 0);
267 exp : field_exp name
269 pstate->push_new<structop_operation>
270 (pstate->pop (), copy_name ($2));
271 search_field = 0;
272 if (current_type)
274 while (current_type->code ()
275 == TYPE_CODE_PTR)
276 current_type =
277 current_type->target_type ();
278 current_type = lookup_struct_elt_type (
279 current_type, $2.ptr, 0);
283 exp : field_exp name COMPLETE
285 structop_base_operation *op
286 = new structop_ptr_operation (pstate->pop (),
287 copy_name ($2));
288 pstate->mark_struct_expression (op);
289 pstate->push (operation_up (op));
292 exp : field_exp COMPLETE
294 structop_base_operation *op
295 = new structop_ptr_operation (pstate->pop (), "");
296 pstate->mark_struct_expression (op);
297 pstate->push (operation_up (op));
301 exp : exp '['
302 /* We need to save the current_type value. */
303 { const char *arrayname;
304 int arrayfieldindex
305 = pascal_is_string_type (current_type, NULL, NULL,
306 NULL, NULL, &arrayname);
307 if (arrayfieldindex)
309 current_type
310 = (current_type
311 ->field (arrayfieldindex - 1).type ());
312 pstate->push_new<structop_operation>
313 (pstate->pop (), arrayname);
315 push_current_type (); }
316 exp1 ']'
317 { pop_current_type ();
318 pstate->wrap2<subscript_operation> ();
319 if (current_type)
320 current_type = current_type->target_type (); }
323 exp : exp '('
324 /* This is to save the value of arglist_len
325 being accumulated by an outer function call. */
326 { push_current_type ();
327 pstate->start_arglist (); }
328 arglist ')' %prec ARROW
330 std::vector<operation_up> args
331 = pstate->pop_vector (pstate->end_arglist ());
332 pstate->push_new<funcall_operation>
333 (pstate->pop (), std::move (args));
334 pop_current_type ();
335 if (current_type)
336 current_type = current_type->target_type ();
340 arglist :
341 | exp
342 { pstate->arglist_len = 1; }
343 | arglist ',' exp %prec ABOVE_COMMA
344 { pstate->arglist_len++; }
347 exp : type '(' exp ')' %prec UNARY
348 { if (current_type)
350 /* Allow automatic dereference of classes. */
351 if ((current_type->code () == TYPE_CODE_PTR)
352 && (current_type->target_type ()->code () == TYPE_CODE_STRUCT)
353 && (($1)->code () == TYPE_CODE_STRUCT))
354 pstate->wrap<unop_ind_operation> ();
356 pstate->push_new<unop_cast_operation>
357 (pstate->pop (), $1);
358 current_type = $1; }
361 exp : '(' exp1 ')'
365 /* Binary operators in order of decreasing precedence. */
367 exp : exp '*' exp
368 { pstate->wrap2<mul_operation> (); }
371 exp : exp '/' {
372 if (current_type && is_integral_type (current_type))
373 leftdiv_is_integer = 1;
377 if (leftdiv_is_integer && current_type
378 && is_integral_type (current_type))
380 pstate->push_new<unop_cast_operation>
381 (pstate->pop (),
382 parse_type (pstate)->builtin_long_double);
383 current_type
384 = parse_type (pstate)->builtin_long_double;
385 leftdiv_is_integer = 0;
388 pstate->wrap2<div_operation> ();
392 exp : exp DIV exp
393 { pstate->wrap2<intdiv_operation> (); }
396 exp : exp MOD exp
397 { pstate->wrap2<rem_operation> (); }
400 exp : exp '+' exp
401 { pstate->wrap2<add_operation> (); }
404 exp : exp '-' exp
405 { pstate->wrap2<sub_operation> (); }
408 exp : exp LSH exp
409 { pstate->wrap2<lsh_operation> (); }
412 exp : exp RSH exp
413 { pstate->wrap2<rsh_operation> (); }
416 exp : exp '=' exp
418 pstate->wrap2<equal_operation> ();
419 current_type = parse_type (pstate)->builtin_bool;
423 exp : exp NOTEQUAL exp
425 pstate->wrap2<notequal_operation> ();
426 current_type = parse_type (pstate)->builtin_bool;
430 exp : exp LEQ exp
432 pstate->wrap2<leq_operation> ();
433 current_type = parse_type (pstate)->builtin_bool;
437 exp : exp GEQ exp
439 pstate->wrap2<geq_operation> ();
440 current_type = parse_type (pstate)->builtin_bool;
444 exp : exp '<' exp
446 pstate->wrap2<less_operation> ();
447 current_type = parse_type (pstate)->builtin_bool;
451 exp : exp '>' exp
453 pstate->wrap2<gtr_operation> ();
454 current_type = parse_type (pstate)->builtin_bool;
458 exp : exp ANDAND exp
459 { pstate->wrap2<bitwise_and_operation> (); }
462 exp : exp XOR exp
463 { pstate->wrap2<bitwise_xor_operation> (); }
466 exp : exp OR exp
467 { pstate->wrap2<bitwise_ior_operation> (); }
470 exp : exp ASSIGN exp
471 { pstate->wrap2<assign_operation> (); }
474 exp : TRUEKEYWORD
476 pstate->push_new<bool_operation> ($1);
477 current_type = parse_type (pstate)->builtin_bool;
481 exp : FALSEKEYWORD
483 pstate->push_new<bool_operation> ($1);
484 current_type = parse_type (pstate)->builtin_bool;
488 exp : INT
490 pstate->push_new<long_const_operation>
491 ($1.type, $1.val);
492 current_type = $1.type;
496 exp : NAME_OR_INT
497 { YYSTYPE val;
498 parse_number (pstate, $1.stoken.ptr,
499 $1.stoken.length, 0, &val);
500 pstate->push_new<long_const_operation>
501 (val.typed_val_int.type,
502 val.typed_val_int.val);
503 current_type = val.typed_val_int.type;
508 exp : FLOAT
510 float_data data;
511 std::copy (std::begin ($1.val), std::end ($1.val),
512 std::begin (data));
513 pstate->push_new<float_const_operation> ($1.type, data);
517 exp : variable
520 exp : DOLLAR_VARIABLE
522 pstate->push_dollar ($1);
524 /* $ is the normal prefix for pascal
525 hexadecimal values but this conflicts
526 with the GDB use for debugger variables
527 so in expression to enter hexadecimal
528 values we still need to use C syntax with
529 0xff */
530 std::string tmp ($1.ptr, $1.length);
531 /* Handle current_type. */
532 struct internalvar *intvar
533 = lookup_only_internalvar (tmp.c_str () + 1);
534 if (intvar != nullptr)
536 scoped_value_mark mark;
538 value *val
539 = value_of_internalvar (pstate->gdbarch (),
540 intvar);
541 current_type = val->type ();
546 exp : SIZEOF '(' type ')' %prec UNARY
548 current_type = parse_type (pstate)->builtin_int;
549 $3 = check_typedef ($3);
550 pstate->push_new<long_const_operation>
551 (parse_type (pstate)->builtin_int,
552 $3->length ()); }
555 exp : SIZEOF '(' exp ')' %prec UNARY
556 { pstate->wrap<unop_sizeof_operation> ();
557 current_type = parse_type (pstate)->builtin_int; }
559 exp : STRING
560 { /* C strings are converted into array constants with
561 an explicit null byte added at the end. Thus
562 the array upper bound is the string length.
563 There is no such thing in C as a completely empty
564 string. */
565 const char *sp = $1.ptr; int count = $1.length;
567 std::vector<operation_up> args (count + 1);
568 for (int i = 0; i < count; ++i)
569 args[i] = (make_operation<long_const_operation>
570 (parse_type (pstate)->builtin_char,
571 *sp++));
572 args[count] = (make_operation<long_const_operation>
573 (parse_type (pstate)->builtin_char,
574 '\0'));
575 pstate->push_new<array_operation>
576 (0, $1.length, std::move (args));
580 /* Object pascal */
581 exp : THIS
583 struct value * this_val;
584 struct type * this_type;
585 pstate->push_new<op_this_operation> ();
586 /* We need type of this. */
587 this_val
588 = value_of_this_silent (pstate->language ());
589 if (this_val)
590 this_type = this_val->type ();
591 else
592 this_type = NULL;
593 if (this_type)
595 if (this_type->code () == TYPE_CODE_PTR)
597 this_type = this_type->target_type ();
598 pstate->wrap<unop_ind_operation> ();
602 current_type = this_type;
606 /* end of object pascal. */
608 block : BLOCKNAME
610 if ($1.sym.symbol != 0)
611 $$ = $1.sym.symbol->value_block ();
612 else
614 std::string copy = copy_name ($1.stoken);
615 struct symtab *tem =
616 lookup_symtab (copy.c_str ());
617 if (tem)
618 $$ = (tem->compunit ()->blockvector ()
619 ->static_block ());
620 else
621 error (_("No file or function \"%s\"."),
622 copy.c_str ());
627 block : block COLONCOLON name
629 std::string copy = copy_name ($3);
630 struct symbol *tem
631 = lookup_symbol (copy.c_str (), $1,
632 VAR_DOMAIN, NULL).symbol;
634 if (!tem || tem->aclass () != LOC_BLOCK)
635 error (_("No function \"%s\" in specified context."),
636 copy.c_str ());
637 $$ = tem->value_block (); }
640 variable: block COLONCOLON name
641 { struct block_symbol sym;
643 std::string copy = copy_name ($3);
644 sym = lookup_symbol (copy.c_str (), $1,
645 VAR_DOMAIN, NULL);
646 if (sym.symbol == 0)
647 error (_("No symbol \"%s\" in specified context."),
648 copy.c_str ());
650 pstate->push_new<var_value_operation> (sym);
654 qualified_name: typebase COLONCOLON name
656 struct type *type = $1;
658 if (type->code () != TYPE_CODE_STRUCT
659 && type->code () != TYPE_CODE_UNION)
660 error (_("`%s' is not defined as an aggregate type."),
661 type->name ());
663 pstate->push_new<scope_operation>
664 (type, copy_name ($3));
668 variable: qualified_name
669 | COLONCOLON name
671 std::string name = copy_name ($2);
673 struct block_symbol sym
674 = lookup_symbol (name.c_str (), nullptr,
675 VAR_DOMAIN, nullptr);
676 pstate->push_symbol (name.c_str (), sym);
680 variable: name_not_typename
681 { struct block_symbol sym = $1.sym;
683 if (sym.symbol)
685 if (symbol_read_needs_frame (sym.symbol))
686 pstate->block_tracker->update (sym);
688 pstate->push_new<var_value_operation> (sym);
689 current_type = sym.symbol->type (); }
690 else if ($1.is_a_field_of_this)
692 struct value * this_val;
693 struct type * this_type;
694 /* Object pascal: it hangs off of `this'. Must
695 not inadvertently convert from a method call
696 to data ref. */
697 pstate->block_tracker->update (sym);
698 operation_up thisop
699 = make_operation<op_this_operation> ();
700 pstate->push_new<structop_operation>
701 (std::move (thisop), copy_name ($1.stoken));
702 /* We need type of this. */
703 this_val
704 = value_of_this_silent (pstate->language ());
705 if (this_val)
706 this_type = this_val->type ();
707 else
708 this_type = NULL;
709 if (this_type)
710 current_type = lookup_struct_elt_type (
711 this_type,
712 copy_name ($1.stoken).c_str (), 0);
713 else
714 current_type = NULL;
716 else
718 struct bound_minimal_symbol msymbol;
719 std::string arg = copy_name ($1.stoken);
721 msymbol =
722 lookup_bound_minimal_symbol (arg.c_str ());
723 if (msymbol.minsym != NULL)
724 pstate->push_new<var_msym_value_operation>
725 (msymbol);
726 else if (!have_full_symbols ()
727 && !have_partial_symbols ())
728 error (_("No symbol table is loaded. "
729 "Use the \"file\" command."));
730 else
731 error (_("No symbol \"%s\" in current context."),
732 arg.c_str ());
738 ptype : typebase
741 /* We used to try to recognize more pointer to member types here, but
742 that didn't work (shift/reduce conflicts meant that these rules never
743 got executed). The problem is that
744 int (foo::bar::baz::bizzle)
745 is a function type but
746 int (foo::bar::baz::bizzle::*)
747 is a pointer to member type. Stroustrup loses again! */
749 type : ptype
752 typebase /* Implements (approximately): (type-qualifier)* type-specifier */
753 : '^' typebase
754 { $$ = lookup_pointer_type ($2); }
755 | TYPENAME
756 { $$ = $1.type; }
757 | STRUCT name
758 { $$
759 = lookup_struct (copy_name ($2).c_str (),
760 pstate->expression_context_block);
762 | CLASS name
763 { $$
764 = lookup_struct (copy_name ($2).c_str (),
765 pstate->expression_context_block);
767 /* "const" and "volatile" are curently ignored. A type qualifier
768 after the type is handled in the ptype rule. I think these could
769 be too. */
772 name : NAME { $$ = $1.stoken; }
773 | BLOCKNAME { $$ = $1.stoken; }
774 | TYPENAME { $$ = $1.stoken; }
775 | NAME_OR_INT { $$ = $1.stoken; }
778 name_not_typename : NAME
779 | BLOCKNAME
780 /* These would be useful if name_not_typename was useful, but it is just
781 a fake for "variable", so these cause reduce/reduce conflicts because
782 the parser can't tell whether NAME_OR_INT is a name_not_typename (=variable,
783 =exp) or just an exp. If name_not_typename was ever used in an lvalue
784 context where only a name could occur, this might be useful.
785 | NAME_OR_INT
791 /* Take care of parsing a number (anything that starts with a digit).
792 Set yylval and return the token type; update lexptr.
793 LEN is the number of characters in it. */
795 /*** Needs some error checking for the float case ***/
797 static int
798 parse_number (struct parser_state *par_state,
799 const char *p, int len, int parsed_float, YYSTYPE *putithere)
801 ULONGEST n = 0;
802 ULONGEST prevn = 0;
804 int i = 0;
805 int c;
806 int base = input_radix;
807 int unsigned_p = 0;
809 /* Number of "L" suffixes encountered. */
810 int long_p = 0;
812 /* We have found a "L" or "U" suffix. */
813 int found_suffix = 0;
815 if (parsed_float)
817 /* Handle suffixes: 'f' for float, 'l' for long double.
818 FIXME: This appears to be an extension -- do we want this? */
819 if (len >= 1 && tolower (p[len - 1]) == 'f')
821 putithere->typed_val_float.type
822 = parse_type (par_state)->builtin_float;
823 len--;
825 else if (len >= 1 && tolower (p[len - 1]) == 'l')
827 putithere->typed_val_float.type
828 = parse_type (par_state)->builtin_long_double;
829 len--;
831 /* Default type for floating-point literals is double. */
832 else
834 putithere->typed_val_float.type
835 = parse_type (par_state)->builtin_double;
838 if (!parse_float (p, len,
839 putithere->typed_val_float.type,
840 putithere->typed_val_float.val))
841 return ERROR;
842 return FLOAT;
845 /* Handle base-switching prefixes 0x, 0t, 0d, 0. */
846 if (p[0] == '0' && len > 1)
847 switch (p[1])
849 case 'x':
850 case 'X':
851 if (len >= 3)
853 p += 2;
854 base = 16;
855 len -= 2;
857 break;
859 case 't':
860 case 'T':
861 case 'd':
862 case 'D':
863 if (len >= 3)
865 p += 2;
866 base = 10;
867 len -= 2;
869 break;
871 default:
872 base = 8;
873 break;
876 while (len-- > 0)
878 c = *p++;
879 if (c >= 'A' && c <= 'Z')
880 c += 'a' - 'A';
881 if (c != 'l' && c != 'u')
882 n *= base;
883 if (c >= '0' && c <= '9')
885 if (found_suffix)
886 return ERROR;
887 n += i = c - '0';
889 else
891 if (base > 10 && c >= 'a' && c <= 'f')
893 if (found_suffix)
894 return ERROR;
895 n += i = c - 'a' + 10;
897 else if (c == 'l')
899 ++long_p;
900 found_suffix = 1;
902 else if (c == 'u')
904 unsigned_p = 1;
905 found_suffix = 1;
907 else
908 return ERROR; /* Char not a digit */
910 if (i >= base)
911 return ERROR; /* Invalid digit in this base. */
913 if (c != 'l' && c != 'u')
915 /* Test for overflow. */
916 if (prevn == 0 && n == 0)
918 else if (prevn >= n)
919 error (_("Numeric constant too large."));
921 prevn = n;
924 /* An integer constant is an int, a long, or a long long. An L
925 suffix forces it to be long; an LL suffix forces it to be long
926 long. If not forced to a larger size, it gets the first type of
927 the above that it fits in. To figure out whether it fits, we
928 shift it right and see whether anything remains. Note that we
929 can't shift sizeof (LONGEST) * HOST_CHAR_BIT bits or more in one
930 operation, because many compilers will warn about such a shift
931 (which always produces a zero result). Sometimes gdbarch_int_bit
932 or gdbarch_long_bit will be that big, sometimes not. To deal with
933 the case where it is we just always shift the value more than
934 once, with fewer bits each time. */
936 int int_bits = gdbarch_int_bit (par_state->gdbarch ());
937 int long_bits = gdbarch_long_bit (par_state->gdbarch ());
938 int long_long_bits = gdbarch_long_long_bit (par_state->gdbarch ());
939 bool have_signed = !unsigned_p;
940 bool have_int = long_p == 0;
941 bool have_long = long_p <= 1;
942 if (have_int && have_signed && fits_in_type (1, n, int_bits, true))
943 putithere->typed_val_int.type = parse_type (par_state)->builtin_int;
944 else if (have_int && fits_in_type (1, n, int_bits, false))
945 putithere->typed_val_int.type
946 = parse_type (par_state)->builtin_unsigned_int;
947 else if (have_long && have_signed && fits_in_type (1, n, long_bits, true))
948 putithere->typed_val_int.type = parse_type (par_state)->builtin_long;
949 else if (have_long && fits_in_type (1, n, long_bits, false))
950 putithere->typed_val_int.type
951 = parse_type (par_state)->builtin_unsigned_long;
952 else if (have_signed && fits_in_type (1, n, long_long_bits, true))
953 putithere->typed_val_int.type
954 = parse_type (par_state)->builtin_long_long;
955 else if (fits_in_type (1, n, long_long_bits, false))
956 putithere->typed_val_int.type
957 = parse_type (par_state)->builtin_unsigned_long_long;
958 else
959 error (_("Numeric constant too large."));
960 putithere->typed_val_int.val = n;
962 return INT;
966 struct type_push
968 struct type *stored;
969 struct type_push *next;
972 static struct type_push *tp_top = NULL;
974 static void
975 push_current_type (void)
977 struct type_push *tpnew;
978 tpnew = (struct type_push *) malloc (sizeof (struct type_push));
979 tpnew->next = tp_top;
980 tpnew->stored = current_type;
981 current_type = NULL;
982 tp_top = tpnew;
985 static void
986 pop_current_type (void)
988 struct type_push *tp = tp_top;
989 if (tp)
991 current_type = tp->stored;
992 tp_top = tp->next;
993 free (tp);
997 struct p_token
999 const char *oper;
1000 int token;
1001 enum exp_opcode opcode;
1004 static const struct p_token tokentab3[] =
1006 {"shr", RSH, OP_NULL},
1007 {"shl", LSH, OP_NULL},
1008 {"and", ANDAND, OP_NULL},
1009 {"div", DIV, OP_NULL},
1010 {"not", NOT, OP_NULL},
1011 {"mod", MOD, OP_NULL},
1012 {"inc", INCREMENT, OP_NULL},
1013 {"dec", DECREMENT, OP_NULL},
1014 {"xor", XOR, OP_NULL}
1017 static const struct p_token tokentab2[] =
1019 {"or", OR, OP_NULL},
1020 {"<>", NOTEQUAL, OP_NULL},
1021 {"<=", LEQ, OP_NULL},
1022 {">=", GEQ, OP_NULL},
1023 {":=", ASSIGN, OP_NULL},
1024 {"::", COLONCOLON, OP_NULL} };
1026 /* Allocate uppercased var: */
1027 /* make an uppercased copy of tokstart. */
1028 static char *
1029 uptok (const char *tokstart, int namelen)
1031 int i;
1032 char *uptokstart = (char *)malloc(namelen+1);
1033 for (i = 0;i <= namelen;i++)
1035 if ((tokstart[i]>='a' && tokstart[i]<='z'))
1036 uptokstart[i] = tokstart[i]-('a'-'A');
1037 else
1038 uptokstart[i] = tokstart[i];
1040 uptokstart[namelen]='\0';
1041 return uptokstart;
1044 /* Read one token, getting characters through lexptr. */
1046 static int
1047 yylex (void)
1049 int c;
1050 int namelen;
1051 const char *tokstart;
1052 char *uptokstart;
1053 const char *tokptr;
1054 int explen, tempbufindex;
1055 static char *tempbuf;
1056 static int tempbufsize;
1058 retry:
1060 pstate->prev_lexptr = pstate->lexptr;
1062 tokstart = pstate->lexptr;
1063 explen = strlen (pstate->lexptr);
1065 /* See if it is a special token of length 3. */
1066 if (explen > 2)
1067 for (const auto &token : tokentab3)
1068 if (strncasecmp (tokstart, token.oper, 3) == 0
1069 && (!isalpha (token.oper[0]) || explen == 3
1070 || (!isalpha (tokstart[3])
1071 && !isdigit (tokstart[3]) && tokstart[3] != '_')))
1073 pstate->lexptr += 3;
1074 yylval.opcode = token.opcode;
1075 return token.token;
1078 /* See if it is a special token of length 2. */
1079 if (explen > 1)
1080 for (const auto &token : tokentab2)
1081 if (strncasecmp (tokstart, token.oper, 2) == 0
1082 && (!isalpha (token.oper[0]) || explen == 2
1083 || (!isalpha (tokstart[2])
1084 && !isdigit (tokstart[2]) && tokstart[2] != '_')))
1086 pstate->lexptr += 2;
1087 yylval.opcode = token.opcode;
1088 return token.token;
1091 switch (c = *tokstart)
1093 case 0:
1094 if (search_field && pstate->parse_completion)
1095 return COMPLETE;
1096 else
1097 return 0;
1099 case ' ':
1100 case '\t':
1101 case '\n':
1102 pstate->lexptr++;
1103 goto retry;
1105 case '\'':
1106 /* We either have a character constant ('0' or '\177' for example)
1107 or we have a quoted symbol reference ('foo(int,int)' in object pascal
1108 for example). */
1109 pstate->lexptr++;
1110 c = *pstate->lexptr++;
1111 if (c == '\\')
1112 c = parse_escape (pstate->gdbarch (), &pstate->lexptr);
1113 else if (c == '\'')
1114 error (_("Empty character constant."));
1116 yylval.typed_val_int.val = c;
1117 yylval.typed_val_int.type = parse_type (pstate)->builtin_char;
1119 c = *pstate->lexptr++;
1120 if (c != '\'')
1122 namelen = skip_quoted (tokstart) - tokstart;
1123 if (namelen > 2)
1125 pstate->lexptr = tokstart + namelen;
1126 if (pstate->lexptr[-1] != '\'')
1127 error (_("Unmatched single quote."));
1128 namelen -= 2;
1129 tokstart++;
1130 uptokstart = uptok(tokstart,namelen);
1131 goto tryname;
1133 error (_("Invalid character constant."));
1135 return INT;
1137 case '(':
1138 paren_depth++;
1139 pstate->lexptr++;
1140 return c;
1142 case ')':
1143 if (paren_depth == 0)
1144 return 0;
1145 paren_depth--;
1146 pstate->lexptr++;
1147 return c;
1149 case ',':
1150 if (pstate->comma_terminates && paren_depth == 0)
1151 return 0;
1152 pstate->lexptr++;
1153 return c;
1155 case '.':
1156 /* Might be a floating point number. */
1157 if (pstate->lexptr[1] < '0' || pstate->lexptr[1] > '9')
1159 goto symbol; /* Nope, must be a symbol. */
1162 /* FALL THRU. */
1164 case '0':
1165 case '1':
1166 case '2':
1167 case '3':
1168 case '4':
1169 case '5':
1170 case '6':
1171 case '7':
1172 case '8':
1173 case '9':
1175 /* It's a number. */
1176 int got_dot = 0, got_e = 0, toktype;
1177 const char *p = tokstart;
1178 int hex = input_radix > 10;
1180 if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
1182 p += 2;
1183 hex = 1;
1185 else if (c == '0' && (p[1]=='t' || p[1]=='T'
1186 || p[1]=='d' || p[1]=='D'))
1188 p += 2;
1189 hex = 0;
1192 for (;; ++p)
1194 /* This test includes !hex because 'e' is a valid hex digit
1195 and thus does not indicate a floating point number when
1196 the radix is hex. */
1197 if (!hex && !got_e && (*p == 'e' || *p == 'E'))
1198 got_dot = got_e = 1;
1199 /* This test does not include !hex, because a '.' always indicates
1200 a decimal floating point number regardless of the radix. */
1201 else if (!got_dot && *p == '.')
1202 got_dot = 1;
1203 else if (got_e && (p[-1] == 'e' || p[-1] == 'E')
1204 && (*p == '-' || *p == '+'))
1205 /* This is the sign of the exponent, not the end of the
1206 number. */
1207 continue;
1208 /* We will take any letters or digits. parse_number will
1209 complain if past the radix, or if L or U are not final. */
1210 else if ((*p < '0' || *p > '9')
1211 && ((*p < 'a' || *p > 'z')
1212 && (*p < 'A' || *p > 'Z')))
1213 break;
1215 toktype = parse_number (pstate, tokstart,
1216 p - tokstart, got_dot | got_e, &yylval);
1217 if (toktype == ERROR)
1219 char *err_copy = (char *) alloca (p - tokstart + 1);
1221 memcpy (err_copy, tokstart, p - tokstart);
1222 err_copy[p - tokstart] = 0;
1223 error (_("Invalid number \"%s\"."), err_copy);
1225 pstate->lexptr = p;
1226 return toktype;
1229 case '+':
1230 case '-':
1231 case '*':
1232 case '/':
1233 case '|':
1234 case '&':
1235 case '^':
1236 case '~':
1237 case '!':
1238 case '@':
1239 case '<':
1240 case '>':
1241 case '[':
1242 case ']':
1243 case '?':
1244 case ':':
1245 case '=':
1246 case '{':
1247 case '}':
1248 symbol:
1249 pstate->lexptr++;
1250 return c;
1252 case '"':
1254 /* Build the gdb internal form of the input string in tempbuf,
1255 translating any standard C escape forms seen. Note that the
1256 buffer is null byte terminated *only* for the convenience of
1257 debugging gdb itself and printing the buffer contents when
1258 the buffer contains no embedded nulls. Gdb does not depend
1259 upon the buffer being null byte terminated, it uses the length
1260 string instead. This allows gdb to handle C strings (as well
1261 as strings in other languages) with embedded null bytes. */
1263 tokptr = ++tokstart;
1264 tempbufindex = 0;
1266 do {
1267 /* Grow the static temp buffer if necessary, including allocating
1268 the first one on demand. */
1269 if (tempbufindex + 1 >= tempbufsize)
1271 tempbuf = (char *) realloc (tempbuf, tempbufsize += 64);
1274 switch (*tokptr)
1276 case '\0':
1277 case '"':
1278 /* Do nothing, loop will terminate. */
1279 break;
1280 case '\\':
1281 ++tokptr;
1282 c = parse_escape (pstate->gdbarch (), &tokptr);
1283 if (c == -1)
1285 continue;
1287 tempbuf[tempbufindex++] = c;
1288 break;
1289 default:
1290 tempbuf[tempbufindex++] = *tokptr++;
1291 break;
1293 } while ((*tokptr != '"') && (*tokptr != '\0'));
1294 if (*tokptr++ != '"')
1296 error (_("Unterminated string in expression."));
1298 tempbuf[tempbufindex] = '\0'; /* See note above. */
1299 yylval.sval.ptr = tempbuf;
1300 yylval.sval.length = tempbufindex;
1301 pstate->lexptr = tokptr;
1302 return (STRING);
1305 if (!(c == '_' || c == '$'
1306 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
1307 /* We must have come across a bad character (e.g. ';'). */
1308 error (_("Invalid character '%c' in expression."), c);
1310 /* It's a name. See how long it is. */
1311 namelen = 0;
1312 for (c = tokstart[namelen];
1313 (c == '_' || c == '$' || (c >= '0' && c <= '9')
1314 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '<');)
1316 /* Template parameter lists are part of the name.
1317 FIXME: This mishandles `print $a<4&&$a>3'. */
1318 if (c == '<')
1320 int i = namelen;
1321 int nesting_level = 1;
1322 while (tokstart[++i])
1324 if (tokstart[i] == '<')
1325 nesting_level++;
1326 else if (tokstart[i] == '>')
1328 if (--nesting_level == 0)
1329 break;
1332 if (tokstart[i] == '>')
1333 namelen = i;
1334 else
1335 break;
1338 /* do NOT uppercase internals because of registers !!! */
1339 c = tokstart[++namelen];
1342 uptokstart = uptok(tokstart,namelen);
1344 /* The token "if" terminates the expression and is NOT
1345 removed from the input stream. */
1346 if (namelen == 2 && uptokstart[0] == 'I' && uptokstart[1] == 'F')
1348 free (uptokstart);
1349 return 0;
1352 pstate->lexptr += namelen;
1354 tryname:
1356 /* Catch specific keywords. Should be done with a data structure. */
1357 switch (namelen)
1359 case 6:
1360 if (strcmp (uptokstart, "OBJECT") == 0)
1362 free (uptokstart);
1363 return CLASS;
1365 if (strcmp (uptokstart, "RECORD") == 0)
1367 free (uptokstart);
1368 return STRUCT;
1370 if (strcmp (uptokstart, "SIZEOF") == 0)
1372 free (uptokstart);
1373 return SIZEOF;
1375 break;
1376 case 5:
1377 if (strcmp (uptokstart, "CLASS") == 0)
1379 free (uptokstart);
1380 return CLASS;
1382 if (strcmp (uptokstart, "FALSE") == 0)
1384 yylval.lval = 0;
1385 free (uptokstart);
1386 return FALSEKEYWORD;
1388 break;
1389 case 4:
1390 if (strcmp (uptokstart, "TRUE") == 0)
1392 yylval.lval = 1;
1393 free (uptokstart);
1394 return TRUEKEYWORD;
1396 if (strcmp (uptokstart, "SELF") == 0)
1398 /* Here we search for 'this' like
1399 inserted in FPC stabs debug info. */
1400 static const char this_name[] = "this";
1402 if (lookup_symbol (this_name, pstate->expression_context_block,
1403 VAR_DOMAIN, NULL).symbol)
1405 free (uptokstart);
1406 return THIS;
1409 break;
1410 default:
1411 break;
1414 yylval.sval.ptr = tokstart;
1415 yylval.sval.length = namelen;
1417 if (*tokstart == '$')
1419 free (uptokstart);
1420 return DOLLAR_VARIABLE;
1423 /* Use token-type BLOCKNAME for symbols that happen to be defined as
1424 functions or symtabs. If this is not so, then ...
1425 Use token-type TYPENAME for symbols that happen to be defined
1426 currently as names of types; NAME for other symbols.
1427 The caller is not constrained to care about the distinction. */
1429 std::string tmp = copy_name (yylval.sval);
1430 struct symbol *sym;
1431 struct field_of_this_result is_a_field_of_this;
1432 int is_a_field = 0;
1433 int hextype;
1435 is_a_field_of_this.type = NULL;
1436 if (search_field && current_type)
1437 is_a_field = (lookup_struct_elt_type (current_type,
1438 tmp.c_str (), 1) != NULL);
1439 if (is_a_field)
1440 sym = NULL;
1441 else
1442 sym = lookup_symbol (tmp.c_str (), pstate->expression_context_block,
1443 VAR_DOMAIN, &is_a_field_of_this).symbol;
1444 /* second chance uppercased (as Free Pascal does). */
1445 if (!sym && is_a_field_of_this.type == NULL && !is_a_field)
1447 for (int i = 0; i <= namelen; i++)
1449 if ((tmp[i] >= 'a' && tmp[i] <= 'z'))
1450 tmp[i] -= ('a'-'A');
1452 if (search_field && current_type)
1453 is_a_field = (lookup_struct_elt_type (current_type,
1454 tmp.c_str (), 1) != NULL);
1455 if (is_a_field)
1456 sym = NULL;
1457 else
1458 sym = lookup_symbol (tmp.c_str (), pstate->expression_context_block,
1459 VAR_DOMAIN, &is_a_field_of_this).symbol;
1461 /* Third chance Capitalized (as GPC does). */
1462 if (!sym && is_a_field_of_this.type == NULL && !is_a_field)
1464 for (int i = 0; i <= namelen; i++)
1466 if (i == 0)
1468 if ((tmp[i] >= 'a' && tmp[i] <= 'z'))
1469 tmp[i] -= ('a'-'A');
1471 else
1472 if ((tmp[i] >= 'A' && tmp[i] <= 'Z'))
1473 tmp[i] -= ('A'-'a');
1475 if (search_field && current_type)
1476 is_a_field = (lookup_struct_elt_type (current_type,
1477 tmp.c_str (), 1) != NULL);
1478 if (is_a_field)
1479 sym = NULL;
1480 else
1481 sym = lookup_symbol (tmp.c_str (), pstate->expression_context_block,
1482 VAR_DOMAIN, &is_a_field_of_this).symbol;
1485 if (is_a_field || (is_a_field_of_this.type != NULL))
1487 tempbuf = (char *) realloc (tempbuf, namelen + 1);
1488 strncpy (tempbuf, tmp.c_str (), namelen);
1489 tempbuf [namelen] = 0;
1490 yylval.sval.ptr = tempbuf;
1491 yylval.sval.length = namelen;
1492 yylval.ssym.sym.symbol = NULL;
1493 yylval.ssym.sym.block = NULL;
1494 free (uptokstart);
1495 yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
1496 if (is_a_field)
1497 return FIELDNAME;
1498 else
1499 return NAME;
1501 /* Call lookup_symtab, not lookup_partial_symtab, in case there are
1502 no psymtabs (coff, xcoff, or some future change to blow away the
1503 psymtabs once once symbols are read). */
1504 if ((sym && sym->aclass () == LOC_BLOCK)
1505 || lookup_symtab (tmp.c_str ()))
1507 yylval.ssym.sym.symbol = sym;
1508 yylval.ssym.sym.block = NULL;
1509 yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
1510 free (uptokstart);
1511 return BLOCKNAME;
1513 if (sym && sym->aclass () == LOC_TYPEDEF)
1515 #if 1
1516 /* Despite the following flaw, we need to keep this code enabled.
1517 Because we can get called from check_stub_method, if we don't
1518 handle nested types then it screws many operations in any
1519 program which uses nested types. */
1520 /* In "A::x", if x is a member function of A and there happens
1521 to be a type (nested or not, since the stabs don't make that
1522 distinction) named x, then this code incorrectly thinks we
1523 are dealing with nested types rather than a member function. */
1525 const char *p;
1526 const char *namestart;
1527 struct symbol *best_sym;
1529 /* Look ahead to detect nested types. This probably should be
1530 done in the grammar, but trying seemed to introduce a lot
1531 of shift/reduce and reduce/reduce conflicts. It's possible
1532 that it could be done, though. Or perhaps a non-grammar, but
1533 less ad hoc, approach would work well. */
1535 /* Since we do not currently have any way of distinguishing
1536 a nested type from a non-nested one (the stabs don't tell
1537 us whether a type is nested), we just ignore the
1538 containing type. */
1540 p = pstate->lexptr;
1541 best_sym = sym;
1542 while (1)
1544 /* Skip whitespace. */
1545 while (*p == ' ' || *p == '\t' || *p == '\n')
1546 ++p;
1547 if (*p == ':' && p[1] == ':')
1549 /* Skip the `::'. */
1550 p += 2;
1551 /* Skip whitespace. */
1552 while (*p == ' ' || *p == '\t' || *p == '\n')
1553 ++p;
1554 namestart = p;
1555 while (*p == '_' || *p == '$' || (*p >= '0' && *p <= '9')
1556 || (*p >= 'a' && *p <= 'z')
1557 || (*p >= 'A' && *p <= 'Z'))
1558 ++p;
1559 if (p != namestart)
1561 struct symbol *cur_sym;
1562 /* As big as the whole rest of the expression, which is
1563 at least big enough. */
1564 char *ncopy
1565 = (char *) alloca (tmp.size () + strlen (namestart)
1566 + 3);
1567 char *tmp1;
1569 tmp1 = ncopy;
1570 memcpy (tmp1, tmp.c_str (), tmp.size ());
1571 tmp1 += tmp.size ();
1572 memcpy (tmp1, "::", 2);
1573 tmp1 += 2;
1574 memcpy (tmp1, namestart, p - namestart);
1575 tmp1[p - namestart] = '\0';
1576 cur_sym
1577 = lookup_symbol (ncopy,
1578 pstate->expression_context_block,
1579 VAR_DOMAIN, NULL).symbol;
1580 if (cur_sym)
1582 if (cur_sym->aclass () == LOC_TYPEDEF)
1584 best_sym = cur_sym;
1585 pstate->lexptr = p;
1587 else
1588 break;
1590 else
1591 break;
1593 else
1594 break;
1596 else
1597 break;
1600 yylval.tsym.type = best_sym->type ();
1601 #else /* not 0 */
1602 yylval.tsym.type = sym->type ();
1603 #endif /* not 0 */
1604 free (uptokstart);
1605 return TYPENAME;
1607 yylval.tsym.type
1608 = language_lookup_primitive_type (pstate->language (),
1609 pstate->gdbarch (), tmp.c_str ());
1610 if (yylval.tsym.type != NULL)
1612 free (uptokstart);
1613 return TYPENAME;
1616 /* Input names that aren't symbols but ARE valid hex numbers,
1617 when the input radix permits them, can be names or numbers
1618 depending on the parse. Note we support radixes > 16 here. */
1619 if (!sym
1620 && ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10)
1621 || (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
1623 YYSTYPE newlval; /* Its value is ignored. */
1624 hextype = parse_number (pstate, tokstart, namelen, 0, &newlval);
1625 if (hextype == INT)
1627 yylval.ssym.sym.symbol = sym;
1628 yylval.ssym.sym.block = NULL;
1629 yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
1630 free (uptokstart);
1631 return NAME_OR_INT;
1635 free(uptokstart);
1636 /* Any other kind of symbol. */
1637 yylval.ssym.sym.symbol = sym;
1638 yylval.ssym.sym.block = NULL;
1639 return NAME;
1643 /* See language.h. */
1646 pascal_language::parser (struct parser_state *par_state) const
1648 /* Setting up the parser state. */
1649 scoped_restore pstate_restore = make_scoped_restore (&pstate);
1650 gdb_assert (par_state != NULL);
1651 pstate = par_state;
1652 paren_depth = 0;
1654 int result = yyparse ();
1655 if (!result)
1656 pstate->set_operation (pstate->pop ());
1657 return result;
1660 static void
1661 yyerror (const char *msg)
1663 if (pstate->prev_lexptr)
1664 pstate->lexptr = pstate->prev_lexptr;
1666 error (_("A %s in expression, near `%s'."), msg, pstate->lexptr);