Arrays also degenerate in initializers, _except_ for the special
[smatch.git] / expression.c
blobe57755a70aa0fec7e4867c1500db9ae62c54cde9
1 /*
2 * sparse/expression.c
4 * Copyright (C) 2003 Transmeta Corp.
6 * Licensed under the Open Software License version 1.1
8 * This is the expression parsing part of parsing C.
9 */
10 #include <stdarg.h>
11 #include <stdlib.h>
12 #include <stdio.h>
13 #include <string.h>
14 #include <ctype.h>
15 #include <unistd.h>
16 #include <fcntl.h>
18 #include "lib.h"
19 #include "token.h"
20 #include "parse.h"
21 #include "symbol.h"
22 #include "scope.h"
23 #include "expression.h"
24 #include "target.h"
26 static int match_oplist(int op, ...)
28 va_list args;
30 va_start(args, op);
31 for (;;) {
32 int nextop = va_arg(args, int);
33 if (!nextop)
34 return 0;
35 if (op == nextop)
36 return 1;
40 static struct token *comma_expression(struct token *, struct expression **);
42 struct token *parens_expression(struct token *token, struct expression **expr, const char *where)
44 token = expect(token, '(', where);
45 if (match_op(token, '{')) {
46 struct expression *e = alloc_expression(token->pos, EXPR_STATEMENT);
47 struct statement *stmt = alloc_statement(token->pos, STMT_COMPOUND);
48 *expr = e;
49 e->statement = stmt;
50 start_symbol_scope();
51 token = compound_statement(token->next, stmt);
52 end_symbol_scope();
53 token = expect(token, '}', "at end of statement expression");
54 } else
55 token = parse_expression(token, expr);
56 return expect(token, ')', where);
59 static struct token *string_expression(struct token *token, struct expression *expr)
61 struct string *string = token->string;
62 struct token *next = token->next;
64 if (token_type(next) == TOKEN_STRING) {
65 int totlen = string->length;
66 char *data;
68 do {
69 totlen += next->string->length-1;
70 next = next->next;
71 } while (token_type(next) == TOKEN_STRING);
73 string = __alloc_string(totlen);
74 string->length = totlen;
75 data = string->data;
76 next = token;
77 do {
78 struct string *s = next->string;
79 int len = s->length;
81 next = next->next;
82 memcpy(data, s->data, len);
83 data += len-1;
84 } while (token_type(next) == TOKEN_STRING);
86 expr->string = string;
87 return next;
90 static void get_int_value(struct expression *expr, const char *str)
92 unsigned long long value = 0;
93 unsigned int base = 10, digit, bits;
94 unsigned long modifiers, extramod;
96 switch (str[0]) {
97 case 'x':
98 base = 18; // the -= 2 for the octal case will
99 str++; // skip the 'x'
100 /* fallthrough */
101 case 'o':
102 str++; // skip the 'o' or 'x/X'
103 base -= 2; // the fall-through will make this 8
105 while ((digit = hexval(*str)) < base) {
106 value = value * base + digit;
107 str++;
109 modifiers = 0;
110 for (;;) {
111 char c = *str++;
112 if (c == 'u' || c == 'U') {
113 modifiers |= MOD_UNSIGNED;
114 continue;
116 if (c == 'l' || c == 'L') {
117 if (modifiers & MOD_LONG)
118 modifiers |= MOD_LONGLONG;
119 modifiers |= MOD_LONG;
120 continue;
122 break;
125 bits = BITS_IN_LONGLONG;
126 extramod = 0;
127 if (!(modifiers & MOD_LONGLONG)) {
128 if (value & (~1ULL << (BITS_IN_LONG-1))) {
129 extramod = MOD_LONGLONG | MOD_LONG;
130 } else {
131 bits = BITS_IN_LONG;
132 if (!(modifiers & MOD_LONG)) {
133 if (value & (~1ULL << (BITS_IN_INT-1))) {
134 extramod = MOD_LONG;
135 } else
136 bits = BITS_IN_INT;
140 if (!(modifiers & MOD_UNSIGNED)) {
141 if (value & (1ULL << (bits-1))) {
142 extramod |= MOD_UNSIGNED;
145 if (extramod) {
147 * Special case: "int" gets promoted directly to "long"
148 * for normal decimal numbers..
150 modifiers |= extramod;
151 if (base == 10 && modifiers == MOD_UNSIGNED) {
152 modifiers = MOD_LONG;
153 if (BITS_IN_LONG == BITS_IN_INT)
154 modifiers = MOD_LONG | MOD_UNSIGNED;
156 warn(expr->pos, "value is so big it is%s%s%s",
157 (modifiers & MOD_UNSIGNED) ? " unsigned":"",
158 (modifiers & MOD_LONG) ? " long":"",
159 (modifiers & MOD_LONGLONG) ? " long":"");
162 expr->type = EXPR_VALUE;
163 expr->ctype = ctype_integer(modifiers);
164 expr->value = value;
167 struct token *primary_expression(struct token *token, struct expression **tree)
169 struct expression *expr = NULL;
171 switch (token_type(token)) {
172 case TOKEN_FP:
173 expr = alloc_expression(token->pos, EXPR_VALUE);
174 expr->ctype = &double_ctype;
175 expr->value = 0;
176 warn(token->pos, "FP values not yet implemented");
177 token = token->next;
178 break;
180 case TOKEN_CHAR:
181 expr = alloc_expression(token->pos, EXPR_VALUE);
182 expr->ctype = &int_ctype;
183 expr->value = (unsigned char) token->character;
184 token = token->next;
185 break;
187 case TOKEN_INTEGER:
188 expr = alloc_expression(token->pos, EXPR_VALUE);
189 get_int_value(expr, token->integer);
190 token = token->next;
191 break;
193 case TOKEN_IDENT: {
194 expr = alloc_expression(token->pos, EXPR_SYMBOL);
195 expr->symbol_name = token->ident;
196 expr->symbol = lookup_symbol(token->ident, NS_SYMBOL);
197 token = token->next;
198 break;
201 case TOKEN_STRING: {
202 expr = alloc_expression(token->pos, EXPR_STRING);
203 token = string_expression(token, expr);
204 break;
207 case TOKEN_SPECIAL:
208 if (token->special == '(') {
209 expr = alloc_expression(token->pos, EXPR_PREOP);
210 expr->op = '(';
211 token = parens_expression(token, &expr->unop, "in expression");
212 break;
214 default:
217 *tree = expr;
218 return token;
221 static struct token *expression_list(struct token *token, struct expression_list **list)
223 while (!match_op(token, ')')) {
224 struct expression *expr = NULL;
225 token = assignment_expression(token, &expr);
226 if (!expr)
227 break;
228 add_expression(list, expr);
229 if (!match_op(token, ','))
230 break;
231 token = token->next;
233 return token;
236 static struct token *postfix_expression(struct token *token, struct expression **tree)
238 struct expression *expr = NULL;
240 token = primary_expression(token, &expr);
241 while (expr && token_type(token) == TOKEN_SPECIAL) {
242 switch (token->special) {
243 case '[': { /* Array dereference */
244 struct expression *deref = alloc_expression(token->pos, EXPR_PREOP);
245 struct expression *add = alloc_expression(token->pos, EXPR_BINOP);
247 deref->op = '*';
248 deref->unop = add;
250 add->op = '+';
251 add->left = expr;
252 token = parse_expression(token->next, &add->right);
253 token = expect(token, ']', "at end of array dereference");
254 expr = deref;
255 continue;
257 case SPECIAL_INCREMENT: /* Post-increment */
258 case SPECIAL_DECREMENT: { /* Post-decrement */
259 struct expression *post = alloc_expression(token->pos, EXPR_POSTOP);
260 post->op = token->special;
261 post->unop = expr;
262 expr = post;
263 token = token->next;
264 continue;
266 case '.': /* Structure member dereference */
267 case SPECIAL_DEREFERENCE: { /* Structure pointer member dereference */
268 struct expression *deref = alloc_expression(token->pos, EXPR_DEREF);
269 deref->op = token->special;
270 deref->deref = expr;
271 token = token->next;
272 if (token_type(token) != TOKEN_IDENT) {
273 warn(token->pos, "Expected member name");
274 break;
276 deref->member = token->ident;
277 token = token->next;
278 expr = deref;
279 continue;
282 case '(': { /* Function call */
283 struct expression *call = alloc_expression(token->pos, EXPR_CALL);
284 call->op = '(';
285 call->fn = expr;
286 token = expression_list(token->next, &call->args);
287 token = expect(token, ')', "in function call");
288 expr = call;
289 continue;
292 default:
293 break;
295 break;
297 *tree = expr;
298 return token;
301 static struct token *cast_expression(struct token *token, struct expression **tree);
302 static struct token *unary_expression(struct token *token, struct expression **tree)
304 if (token_type(token) == TOKEN_IDENT &&
305 (token->ident == &sizeof_ident ||
306 token->ident == &__alignof___ident)) {
307 struct expression *sizeof_ex = alloc_expression(token->pos, EXPR_SIZEOF);
308 *tree = sizeof_ex;
309 tree = &sizeof_ex->unop;
310 token = token->next;
311 if (!match_op(token, '(') || !lookup_type(token->next))
312 return unary_expression(token, &sizeof_ex->cast_expression);
313 token = typename(token->next, &sizeof_ex->cast_type);
314 return expect(token, ')', "at end of sizeof type-name");
317 if (token_type(token) == TOKEN_SPECIAL) {
318 if (match_oplist(token->special,
319 SPECIAL_INCREMENT, SPECIAL_DECREMENT,
320 '&', '*', '+', '-', '~', '!', 0)) {
321 struct expression *unary = alloc_expression(token->pos, EXPR_PREOP);
322 unary->op = token->special;
323 *tree = unary;
324 return cast_expression(token->next, &unary->unop);
328 return postfix_expression(token, tree);
332 * Ambiguity: a '(' can be either a cast-expression or
333 * a primary-expression depending on whether it is followed
334 * by a type or not.
336 static struct token *cast_expression(struct token *token, struct expression **tree)
338 if (match_op(token, '(')) {
339 struct token *next = token->next;
340 if (lookup_type(next)) {
341 struct expression *cast = alloc_expression(next->pos, EXPR_CAST);
342 struct symbol *sym;
344 token = typename(next, &sym);
345 cast->cast_type = sym->ctype.base_type;
346 token = expect(token, ')', "at end of cast operator");
347 *tree = cast;
348 if (match_op(token, '{'))
349 return initializer(&cast->cast_expression, token);
350 token = cast_expression(token, &cast->cast_expression);
351 return token;
354 return unary_expression(token, tree);
357 /* Generic left-to-right binop parsing */
358 static struct token *lr_binop_expression(struct token *token, struct expression **tree,
359 enum expression_type type, struct token *(*inner)(struct token *, struct expression **), ...)
361 struct expression *left = NULL;
362 struct token * next = inner(token, &left);
364 if (left) {
365 while (token_type(next) == TOKEN_SPECIAL) {
366 struct expression *top, *right = NULL;
367 int op = next->special;
368 va_list args;
370 va_start(args, inner);
371 for (;;) {
372 int nextop = va_arg(args, int);
373 if (!nextop)
374 goto out;
375 if (op == nextop)
376 break;
378 va_end(args);
379 top = alloc_expression(next->pos, type);
380 next = inner(next->next, &right);
381 if (!right) {
382 warn(next->pos, "No right hand side of '%s'-expression", show_special(op));
383 break;
385 top->op = op;
386 top->left = left;
387 top->right = right;
388 left = top;
391 out:
392 *tree = left;
393 return next;
396 static struct token *multiplicative_expression(struct token *token, struct expression **tree)
398 return lr_binop_expression(token, tree, EXPR_BINOP, cast_expression, '*', '/', '%', 0);
401 static struct token *additive_expression(struct token *token, struct expression **tree)
403 return lr_binop_expression(token, tree, EXPR_BINOP, multiplicative_expression, '+', '-', 0);
406 static struct token *shift_expression(struct token *token, struct expression **tree)
408 return lr_binop_expression(token, tree, EXPR_BINOP, additive_expression, SPECIAL_LEFTSHIFT, SPECIAL_RIGHTSHIFT, 0);
411 static struct token *relational_expression(struct token *token, struct expression **tree)
413 return lr_binop_expression(token, tree, EXPR_COMPARE, shift_expression, '<', '>', SPECIAL_LTE, SPECIAL_GTE, 0);
416 static struct token *equality_expression(struct token *token, struct expression **tree)
418 return lr_binop_expression(token, tree, EXPR_COMPARE, relational_expression, SPECIAL_EQUAL, SPECIAL_NOTEQUAL, 0);
421 static struct token *bitwise_and_expression(struct token *token, struct expression **tree)
423 return lr_binop_expression(token, tree, EXPR_BINOP, equality_expression, '&', 0);
426 static struct token *bitwise_xor_expression(struct token *token, struct expression **tree)
428 return lr_binop_expression(token, tree, EXPR_BINOP, bitwise_and_expression, '^', 0);
431 static struct token *bitwise_or_expression(struct token *token, struct expression **tree)
433 return lr_binop_expression(token, tree, EXPR_BINOP, bitwise_xor_expression, '|', 0);
436 static struct token *logical_and_expression(struct token *token, struct expression **tree)
438 return lr_binop_expression(token, tree, EXPR_LOGICAL, bitwise_or_expression, SPECIAL_LOGICAL_AND, 0);
441 static struct token *logical_or_expression(struct token *token, struct expression **tree)
443 return lr_binop_expression(token, tree, EXPR_LOGICAL, logical_and_expression, SPECIAL_LOGICAL_OR, 0);
446 struct token *conditional_expression(struct token *token, struct expression **tree)
448 token = logical_or_expression(token, tree);
449 if (match_op(token, '?')) {
450 struct expression *expr = alloc_expression(token->pos, EXPR_CONDITIONAL);
451 expr->op = token->special;
452 expr->left = *tree;
453 *tree = expr;
454 token = parse_expression(token->next, &expr->cond_true);
455 token = expect(token, ':', "in conditional expression");
456 token = conditional_expression(token, &expr->cond_false);
458 return token;
461 struct token *assignment_expression(struct token *token, struct expression **tree)
463 token = conditional_expression(token, tree);
464 if (token_type(token) == TOKEN_SPECIAL) {
465 static const int assignments[] = {
466 '=',
467 SPECIAL_ADD_ASSIGN, SPECIAL_SUB_ASSIGN,
468 SPECIAL_MUL_ASSIGN, SPECIAL_DIV_ASSIGN,
469 SPECIAL_MOD_ASSIGN, SPECIAL_SHL_ASSIGN,
470 SPECIAL_SHR_ASSIGN, SPECIAL_AND_ASSIGN,
471 SPECIAL_OR_ASSIGN, SPECIAL_XOR_ASSIGN };
472 int i, op = token->special;
473 for (i = 0; i < sizeof(assignments)/sizeof(int); i++)
474 if (assignments[i] == op) {
475 struct expression * expr = alloc_expression(token->pos, EXPR_ASSIGNMENT);
476 expr->left = *tree;
477 expr->op = op;
478 *tree = expr;
479 return assignment_expression(token->next, &expr->right);
482 return token;
485 static struct token *comma_expression(struct token *token, struct expression **tree)
487 return lr_binop_expression(token, tree, EXPR_COMMA, assignment_expression, ',', 0);
490 struct token *parse_expression(struct token *token, struct expression **tree)
492 return comma_expression(token,tree);