4 * Copyright (C) 2003 Transmeta Corp.
5 * 2003-2004 Linus Torvalds
7 * Licensed under the Open Software License version 1.1
9 * This is the expression parsing part of parsing C.
28 #include "expression.h"
31 static int match_oplist(int op
, ...)
37 int nextop
= va_arg(args
, int);
45 static struct token
*comma_expression(struct token
*, struct expression
**);
47 struct token
*parens_expression(struct token
*token
, struct expression
**expr
, const char *where
)
49 token
= expect(token
, '(', where
);
50 if (match_op(token
, '{')) {
51 struct expression
*e
= alloc_expression(token
->pos
, EXPR_STATEMENT
);
52 struct statement
*stmt
= alloc_statement(token
->pos
, STMT_COMPOUND
);
56 token
= compound_statement(token
->next
, stmt
);
58 token
= expect(token
, '}', "at end of statement expression");
60 token
= parse_expression(token
, expr
);
61 return expect(token
, ')', where
);
65 * Handle __func__, __FUNCTION__ and __PRETTY_FUNCTION__ token
68 static int convert_one_fn_token(struct token
*token
)
70 struct symbol
*sym
= current_fn
;
73 struct ident
*ident
= sym
->ident
;
76 struct string
*string
;
78 string
= __alloc_string(len
+1);
79 memcpy(string
->data
, ident
->name
, len
);
80 string
->data
[len
] = 0;
81 string
->length
= len
+1;
82 token_type(token
) = TOKEN_STRING
;
83 token
->string
= string
;
90 static int convert_function(struct token
*next
)
94 struct token
*token
= next
;
96 switch (token_type(token
)) {
100 if (token
->ident
== &__func___ident
||
101 token
->ident
== &__FUNCTION___ident
||
102 token
->ident
== &__PRETTY_FUNCTION___ident
) {
103 if (!convert_one_fn_token(token
))
117 static struct token
*parse_type(struct token
*token
, struct expression
**tree
)
120 *tree
= alloc_expression(token
->pos
, EXPR_TYPE
);
121 token
= typename(token
, &sym
);
123 sparse_error(token
->pos
,
124 "type expression should not include identifier "
125 "\"%s\"", sym
->ident
->name
);
126 (*tree
)->symbol
= sym
;
130 static struct token
*builtin_types_compatible_p_expr(struct token
*token
,
131 struct expression
**tree
)
133 struct expression
*expr
= alloc_expression(
134 token
->pos
, EXPR_COMPARE
);
135 expr
->op
= SPECIAL_EQUAL
;
137 if (!match_op(token
, '('))
138 return expect(token
, '(',
139 "after __builtin_types_compatible_p");
141 token
= parse_type(token
, &expr
->left
);
142 if (!match_op(token
, ','))
143 return expect(token
, ',',
144 "in __builtin_types_compatible_p");
146 token
= parse_type(token
, &expr
->right
);
147 if (!match_op(token
, ')'))
148 return expect(token
, ')',
149 "at end of __builtin_types_compatible_p");
156 static struct token
*string_expression(struct token
*token
, struct expression
*expr
)
158 struct string
*string
= token
->string
;
159 struct token
*next
= token
->next
;
161 convert_function(token
);
163 if (token_type(next
) == TOKEN_STRING
) {
164 int totlen
= string
->length
-1;
168 totlen
+= next
->string
->length
-1;
170 } while (token_type(next
) == TOKEN_STRING
);
172 if (totlen
> MAX_STRING
) {
173 warning(token
->pos
, "trying to concatenate %d-character string (%d bytes max)", totlen
, MAX_STRING
);
177 string
= __alloc_string(totlen
+1);
178 string
->length
= totlen
+1;
182 struct string
*s
= next
->string
;
183 int len
= s
->length
-1;
190 memcpy(data
, s
->data
, len
);
192 } while (token_type(next
) == TOKEN_STRING
);
195 expr
->string
= string
;
200 #define ULLONG_MAX (~0ULL)
203 static void get_number_value(struct expression
*expr
, struct token
*token
)
205 const char *str
= token
->number
;
206 unsigned long long value
;
208 unsigned long modifiers
= 0;
209 int overflow
= 0, do_warn
= 0;
210 int try_unsigned
= 1;
214 value
= strtoull(str
, &end
, 0);
217 if (value
== ULLONG_MAX
&& errno
== ERANGE
)
224 } else if (c
== 'u' || c
== 'U') {
225 added
= MOD_UNSIGNED
;
226 } else if (c
== 'l' || c
== 'L') {
229 added
|= MOD_LONGLONG
;
234 if (modifiers
& added
)
240 /* OK, it's a valid integer */
241 /* decimals can be unsigned only if directly specified as such */
242 if (str
[0] != '0' && !(modifiers
& MOD_UNSIGNED
))
244 if (!(modifiers
& MOD_LONG
)) {
245 bits
= bits_in_int
- 1;
246 if (!(value
& (~1ULL << bits
))) {
247 if (!(value
& (1ULL << bits
))) {
249 } else if (try_unsigned
) {
250 modifiers
|= MOD_UNSIGNED
;
254 modifiers
|= MOD_LONG
;
257 if (!(modifiers
& MOD_LONGLONG
)) {
258 bits
= bits_in_long
- 1;
259 if (!(value
& (~1ULL << bits
))) {
260 if (!(value
& (1ULL << bits
))) {
262 } else if (try_unsigned
) {
263 modifiers
|= MOD_UNSIGNED
;
268 modifiers
|= MOD_LONGLONG
;
271 bits
= bits_in_longlong
- 1;
272 if (value
& (~1ULL << bits
))
274 if (!(value
& (1ULL << bits
)))
277 warning(expr
->pos
, "decimal constant %s is too big for long long",
279 modifiers
|= MOD_UNSIGNED
;
282 warning(expr
->pos
, "constant %s is so big it is%s%s%s",
284 (modifiers
& MOD_UNSIGNED
) ? " unsigned":"",
285 (modifiers
& MOD_LONG
) ? " long":"",
286 (modifiers
& MOD_LONGLONG
) ? " long":"");
289 "decimal constant %s is between LONG_MAX and ULONG_MAX."
290 " For C99 that means long long, C90 compilers are very "
291 "likely to produce unsigned long (and a warning) here",
293 expr
->type
= EXPR_VALUE
;
294 expr
->ctype
= ctype_integer(modifiers
);
298 error_die(expr
->pos
, "constant %s is too big even for unsigned long long",
302 expr
->fvalue
= string_to_ld(str
, &end
);
309 if (*end
== 'f' || *end
== 'F')
310 expr
->ctype
= &float_ctype
;
311 else if (*end
== 'l' || *end
== 'L')
312 expr
->ctype
= &ldouble_ctype
;
314 expr
->ctype
= &double_ctype
;
318 expr
->type
= EXPR_FVALUE
;
322 error_die(expr
->pos
, "constant %s is not a valid number", show_token(token
));
325 struct token
*primary_expression(struct token
*token
, struct expression
**tree
)
327 struct expression
*expr
= NULL
;
329 switch (token_type(token
)) {
331 expr
= alloc_expression(token
->pos
, EXPR_VALUE
);
332 expr
->ctype
= &int_ctype
;
333 expr
->value
= (unsigned char) token
->character
;
338 expr
= alloc_expression(token
->pos
, EXPR_VALUE
);
339 get_number_value(expr
, token
);
343 case TOKEN_ZERO_IDENT
: {
344 expr
= alloc_expression(token
->pos
, EXPR_SYMBOL
);
345 expr
->ctype
= &int_ctype
;
346 expr
->symbol
= &zero_int
;
347 expr
->symbol_name
= token
->ident
;
353 struct symbol
*sym
= lookup_symbol(token
->ident
, NS_SYMBOL
| NS_TYPEDEF
);
354 struct token
*next
= token
->next
;
357 if (convert_function(token
))
359 if (token
->ident
== &__builtin_types_compatible_p_ident
) {
360 token
= builtin_types_compatible_p_expr(token
, &expr
);
365 expr
= alloc_expression(token
->pos
, EXPR_SYMBOL
);
368 * We support types as real first-class citizens, with type
371 * if (typeof(a) == int) ..
373 if (sym
&& sym
->namespace == NS_TYPEDEF
) {
374 sparse_error(token
->pos
, "typename in expression");
377 expr
->symbol_name
= token
->ident
;
385 expr
= alloc_expression(token
->pos
, EXPR_STRING
);
386 token
= string_expression(token
, expr
);
391 if (token
->special
== '(') {
392 expr
= alloc_expression(token
->pos
, EXPR_PREOP
);
394 token
= parens_expression(token
, &expr
->unop
, "in expression");
397 if (token
->special
== '[' && lookup_type(token
->next
)) {
398 expr
= alloc_expression(token
->pos
, EXPR_TYPE
);
399 token
= typename(token
->next
, &expr
->symbol
);
400 token
= expect(token
, ']', "in type expression");
411 static struct token
*expression_list(struct token
*token
, struct expression_list
**list
)
413 while (!match_op(token
, ')')) {
414 struct expression
*expr
= NULL
;
415 token
= assignment_expression(token
, &expr
);
418 add_expression(list
, expr
);
419 if (!match_op(token
, ','))
427 * extend to deal with the ambiguous C grammar for parsing
428 * a cast expressions followed by an initializer.
430 static struct token
*postfix_expression(struct token
*token
, struct expression
**tree
, struct expression
*cast_init_expr
)
432 struct expression
*expr
= cast_init_expr
;
435 token
= primary_expression(token
, &expr
);
437 while (expr
&& token_type(token
) == TOKEN_SPECIAL
) {
438 switch (token
->special
) {
439 case '[': { /* Array dereference */
440 struct expression
*deref
= alloc_expression(token
->pos
, EXPR_PREOP
);
441 struct expression
*add
= alloc_expression(token
->pos
, EXPR_BINOP
);
448 token
= parse_expression(token
->next
, &add
->right
);
449 token
= expect(token
, ']', "at end of array dereference");
453 case SPECIAL_INCREMENT
: /* Post-increment */
454 case SPECIAL_DECREMENT
: { /* Post-decrement */
455 struct expression
*post
= alloc_expression(token
->pos
, EXPR_POSTOP
);
456 post
->op
= token
->special
;
462 case SPECIAL_DEREFERENCE
: { /* Structure pointer member dereference */
463 /* "x->y" is just shorthand for "(*x).y" */
464 struct expression
*inner
= alloc_expression(token
->pos
, EXPR_PREOP
);
470 case '.': { /* Structure member dereference */
471 struct expression
*deref
= alloc_expression(token
->pos
, EXPR_DEREF
);
475 if (token_type(token
) != TOKEN_IDENT
) {
476 sparse_error(token
->pos
, "Expected member name");
479 deref
->member
= token
->ident
;
485 case '(': { /* Function call */
486 struct expression
*call
= alloc_expression(token
->pos
, EXPR_CALL
);
489 token
= expression_list(token
->next
, &call
->args
);
490 token
= expect(token
, ')', "in function call");
504 static struct token
*cast_expression(struct token
*token
, struct expression
**tree
);
505 static struct token
*unary_expression(struct token
*token
, struct expression
**tree
);
507 static struct token
*type_info_expression(struct token
*token
,
508 struct expression
**tree
, int type
)
510 struct expression
*expr
= alloc_expression(token
->pos
, type
);
514 if (!match_op(token
, '(') || !lookup_type(token
->next
))
515 return unary_expression(token
, &expr
->cast_expression
);
516 token
= typename(token
->next
, &expr
->cast_type
);
518 if (!match_op(token
, ')')) {
519 static const char * error
[] = {
520 [EXPR_SIZEOF
] = "at end of sizeof",
521 [EXPR_ALIGNOF
] = "at end of __alignof__",
522 [EXPR_PTRSIZEOF
] = "at end of __sizeof_ptr__"
524 return expect(token
, ')', error
[type
]);
529 * C99 ambiguity: the typename might have been the beginning
530 * of a typed initializer expression..
532 if (match_op(token
, '{'))
533 token
= initializer(&expr
->cast_expression
, token
);
537 static struct token
*unary_expression(struct token
*token
, struct expression
**tree
)
539 if (token_type(token
) == TOKEN_IDENT
) {
540 struct ident
*ident
= token
->ident
;
541 if (ident
->reserved
) {
542 static const struct {
545 } type_information
[] = {
546 { &sizeof_ident
, EXPR_SIZEOF
},
547 { &__alignof___ident
, EXPR_ALIGNOF
},
548 { &__sizeof_ptr___ident
, EXPR_PTRSIZEOF
},
551 for (i
= 0; i
< 3; i
++) {
552 if (ident
== type_information
[i
].id
)
553 return type_info_expression(token
, tree
, type_information
[i
].type
);
558 if (token_type(token
) == TOKEN_SPECIAL
) {
559 if (match_oplist(token
->special
,
560 SPECIAL_INCREMENT
, SPECIAL_DECREMENT
,
561 '&', '*', '+', '-', '~', '!', 0)) {
562 struct expression
*unop
;
563 struct expression
*unary
;
566 next
= cast_expression(token
->next
, &unop
);
568 sparse_error(token
->pos
, "Syntax error in unary expression");
571 unary
= alloc_expression(token
->pos
, EXPR_PREOP
);
572 unary
->op
= token
->special
;
578 /* Gcc extension: &&label gives the address of a label */
579 if (match_op(token
, SPECIAL_LOGICAL_AND
) &&
580 token_type(token
->next
) == TOKEN_IDENT
) {
581 struct expression
*label
= alloc_expression(token
->pos
, EXPR_LABEL
);
582 struct symbol
*sym
= label_symbol(token
->next
);
583 if (!(sym
->ctype
.modifiers
& MOD_ADDRESSABLE
)) {
584 sym
->ctype
.modifiers
|= MOD_ADDRESSABLE
;
585 add_symbol(&function_computed_target_list
, sym
);
587 label
->label_symbol
= sym
;
589 return token
->next
->next
;
594 return postfix_expression(token
, tree
, NULL
);
598 * Ambiguity: a '(' can be either a cast-expression or
599 * a primary-expression depending on whether it is followed
602 * additional ambiguity: a "cast expression" followed by
603 * an initializer is really a postfix-expression.
605 static struct token
*cast_expression(struct token
*token
, struct expression
**tree
)
607 if (match_op(token
, '(')) {
608 struct token
*next
= token
->next
;
609 if (lookup_type(next
)) {
610 struct expression
*cast
= alloc_expression(next
->pos
, EXPR_CAST
);
613 token
= typename(next
, &sym
);
614 cast
->cast_type
= sym
;
615 token
= expect(token
, ')', "at end of cast operator");
616 if (match_op(token
, '{')) {
617 token
= initializer(&cast
->cast_expression
, token
);
618 return postfix_expression(token
, tree
, cast
);
621 token
= cast_expression(token
, &cast
->cast_expression
);
625 return unary_expression(token
, tree
);
629 * Generic left-to-right binop parsing
631 * This _really_ needs to be inlined, because that makes the inner
632 * function call statically deterministic rather than a totally
633 * unpredictable indirect call. But gcc-3 is so "clever" that it
634 * doesn't do so by default even when you tell it to inline it.
636 * Making it a macro avoids the inlining problem, and also means
637 * that we can pass in the op-comparison as an expression rather
638 * than create a data structure for it.
641 #define LR_BINOP_EXPRESSION(token, tree, type, inner, compare) \
642 struct expression *left = NULL; \
643 struct token * next = inner(token, &left); \
646 while (token_type(next) == TOKEN_SPECIAL) { \
647 struct expression *top, *right = NULL; \
648 int op = next->special; \
652 top = alloc_expression(next->pos, type); \
653 next = inner(next->next, &right); \
655 sparse_error(next->pos, "No right hand side of '%s'-expression", show_special(op)); \
660 top->right = right; \
669 static struct token *multiplicative_expression(struct token *token, struct expression **tree)
672 token
, tree
, EXPR_BINOP
, cast_expression
,
673 (op
== '*') || (op
== '/') || (op
== '%')
677 static struct token
*additive_expression(struct token
*token
, struct expression
**tree
)
680 token
, tree
, EXPR_BINOP
, multiplicative_expression
,
681 (op
== '+') || (op
== '-')
685 static struct token
*shift_expression(struct token
*token
, struct expression
**tree
)
688 token
, tree
, EXPR_BINOP
, additive_expression
,
689 (op
== SPECIAL_LEFTSHIFT
) || (op
== SPECIAL_RIGHTSHIFT
)
693 static struct token
*relational_expression(struct token
*token
, struct expression
**tree
)
696 token
, tree
, EXPR_COMPARE
, shift_expression
,
697 (op
== '<') || (op
== '>') ||
698 (op
== SPECIAL_LTE
) || (op
== SPECIAL_GTE
)
702 static struct token
*equality_expression(struct token
*token
, struct expression
**tree
)
705 token
, tree
, EXPR_COMPARE
, relational_expression
,
706 (op
== SPECIAL_EQUAL
) || (op
== SPECIAL_NOTEQUAL
)
710 static struct token
*bitwise_and_expression(struct token
*token
, struct expression
**tree
)
713 token
, tree
, EXPR_BINOP
, equality_expression
,
718 static struct token
*bitwise_xor_expression(struct token
*token
, struct expression
**tree
)
721 token
, tree
, EXPR_BINOP
, bitwise_and_expression
,
726 static struct token
*bitwise_or_expression(struct token
*token
, struct expression
**tree
)
729 token
, tree
, EXPR_BINOP
, bitwise_xor_expression
,
734 static struct token
*logical_and_expression(struct token
*token
, struct expression
**tree
)
737 token
, tree
, EXPR_LOGICAL
, bitwise_or_expression
,
738 (op
== SPECIAL_LOGICAL_AND
)
742 static struct token
*logical_or_expression(struct token
*token
, struct expression
**tree
)
745 token
, tree
, EXPR_LOGICAL
, logical_and_expression
,
746 (op
== SPECIAL_LOGICAL_OR
)
750 struct token
*conditional_expression(struct token
*token
, struct expression
**tree
)
752 token
= logical_or_expression(token
, tree
);
753 if (*tree
&& match_op(token
, '?')) {
754 struct expression
*expr
= alloc_expression(token
->pos
, EXPR_CONDITIONAL
);
755 expr
->op
= token
->special
;
758 token
= parse_expression(token
->next
, &expr
->cond_true
);
759 token
= expect(token
, ':', "in conditional expression");
760 token
= conditional_expression(token
, &expr
->cond_false
);
765 struct token
*assignment_expression(struct token
*token
, struct expression
**tree
)
767 token
= conditional_expression(token
, tree
);
768 if (*tree
&& token_type(token
) == TOKEN_SPECIAL
) {
769 static const int assignments
[] = {
771 SPECIAL_ADD_ASSIGN
, SPECIAL_SUB_ASSIGN
,
772 SPECIAL_MUL_ASSIGN
, SPECIAL_DIV_ASSIGN
,
773 SPECIAL_MOD_ASSIGN
, SPECIAL_SHL_ASSIGN
,
774 SPECIAL_SHR_ASSIGN
, SPECIAL_AND_ASSIGN
,
775 SPECIAL_OR_ASSIGN
, SPECIAL_XOR_ASSIGN
};
776 int i
, op
= token
->special
;
777 for (i
= 0; i
< sizeof(assignments
)/sizeof(int); i
++)
778 if (assignments
[i
] == op
) {
779 struct expression
* expr
= alloc_expression(token
->pos
, EXPR_ASSIGNMENT
);
783 return assignment_expression(token
->next
, &expr
->right
);
789 static struct token
*comma_expression(struct token
*token
, struct expression
**tree
)
792 token
, tree
, EXPR_COMMA
, assignment_expression
,
797 struct token
*parse_expression(struct token
*token
, struct expression
**tree
)
799 return comma_expression(token
,tree
);