1 /* YACC parser for C expressions, for GDB.
2 Copyright (C) 1986, 1989, 1990, 1991 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 2 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, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20 /* Parse a C expression from text in a string,
21 and return the result as a struct expression pointer.
22 That structure contains arithmetic operations in reverse polish,
23 with constants represented by operations that are followed by special data.
24 See expression.h for the details of the format.
25 What is important here is that it can be built up sequentially
26 during the process of parsing; the lower levels of the tree always
27 come first in the result. */
37 #include "expression.h"
38 #include "parser-defs.h"
42 /* These MUST be included in any grammar file!!!!
43 Please choose unique names! */
44 #define yyparse c_parse
46 #define yyerror c_error
49 #define yydebug c_debug
58 #define yyerrflag c_errflag
59 #define yynerrs c_nerrs
63 #define yystate c_state
71 static int parse_number ();
74 /* #define YYDEBUG 1 */
78 /* Although the yacc "value" of an expression is not used,
79 since the result is stored in the structure being created,
80 other node types do have values. */
85 unsigned LONGEST ulval;
94 enum exp_opcode opcode;
95 struct internalvar *ivar;
101 %type <voidval> exp exp1 type_exp start variable
102 %type <tval> type typebase
103 %type <tvec> nonempty_typelist
104 /* %type <bval> block */
106 /* Fancy type parsing. */
107 %type <voidval> func_mod direct_abs_decl abs_decl
109 %type <lval> array_mod
111 %token <lval> INT CHAR
115 /* Both NAME and TYPENAME tokens represent symbols in the input,
116 and both convey their data as strings.
117 But a TYPENAME is a string that happens to be defined as a typedef
118 or builtin type name (such as int or char)
119 and a NAME is any other symbol.
120 Contexts where this distinction is not important can use the
121 nonterminal "name", which matches either NAME or TYPENAME. */
124 %token <ssym> NAME /* BLOCKNAME defined below to give it higher precedence. */
125 %token <tsym> TYPENAME
127 %type <ssym> name_not_typename
128 %type <tsym> typename
130 /* A NAME_OR_INT is a symbol which is not known in the symbol table,
131 but which would parse as a valid number in the current input radix.
132 E.g. "c" when input_radix==16. Depending on the parse, it will be
133 turned into a name or into a number. NAME_OR_UINT ditto. */
135 %token <ssym> NAME_OR_INT NAME_OR_UINT
137 %token STRUCT UNION ENUM SIZEOF UNSIGNED COLONCOLON
141 /* Special type cases, put in to allow the parser to distinguish different
143 %token SIGNED LONG SHORT INT_KEYWORD
145 %token <lval> LAST REGNAME
147 %token <ivar> VARIABLE
149 %token <opcode> ASSIGN_MODIFY
156 %right '=' ASSIGN_MODIFY
164 %left '<' '>' LEQ GEQ
169 %right UNARY INCREMENT DECREMENT
170 %right ARROW '.' '[' '('
171 %token <ssym> BLOCKNAME
182 { write_exp_elt_opcode(OP_TYPE);
183 write_exp_elt_type($1);
184 write_exp_elt_opcode(OP_TYPE);}
187 /* Expressions, including the comma operator. */
190 { write_exp_elt_opcode (BINOP_COMMA); }
193 /* Expressions, not including the comma operator. */
194 exp : '*' exp %prec UNARY
195 { write_exp_elt_opcode (UNOP_IND); }
197 exp : '&' exp %prec UNARY
198 { write_exp_elt_opcode (UNOP_ADDR); }
200 exp : '-' exp %prec UNARY
201 { write_exp_elt_opcode (UNOP_NEG); }
204 exp : '!' exp %prec UNARY
205 { write_exp_elt_opcode (UNOP_ZEROP); }
208 exp : '~' exp %prec UNARY
209 { write_exp_elt_opcode (UNOP_LOGNOT); }
212 exp : INCREMENT exp %prec UNARY
213 { write_exp_elt_opcode (UNOP_PREINCREMENT); }
216 exp : DECREMENT exp %prec UNARY
217 { write_exp_elt_opcode (UNOP_PREDECREMENT); }
220 exp : exp INCREMENT %prec UNARY
221 { write_exp_elt_opcode (UNOP_POSTINCREMENT); }
224 exp : exp DECREMENT %prec UNARY
225 { write_exp_elt_opcode (UNOP_POSTDECREMENT); }
228 exp : SIZEOF exp %prec UNARY
229 { write_exp_elt_opcode (UNOP_SIZEOF); }
233 { write_exp_elt_opcode (STRUCTOP_PTR);
234 write_exp_string ($3);
235 write_exp_elt_opcode (STRUCTOP_PTR); }
238 exp : exp ARROW '*' exp
239 { write_exp_elt_opcode (STRUCTOP_MPTR); }
243 { write_exp_elt_opcode (STRUCTOP_STRUCT);
244 write_exp_string ($3);
245 write_exp_elt_opcode (STRUCTOP_STRUCT); }
248 exp : exp '.' '*' exp
249 { write_exp_elt_opcode (STRUCTOP_MEMBER); }
252 exp : exp '[' exp1 ']'
253 { write_exp_elt_opcode (BINOP_SUBSCRIPT); }
257 /* This is to save the value of arglist_len
258 being accumulated by an outer function call. */
259 { start_arglist (); }
260 arglist ')' %prec ARROW
261 { write_exp_elt_opcode (OP_FUNCALL);
262 write_exp_elt_longcst ((LONGEST) end_arglist ());
263 write_exp_elt_opcode (OP_FUNCALL); }
273 arglist : arglist ',' exp %prec ABOVE_COMMA
277 exp : '{' type '}' exp %prec UNARY
278 { write_exp_elt_opcode (UNOP_MEMVAL);
279 write_exp_elt_type ($2);
280 write_exp_elt_opcode (UNOP_MEMVAL); }
283 exp : '(' type ')' exp %prec UNARY
284 { write_exp_elt_opcode (UNOP_CAST);
285 write_exp_elt_type ($2);
286 write_exp_elt_opcode (UNOP_CAST); }
293 /* Binary operators in order of decreasing precedence. */
296 { write_exp_elt_opcode (BINOP_REPEAT); }
300 { write_exp_elt_opcode (BINOP_MUL); }
304 { write_exp_elt_opcode (BINOP_DIV); }
308 { write_exp_elt_opcode (BINOP_REM); }
312 { write_exp_elt_opcode (BINOP_ADD); }
316 { write_exp_elt_opcode (BINOP_SUB); }
320 { write_exp_elt_opcode (BINOP_LSH); }
324 { write_exp_elt_opcode (BINOP_RSH); }
328 { write_exp_elt_opcode (BINOP_EQUAL); }
331 exp : exp NOTEQUAL exp
332 { write_exp_elt_opcode (BINOP_NOTEQUAL); }
336 { write_exp_elt_opcode (BINOP_LEQ); }
340 { write_exp_elt_opcode (BINOP_GEQ); }
344 { write_exp_elt_opcode (BINOP_LESS); }
348 { write_exp_elt_opcode (BINOP_GTR); }
352 { write_exp_elt_opcode (BINOP_LOGAND); }
356 { write_exp_elt_opcode (BINOP_LOGXOR); }
360 { write_exp_elt_opcode (BINOP_LOGIOR); }
364 { write_exp_elt_opcode (BINOP_AND); }
368 { write_exp_elt_opcode (BINOP_OR); }
371 exp : exp '?' exp ':' exp %prec '?'
372 { write_exp_elt_opcode (TERNOP_COND); }
376 { write_exp_elt_opcode (BINOP_ASSIGN); }
379 exp : exp ASSIGN_MODIFY exp
380 { write_exp_elt_opcode (BINOP_ASSIGN_MODIFY);
381 write_exp_elt_opcode ($2);
382 write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); }
386 { write_exp_elt_opcode (OP_LONG);
387 if ($1 == (int) $1 || $1 == (unsigned int) $1)
388 write_exp_elt_type (builtin_type_int);
390 write_exp_elt_type (BUILTIN_TYPE_LONGEST);
391 write_exp_elt_longcst ((LONGEST) $1);
392 write_exp_elt_opcode (OP_LONG); }
397 parse_number ($1.stoken.ptr, $1.stoken.length, 0, &val);
398 write_exp_elt_opcode (OP_LONG);
399 if (val.lval == (int) val.lval ||
400 val.lval == (unsigned int) val.lval)
401 write_exp_elt_type (builtin_type_int);
403 write_exp_elt_type (BUILTIN_TYPE_LONGEST);
404 write_exp_elt_longcst (val.lval);
405 write_exp_elt_opcode (OP_LONG); }
410 write_exp_elt_opcode (OP_LONG);
411 if ($1 == (unsigned int) $1)
412 write_exp_elt_type (builtin_type_unsigned_int);
414 write_exp_elt_type (BUILTIN_TYPE_UNSIGNED_LONGEST);
415 write_exp_elt_longcst ((LONGEST) $1);
416 write_exp_elt_opcode (OP_LONG);
422 parse_number ($1.stoken.ptr, $1.stoken.length, 0, &val);
423 write_exp_elt_opcode (OP_LONG);
424 if (val.ulval == (unsigned int) val.ulval)
425 write_exp_elt_type (builtin_type_unsigned_int);
427 write_exp_elt_type (BUILTIN_TYPE_UNSIGNED_LONGEST);
428 write_exp_elt_longcst ((LONGEST)val.ulval);
429 write_exp_elt_opcode (OP_LONG);
434 { write_exp_elt_opcode (OP_LONG);
435 write_exp_elt_type (builtin_type_char);
436 write_exp_elt_longcst ((LONGEST) $1);
437 write_exp_elt_opcode (OP_LONG); }
441 { write_exp_elt_opcode (OP_DOUBLE);
442 write_exp_elt_type (builtin_type_double);
443 write_exp_elt_dblcst ($1);
444 write_exp_elt_opcode (OP_DOUBLE); }
451 { write_exp_elt_opcode (OP_LAST);
452 write_exp_elt_longcst ((LONGEST) $1);
453 write_exp_elt_opcode (OP_LAST); }
457 { write_exp_elt_opcode (OP_REGISTER);
458 write_exp_elt_longcst ((LONGEST) $1);
459 write_exp_elt_opcode (OP_REGISTER); }
463 { write_exp_elt_opcode (OP_INTERNALVAR);
464 write_exp_elt_intern ($1);
465 write_exp_elt_opcode (OP_INTERNALVAR); }
468 exp : SIZEOF '(' type ')' %prec UNARY
469 { write_exp_elt_opcode (OP_LONG);
470 write_exp_elt_type (builtin_type_int);
471 write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3));
472 write_exp_elt_opcode (OP_LONG); }
476 { write_exp_elt_opcode (OP_STRING);
477 write_exp_string ($1);
478 write_exp_elt_opcode (OP_STRING); }
483 { write_exp_elt_opcode (OP_THIS);
484 write_exp_elt_opcode (OP_THIS); }
492 $$ = SYMBOL_BLOCK_VALUE ($1.sym);
496 lookup_symtab (copy_name ($1.stoken));
498 $$ = BLOCKVECTOR_BLOCK
499 (BLOCKVECTOR (tem), STATIC_BLOCK);
501 error ("No file or function \"%s\".",
502 copy_name ($1.stoken));
507 block : block COLONCOLON name
509 = lookup_symbol (copy_name ($3), $1,
510 VAR_NAMESPACE, 0, NULL);
511 if (!tem || SYMBOL_CLASS (tem) != LOC_BLOCK)
512 error ("No function \"%s\" in specified context.",
514 $$ = SYMBOL_BLOCK_VALUE (tem); }
517 variable: block COLONCOLON name
518 { struct symbol *sym;
519 sym = lookup_symbol (copy_name ($3), $1,
520 VAR_NAMESPACE, 0, NULL);
522 error ("No symbol \"%s\" in specified context.",
525 write_exp_elt_opcode (OP_VAR_VALUE);
526 write_exp_elt_sym (sym);
527 write_exp_elt_opcode (OP_VAR_VALUE); }
530 variable: typebase COLONCOLON name
532 struct type *type = $1;
533 if (TYPE_CODE (type) != TYPE_CODE_STRUCT
534 && TYPE_CODE (type) != TYPE_CODE_UNION)
535 error ("`%s' is not defined as an aggregate type.",
538 write_exp_elt_opcode (OP_SCOPE);
539 write_exp_elt_type (type);
540 write_exp_string ($3);
541 write_exp_elt_opcode (OP_SCOPE);
543 | typebase COLONCOLON '~' name
545 struct type *type = $1;
546 if (TYPE_CODE (type) != TYPE_CODE_STRUCT
547 && TYPE_CODE (type) != TYPE_CODE_UNION)
548 error ("`%s' is not defined as an aggregate type.",
551 if (strcmp (type_name_no_tag (type), $4.ptr))
552 error ("invalid destructor `%s::~%s'",
553 type_name_no_tag (type), $4.ptr);
555 write_exp_elt_opcode (OP_SCOPE);
556 write_exp_elt_type (type);
557 write_exp_string ($4);
558 write_exp_elt_opcode (OP_SCOPE);
559 write_exp_elt_opcode (UNOP_LOGNOT);
563 char *name = copy_name ($2);
568 lookup_symbol (name, 0, VAR_NAMESPACE, 0, NULL);
571 write_exp_elt_opcode (OP_VAR_VALUE);
572 write_exp_elt_sym (sym);
573 write_exp_elt_opcode (OP_VAR_VALUE);
576 for (i = 0; i < misc_function_count; i++)
577 if (!strcmp (misc_function_vector[i].name, name))
580 if (i < misc_function_count)
582 enum misc_function_type mft =
583 misc_function_vector[i].type;
585 write_exp_elt_opcode (OP_LONG);
586 write_exp_elt_type (builtin_type_int);
587 write_exp_elt_longcst ((LONGEST) misc_function_vector[i].address);
588 write_exp_elt_opcode (OP_LONG);
589 write_exp_elt_opcode (UNOP_MEMVAL);
590 if (mft == mf_data || mft == mf_bss)
591 write_exp_elt_type (builtin_type_int);
592 else if (mft == mf_text)
593 write_exp_elt_type (lookup_function_type (builtin_type_int));
595 write_exp_elt_type (builtin_type_char);
596 write_exp_elt_opcode (UNOP_MEMVAL);
600 && partial_symtab_list == 0)
601 error ("No symbol table is loaded. Use the \"file\" command.");
603 error ("No symbol \"%s\" in current context.", name);
607 variable: name_not_typename
608 { struct symbol *sym = $1.sym;
612 switch (SYMBOL_CLASS (sym))
620 if (innermost_block == 0 ||
621 contained_in (block_found,
623 innermost_block = block_found;
630 case LOC_CONST_BYTES:
632 /* In this case the expression can
633 be evaluated regardless of what
634 frame we are in, so there is no
635 need to check for the
636 innermost_block. These cases are
637 listed so that gcc -Wall will
638 report types that may not have
643 write_exp_elt_opcode (OP_VAR_VALUE);
644 write_exp_elt_sym (sym);
645 write_exp_elt_opcode (OP_VAR_VALUE);
647 else if ($1.is_a_field_of_this)
649 /* C++: it hangs off of `this'. Must
650 not inadvertently convert from a method call
652 if (innermost_block == 0 ||
653 contained_in (block_found, innermost_block))
654 innermost_block = block_found;
655 write_exp_elt_opcode (OP_THIS);
656 write_exp_elt_opcode (OP_THIS);
657 write_exp_elt_opcode (STRUCTOP_PTR);
658 write_exp_string ($1.stoken);
659 write_exp_elt_opcode (STRUCTOP_PTR);
664 register char *arg = copy_name ($1.stoken);
666 /* FIXME, this search is linear! At least
667 optimize the strcmp with a 1-char cmp... */
668 for (i = 0; i < misc_function_count; i++)
669 if (!strcmp (misc_function_vector[i].name, arg))
672 if (i < misc_function_count)
674 enum misc_function_type mft =
675 misc_function_vector[i].type;
677 write_exp_elt_opcode (OP_LONG);
678 write_exp_elt_type (builtin_type_int);
679 write_exp_elt_longcst ((LONGEST) misc_function_vector[i].address);
680 write_exp_elt_opcode (OP_LONG);
681 write_exp_elt_opcode (UNOP_MEMVAL);
682 if (mft == mf_data || mft == mf_bss)
683 write_exp_elt_type (builtin_type_int);
684 else if (mft == mf_text)
685 write_exp_elt_type (lookup_function_type (builtin_type_int));
687 write_exp_elt_type (builtin_type_char);
688 write_exp_elt_opcode (UNOP_MEMVAL);
690 else if (symtab_list == 0
691 && partial_symtab_list == 0)
692 error ("No symbol table is loaded. Use the \"file\" command.");
694 error ("No symbol \"%s\" in current context.",
695 copy_name ($1.stoken));
704 /* This is where the interesting stuff happens. */
707 struct type *follow_type = $1;
716 follow_type = lookup_pointer_type (follow_type);
719 follow_type = lookup_reference_type (follow_type);
722 array_size = pop_type_int ();
723 if (array_size != -1)
724 follow_type = create_array_type (follow_type,
727 follow_type = lookup_pointer_type (follow_type);
730 follow_type = lookup_function_type (follow_type);
738 { push_type (tp_pointer); $$ = 0; }
740 { push_type (tp_pointer); $$ = $2; }
742 { push_type (tp_reference); $$ = 0; }
744 { push_type (tp_reference); $$ = $2; }
748 direct_abs_decl: '(' abs_decl ')'
750 | direct_abs_decl array_mod
753 push_type (tp_array);
758 push_type (tp_array);
761 | direct_abs_decl func_mod
762 { push_type (tp_function); }
764 { push_type (tp_function); }
775 | '(' nonempty_typelist ')'
776 { free ($2); $$ = 0; }
780 | typebase COLONCOLON '*'
781 { $$ = lookup_member_type (builtin_type_int, $1); }
782 | type '(' typebase COLONCOLON '*' ')'
783 { $$ = lookup_member_type ($1, $3); }
784 | type '(' typebase COLONCOLON '*' ')' '(' ')'
785 { $$ = lookup_member_type
786 (lookup_function_type ($1), $3); }
787 | type '(' typebase COLONCOLON '*' ')' '(' nonempty_typelist ')'
788 { $$ = lookup_member_type
789 (lookup_function_type ($1), $3);
797 { $$ = builtin_type_int; }
799 { $$ = builtin_type_long; }
801 { $$ = builtin_type_short; }
803 { $$ = builtin_type_long; }
804 | UNSIGNED LONG INT_KEYWORD
805 { $$ = builtin_type_unsigned_long; }
807 { $$ = builtin_type_long_long; }
808 | LONG LONG INT_KEYWORD
809 { $$ = builtin_type_long_long; }
811 { $$ = builtin_type_unsigned_long_long; }
812 | UNSIGNED LONG LONG INT_KEYWORD
813 { $$ = builtin_type_unsigned_long_long; }
815 { $$ = builtin_type_short; }
816 | UNSIGNED SHORT INT_KEYWORD
817 { $$ = builtin_type_unsigned_short; }
819 { $$ = lookup_struct (copy_name ($2),
820 expression_context_block); }
822 { $$ = lookup_union (copy_name ($2),
823 expression_context_block); }
825 { $$ = lookup_enum (copy_name ($2),
826 expression_context_block); }
828 { $$ = lookup_unsigned_typename (TYPE_NAME($2.type)); }
830 { $$ = builtin_type_unsigned_int; }
834 { $$ = builtin_type_int; }
835 | TEMPLATE name '<' type '>'
836 { $$ = lookup_template_type(copy_name($2), $4,
837 expression_context_block);
844 $$.stoken.ptr = "int";
845 $$.stoken.length = 3;
846 $$.type = builtin_type_int;
850 $$.stoken.ptr = "long";
851 $$.stoken.length = 4;
852 $$.type = builtin_type_long;
856 $$.stoken.ptr = "short";
857 $$.stoken.length = 5;
858 $$.type = builtin_type_short;
864 { $$ = (struct type **)xmalloc (sizeof (struct type *) * 2);
865 $$[0] = (struct type *)0;
868 | nonempty_typelist ',' type
869 { int len = sizeof (struct type *) * ++($<ivec>1[0]);
870 $$ = (struct type **)xrealloc ($1, len);
871 $$[$<ivec>$[0]] = $3;
875 name : NAME { $$ = $1.stoken; }
876 | BLOCKNAME { $$ = $1.stoken; }
877 | TYPENAME { $$ = $1.stoken; }
878 | NAME_OR_INT { $$ = $1.stoken; }
879 | NAME_OR_UINT { $$ = $1.stoken; }
882 name_not_typename : NAME
884 /* These would be useful if name_not_typename was useful, but it is just
885 a fake for "variable", so these cause reduce/reduce conflicts because
886 the parser can't tell whether NAME_OR_INT is a name_not_typename (=variable,
887 =exp) or just an exp. If name_not_typename was ever used in an lvalue
888 context where only a name could occur, this might be useful.
896 /* Take care of parsing a number (anything that starts with a digit).
897 Set yylval and return the token type; update lexptr.
898 LEN is the number of characters in it. */
900 /*** Needs some error checking for the float case ***/
903 parse_number (p, len, parsed_float, putithere)
909 register LONGEST n = 0;
910 register LONGEST prevn = 0;
913 register int base = input_radix;
916 extern double atof ();
920 /* It's a float since it contains a point or an exponent. */
921 putithere->dval = atof (p);
925 /* Handle base-switching prefixes 0x, 0t, 0d, 0 */
959 if (c >= 'A' && c <= 'Z')
961 if (c != 'l' && c != 'u')
963 if (c >= '0' && c <= '9')
967 if (base > 10 && c >= 'a' && c <= 'f')
968 n += i = c - 'a' + 10;
969 else if (len == 0 && c == 'l')
971 else if (len == 0 && c == 'u')
974 return ERROR; /* Char not a digit */
977 return ERROR; /* Invalid digit in this base */
978 if(!unsigned_p && (prevn >= n))
979 unsigned_p=1; /* Try something unsigned */
980 /* Don't do the range check if n==i and i==0, since that special
981 case will give an overflow error. */
982 if(RANGE_CHECK && n!=0)
984 if((unsigned_p && (unsigned)prevn >= (unsigned)n))
985 range_error("Overflow on numeric constant.");
992 putithere->ulval = n;
1006 enum exp_opcode opcode;
1009 const static struct token tokentab3[] =
1011 {">>=", ASSIGN_MODIFY, BINOP_RSH},
1012 {"<<=", ASSIGN_MODIFY, BINOP_LSH}
1015 const static struct token tokentab2[] =
1017 {"+=", ASSIGN_MODIFY, BINOP_ADD},
1018 {"-=", ASSIGN_MODIFY, BINOP_SUB},
1019 {"*=", ASSIGN_MODIFY, BINOP_MUL},
1020 {"/=", ASSIGN_MODIFY, BINOP_DIV},
1021 {"%=", ASSIGN_MODIFY, BINOP_REM},
1022 {"|=", ASSIGN_MODIFY, BINOP_LOGIOR},
1023 {"&=", ASSIGN_MODIFY, BINOP_LOGAND},
1024 {"^=", ASSIGN_MODIFY, BINOP_LOGXOR},
1025 {"++", INCREMENT, BINOP_END},
1026 {"--", DECREMENT, BINOP_END},
1027 {"->", ARROW, BINOP_END},
1028 {"&&", AND, BINOP_END},
1029 {"||", OR, BINOP_END},
1030 {"::", COLONCOLON, BINOP_END},
1031 {"<<", LSH, BINOP_END},
1032 {">>", RSH, BINOP_END},
1033 {"==", EQUAL, BINOP_END},
1034 {"!=", NOTEQUAL, BINOP_END},
1035 {"<=", LEQ, BINOP_END},
1036 {">=", GEQ, BINOP_END}
1039 /* Read one token, getting characters through lexptr. */
1045 register int namelen;
1046 register unsigned i;
1047 register char *tokstart;
1052 /* See if it is a special token of length 3. */
1053 for (i = 0; i < sizeof tokentab3 / sizeof tokentab3[0]; i++)
1054 if (!strncmp (tokstart, tokentab3[i].operator, 3))
1057 yylval.opcode = tokentab3[i].opcode;
1058 return tokentab3[i].token;
1061 /* See if it is a special token of length 2. */
1062 for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++)
1063 if (!strncmp (tokstart, tokentab2[i].operator, 2))
1066 yylval.opcode = tokentab2[i].opcode;
1067 return tokentab2[i].token;
1070 switch (c = *tokstart)
1085 c = parse_escape (&lexptr);
1089 error ("Invalid character constant.");
1098 if (paren_depth == 0)
1105 if (comma_terminates && paren_depth == 0)
1111 /* Might be a floating point number. */
1112 if (lexptr[1] < '0' || lexptr[1] > '9')
1113 goto symbol; /* Nope, must be a symbol. */
1114 /* FALL THRU into number case. */
1127 /* It's a number. */
1128 int got_dot = 0, got_e = 0, toktype;
1129 register char *p = tokstart;
1130 int hex = input_radix > 10;
1132 if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
1137 else if (c == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D'))
1145 if (!hex && !got_e && (*p == 'e' || *p == 'E'))
1146 got_dot = got_e = 1;
1147 else if (!hex && !got_dot && *p == '.')
1149 else if (got_e && (p[-1] == 'e' || p[-1] == 'E')
1150 && (*p == '-' || *p == '+'))
1151 /* This is the sign of the exponent, not the end of the
1154 /* We will take any letters or digits. parse_number will
1155 complain if past the radix, or if L or U are not final. */
1156 else if ((*p < '0' || *p > '9')
1157 && ((*p < 'a' || *p > 'z')
1158 && (*p < 'A' || *p > 'Z')))
1161 toktype = parse_number (tokstart, p - tokstart, got_dot|got_e, &yylval);
1162 if (toktype == ERROR)
1164 char *err_copy = (char *) alloca (p - tokstart + 1);
1166 bcopy (tokstart, err_copy, p - tokstart);
1167 err_copy[p - tokstart] = 0;
1168 error ("Invalid number \"%s\".", err_copy);
1199 for (namelen = 1; (c = tokstart[namelen]) != '"'; namelen++)
1202 c = tokstart[++namelen];
1203 if (c >= '0' && c <= '9')
1205 c = tokstart[++namelen];
1206 if (c >= '0' && c <= '9')
1207 c = tokstart[++namelen];
1210 yylval.sval.ptr = tokstart + 1;
1211 yylval.sval.length = namelen - 1;
1212 lexptr += namelen + 1;
1216 if (!(c == '_' || c == '$'
1217 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
1218 /* We must have come across a bad character (e.g. ';'). */
1219 error ("Invalid character '%c' in expression.", c);
1221 /* It's a name. See how long it is. */
1223 for (c = tokstart[namelen];
1224 (c == '_' || c == '$' || (c >= '0' && c <= '9')
1225 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
1226 c = tokstart[++namelen])
1229 /* The token "if" terminates the expression and is NOT
1230 removed from the input stream. */
1231 if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f')
1238 /* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1)
1239 and $$digits (equivalent to $<-digits> if you could type that).
1240 Make token type LAST, and put the number (the digits) in yylval. */
1242 if (*tokstart == '$')
1244 register int negate = 0;
1246 /* Double dollar means negate the number and add -1 as well.
1247 Thus $$ alone means -1. */
1248 if (namelen >= 2 && tokstart[1] == '$')
1255 /* Just dollars (one or two) */
1256 yylval.lval = - negate;
1259 /* Is the rest of the token digits? */
1260 for (; c < namelen; c++)
1261 if (!(tokstart[c] >= '0' && tokstart[c] <= '9'))
1265 yylval.lval = atoi (tokstart + 1 + negate);
1267 yylval.lval = - yylval.lval;
1272 /* Handle tokens that refer to machine registers:
1273 $ followed by a register name. */
1275 if (*tokstart == '$') {
1276 for (c = 0; c < NUM_REGS; c++)
1277 if (namelen - 1 == strlen (reg_names[c])
1278 && !strncmp (tokstart + 1, reg_names[c], namelen - 1))
1283 for (c = 0; c < num_std_regs; c++)
1284 if (namelen - 1 == strlen (std_regs[c].name)
1285 && !strncmp (tokstart + 1, std_regs[c].name, namelen - 1))
1287 yylval.lval = std_regs[c].regnum;
1291 /* Catch specific keywords. Should be done with a data structure. */
1295 if (!strncmp (tokstart, "unsigned", 8))
1297 if (!strncmp (tokstart, "template", 8))
1301 if (!strncmp (tokstart, "struct", 6))
1303 if (!strncmp (tokstart, "signed", 6))
1305 if (!strncmp (tokstart, "sizeof", 6))
1309 if (!strncmp (tokstart, "union", 5))
1311 if (!strncmp (tokstart, "short", 5))
1315 if (!strncmp (tokstart, "enum", 4))
1317 if (!strncmp (tokstart, "long", 4))
1319 if (!strncmp (tokstart, "this", 4))
1321 static const char this_name[] =
1322 { CPLUS_MARKER, 't', 'h', 'i', 's', '\0' };
1324 if (lookup_symbol (this_name, expression_context_block,
1325 VAR_NAMESPACE, 0, NULL))
1330 if (!strncmp (tokstart, "int", 3))
1337 yylval.sval.ptr = tokstart;
1338 yylval.sval.length = namelen;
1340 /* Any other names starting in $ are debugger internal variables. */
1342 if (*tokstart == '$')
1344 yylval.ivar = lookup_internalvar (copy_name (yylval.sval) + 1);
1348 /* Use token-type BLOCKNAME for symbols that happen to be defined as
1349 functions or symtabs. If this is not so, then ...
1350 Use token-type TYPENAME for symbols that happen to be defined
1351 currently as names of types; NAME for other symbols.
1352 The caller is not constrained to care about the distinction. */
1354 char *tmp = copy_name (yylval.sval);
1356 int is_a_field_of_this = 0;
1359 sym = lookup_symbol (tmp, expression_context_block,
1361 current_language->la_language == language_cplus
1362 ? &is_a_field_of_this : NULL,
1364 if ((sym && SYMBOL_CLASS (sym) == LOC_BLOCK) ||
1365 lookup_partial_symtab (tmp))
1367 yylval.ssym.sym = sym;
1368 yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1371 if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
1373 yylval.tsym.type = SYMBOL_TYPE (sym);
1376 if ((yylval.tsym.type = lookup_primitive_typename (tmp)) != 0)
1379 /* Input names that aren't symbols but ARE valid hex numbers,
1380 when the input radix permits them, can be names or numbers
1381 depending on the parse. Note we support radixes > 16 here. */
1383 ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10) ||
1384 (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
1386 YYSTYPE newlval; /* Its value is ignored. */
1387 hextype = parse_number (tokstart, namelen, 0, &newlval);
1390 yylval.ssym.sym = sym;
1391 yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1394 if (hextype == UINT)
1396 yylval.ssym.sym = sym;
1397 yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1398 return NAME_OR_UINT;
1402 /* Any other kind of symbol */
1403 yylval.ssym.sym = sym;
1404 yylval.ssym.is_a_field_of_this = is_a_field_of_this;
1413 error (error (msg ? msg : "Invalid syntax in expression.");
1416 /* Table mapping opcodes into strings for printing operators
1417 and precedences of the operators. */
1419 const static struct op_print c_op_print_tab[] =
1421 {",", BINOP_COMMA, PREC_COMMA, 0},
1422 {"=", BINOP_ASSIGN, PREC_ASSIGN, 1},
1423 {"||", BINOP_OR, PREC_OR, 0},
1424 {"&&", BINOP_AND, PREC_AND, 0},
1425 {"|", BINOP_LOGIOR, PREC_LOGIOR, 0},
1426 {"&", BINOP_LOGAND, PREC_LOGAND, 0},
1427 {"^", BINOP_LOGXOR, PREC_LOGXOR, 0},
1428 {"==", BINOP_EQUAL, PREC_EQUAL, 0},
1429 {"!=", BINOP_NOTEQUAL, PREC_EQUAL, 0},
1430 {"<=", BINOP_LEQ, PREC_ORDER, 0},
1431 {">=", BINOP_GEQ, PREC_ORDER, 0},
1432 {">", BINOP_GTR, PREC_ORDER, 0},
1433 {"<", BINOP_LESS, PREC_ORDER, 0},
1434 {">>", BINOP_RSH, PREC_SHIFT, 0},
1435 {"<<", BINOP_LSH, PREC_SHIFT, 0},
1436 {"+", BINOP_ADD, PREC_ADD, 0},
1437 {"-", BINOP_SUB, PREC_ADD, 0},
1438 {"*", BINOP_MUL, PREC_MUL, 0},
1439 {"/", BINOP_DIV, PREC_MUL, 0},
1440 {"%", BINOP_REM, PREC_MUL, 0},
1441 {"@", BINOP_REPEAT, PREC_REPEAT, 0},
1442 {"-", UNOP_NEG, PREC_PREFIX, 0},
1443 {"!", UNOP_ZEROP, PREC_PREFIX, 0},
1444 {"~", UNOP_LOGNOT, PREC_PREFIX, 0},
1445 {"*", UNOP_IND, PREC_PREFIX, 0},
1446 {"&", UNOP_ADDR, PREC_PREFIX, 0},
1447 {"sizeof ", UNOP_SIZEOF, PREC_PREFIX, 0},
1448 {"++", UNOP_PREINCREMENT, PREC_PREFIX, 0},
1449 {"--", UNOP_PREDECREMENT, PREC_PREFIX, 0},
1451 {"::", BINOP_SCOPE, PREC_PREFIX, 0},
1454 /* These variables point to the objects
1455 representing the predefined C data types. */
1457 struct type *builtin_type_void;
1458 struct type *builtin_type_char;
1459 struct type *builtin_type_short;
1460 struct type *builtin_type_int;
1461 struct type *builtin_type_long;
1462 struct type *builtin_type_long_long;
1463 struct type *builtin_type_unsigned_char;
1464 struct type *builtin_type_unsigned_short;
1465 struct type *builtin_type_unsigned_int;
1466 struct type *builtin_type_unsigned_long;
1467 struct type *builtin_type_unsigned_long_long;
1468 struct type *builtin_type_float;
1469 struct type *builtin_type_double;
1470 struct type *builtin_type_long_double;
1471 struct type *builtin_type_complex;
1472 struct type *builtin_type_double_complex;
1474 struct type ** const (c_builtin_types[]) =
1478 &builtin_type_short,
1480 &builtin_type_float,
1481 &builtin_type_double,
1483 &builtin_type_long_long,
1484 &builtin_type_unsigned_char,
1485 &builtin_type_unsigned_short,
1486 &builtin_type_unsigned_int,
1487 &builtin_type_unsigned_long,
1488 &builtin_type_unsigned_long_long,
1489 &builtin_type_long_double,
1490 &builtin_type_complex,
1491 &builtin_type_double_complex,
1495 const struct language_defn c_language_defn = {
1496 "c", /* Language name */
1503 &BUILTIN_TYPE_LONGEST, /* longest signed integral type */
1504 &BUILTIN_TYPE_UNSIGNED_LONGEST,/* longest unsigned integral type */
1505 &builtin_type_double, /* longest floating point type */ /*FIXME*/
1506 "0x%x", "0x%", "x", /* Hex format, prefix, suffix */
1507 "0%o", "0%", "o", /* Octal format, prefix, suffix */
1508 c_op_print_tab, /* expression operators for printing */
1512 const struct language_defn cplus_language_defn = {
1513 "c++", /* Language name */
1520 &BUILTIN_TYPE_LONGEST, /* longest signed integral type */
1521 &BUILTIN_TYPE_UNSIGNED_LONGEST,/* longest unsigned integral type */
1522 &builtin_type_double, /* longest floating point type */ /*FIXME*/
1523 "0x%x", "0x%", "x", /* Hex format, prefix, suffix */
1524 "0%o", "0%", "o", /* Octal format, prefix, suffix */
1525 c_op_print_tab, /* expression operators for printing */
1530 _initialize_c_exp ()
1533 init_type (TYPE_CODE_VOID, 1, 0,
1536 init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT, 0,
1538 builtin_type_unsigned_char =
1539 init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT, 1,
1541 builtin_type_short =
1542 init_type (TYPE_CODE_INT, TARGET_SHORT_BIT / TARGET_CHAR_BIT, 0,
1544 builtin_type_unsigned_short =
1545 init_type (TYPE_CODE_INT, TARGET_SHORT_BIT / TARGET_CHAR_BIT, 1,
1548 init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT, 0,
1550 builtin_type_unsigned_int =
1551 init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT, 1,
1554 init_type (TYPE_CODE_INT, TARGET_LONG_BIT / TARGET_CHAR_BIT, 0,
1556 builtin_type_unsigned_long =
1557 init_type (TYPE_CODE_INT, TARGET_LONG_BIT / TARGET_CHAR_BIT, 1,
1559 builtin_type_long_long =
1560 init_type (TYPE_CODE_INT, TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT, 0,
1562 builtin_type_unsigned_long_long =
1563 init_type (TYPE_CODE_INT, TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT, 1,
1564 "unsigned long long");
1565 builtin_type_float =
1566 init_type (TYPE_CODE_FLT, TARGET_FLOAT_BIT / TARGET_CHAR_BIT, 0,
1568 builtin_type_double =
1569 init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT, 0,
1571 builtin_type_long_double =
1572 init_type (TYPE_CODE_FLT, TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT, 0,
1574 builtin_type_complex =
1575 init_type (TYPE_CODE_FLT, TARGET_COMPLEX_BIT / TARGET_CHAR_BIT, 0,
1577 builtin_type_double_complex =
1578 init_type (TYPE_CODE_FLT, TARGET_DOUBLE_COMPLEX_BIT / TARGET_CHAR_BIT, 0,
1581 add_language (&c_language_defn);
1582 add_language (&cplus_language_defn);