Lines Matching full:token
39 #include "token.h"
63 static struct token *comma_expression(struct token *, struct expression **);
65 struct token *parens_expression(struct token *token, struct expression **expr, const char *where) in parens_expression() argument
67 struct token *p; in parens_expression()
69 token = expect(token, '(', where); in parens_expression()
70 p = token; in parens_expression()
71 if (match_op(token, '{')) { in parens_expression()
72 struct expression *e = alloc_expression(token->pos, EXPR_STATEMENT); in parens_expression()
73 struct statement *stmt = alloc_statement(token->pos, STMT_COMPOUND); in parens_expression()
77 token = compound_statement(token->next, stmt); in parens_expression()
79 token = expect(token, '}', "at end of statement expression"); in parens_expression()
81 token = parse_expression(token, expr); in parens_expression()
83 if (token == p) in parens_expression()
84 sparse_error(token->pos, "an expression is expected before ')'"); in parens_expression()
85 return expect(token, ')', where); in parens_expression()
88 struct token *string_expression(struct token *token, struct expression **expr, const char *where) in string_expression() argument
90 struct token *next = primary_expression(token, expr); in string_expression()
93 sparse_error(token->pos, "string literal expected for %s", where); in string_expression()
100 * Handle __func__, __FUNCTION__ and __PRETTY_FUNCTION__ token
103 static struct symbol *handle_func(struct token *token) in handle_func() argument
105 struct ident *ident = token->ident; in handle_func()
119 array = alloc_symbol(token->pos, SYM_ARRAY); in handle_func()
122 array->endpos = token->pos; in handle_func()
123 decl = alloc_symbol(token->pos, SYM_NODE); in handle_func()
127 decl->endpos = token->pos; in handle_func()
138 decl->initializer = alloc_expression(token->pos, EXPR_STRING); in handle_func()
141 decl->array_size = alloc_const_expression(token->pos, len + 1); in handle_func()
148 static struct token *parse_type(struct token *token, struct expression **tree) in parse_type() argument
151 *tree = alloc_expression(token->pos, EXPR_TYPE); in parse_type()
152 token = typename(token, &sym, NULL); in parse_type()
154 sparse_error(token->pos, in parse_type()
158 return token; in parse_type()
161 static struct token *builtin_types_compatible_p_expr(struct token *token, in builtin_types_compatible_p_expr() argument
165 token->pos, EXPR_COMPARE); in builtin_types_compatible_p_expr()
167 token = token->next; in builtin_types_compatible_p_expr()
168 if (!match_op(token, '(')) in builtin_types_compatible_p_expr()
169 return expect(token, '(', in builtin_types_compatible_p_expr()
171 token = token->next; in builtin_types_compatible_p_expr()
172 token = parse_type(token, &expr->left); in builtin_types_compatible_p_expr()
173 if (!match_op(token, ',')) in builtin_types_compatible_p_expr()
174 return expect(token, ',', in builtin_types_compatible_p_expr()
176 token = token->next; in builtin_types_compatible_p_expr()
177 token = parse_type(token, &expr->right); in builtin_types_compatible_p_expr()
178 if (!match_op(token, ')')) in builtin_types_compatible_p_expr()
179 return expect(token, ')', in builtin_types_compatible_p_expr()
181 token = token->next; in builtin_types_compatible_p_expr()
184 return token; in builtin_types_compatible_p_expr()
187 static struct token *builtin_offsetof_expr(struct token *token, in builtin_offsetof_expr() argument
195 token = token->next; in builtin_offsetof_expr()
196 if (!match_op(token, '(')) in builtin_offsetof_expr()
197 return expect(token, '(', "after __builtin_offset"); in builtin_offsetof_expr()
199 token = token->next; in builtin_offsetof_expr()
200 token = typename(token, &sym, NULL); in builtin_offsetof_expr()
202 sparse_error(token->pos, in builtin_offsetof_expr()
206 if (!match_op(token, ',')) in builtin_offsetof_expr()
207 return expect(token, ',', "in __builtin_offset"); in builtin_offsetof_expr()
216 return expect(token, ')', "at end of __builtin_offset"); in builtin_offsetof_expr()
218 e = alloc_expression(token->pos, EXPR_OFFSETOF); in builtin_offsetof_expr()
224 token = token->next; in builtin_offsetof_expr()
225 e = alloc_expression(token->pos, EXPR_OFFSETOF); in builtin_offsetof_expr()
227 if (token_type(token) != TOKEN_IDENT) { in builtin_offsetof_expr()
228 sparse_error(token->pos, "Expected member name"); in builtin_offsetof_expr()
229 return token; in builtin_offsetof_expr()
231 e->ident = token->ident; in builtin_offsetof_expr()
232 token = token->next; in builtin_offsetof_expr()
235 token = token->next; in builtin_offsetof_expr()
236 e = alloc_expression(token->pos, EXPR_OFFSETOF); in builtin_offsetof_expr()
238 token = parse_expression(token, &e->index); in builtin_offsetof_expr()
239 token = expect(token, ']', in builtin_offsetof_expr()
242 return token; in builtin_offsetof_expr()
246 op = token_type(token) == TOKEN_SPECIAL ? token->special : 0; in builtin_offsetof_expr()
261 static void get_number_value(struct expression *expr, struct token *token) in get_number_value() argument
263 const char *str = token->number; in get_number_value()
336 show_token(token)); in get_number_value()
341 show_token(token), in get_number_value()
350 show_token(token)); in get_number_value()
358 show_token(token)); in get_number_value()
382 sparse_error(expr->pos, "constant %s is not a valid number", show_token(token)); in get_number_value()
388 static struct token *generic_selection(struct token *token, struct expression **tree) in generic_selection() argument
390 struct expression *expr = alloc_expression(token->pos, EXPR_GENERIC); in generic_selection()
393 token = expect(token, '(', "after '_Generic'"); in generic_selection()
394 token = assignment_expression(token, &expr->control); in generic_selection()
395 if (!match_op(token, ',')) { in generic_selection()
398 while (match_op(token, ',')) { in generic_selection()
399 token = token->next; in generic_selection()
400 if (lookup_type(token)) { in generic_selection()
402 token = typename(token, &map->type, NULL); in generic_selection()
403 token = expect(token, ':', "after typename"); in generic_selection()
404 token = assignment_expression(token, &map->expr); in generic_selection()
407 } else if (match_ident(token, &default_ident)) { in generic_selection()
409 warning(token->pos, "multiple default in generic expression"); in generic_selection()
412 token = token->next; in generic_selection()
413 token = expect(token, ':', "after typename"); in generic_selection()
414 token = assignment_expression(token, &expr->def); in generic_selection()
419 return expect(token, ')', "after expression"); in generic_selection()
422 struct token *primary_expression(struct token *token, struct expression **tree) in primary_expression() argument
426 switch (token_type(token)) { in primary_expression()
428 expr = alloc_expression(token->pos, EXPR_VALUE); in primary_expression()
430 expr->ctype = token_type(token) < TOKEN_WIDE_CHAR ? &int_ctype : &long_ctype; in primary_expression()
431 get_char_constant(token, &expr->value); in primary_expression()
432 token = token->next; in primary_expression()
436 expr = alloc_expression(token->pos, EXPR_VALUE); in primary_expression()
437 get_number_value(expr, token); /* will see if it's an integer */ in primary_expression()
438 token = token->next; in primary_expression()
442 expr = alloc_expression(token->pos, EXPR_SYMBOL); in primary_expression()
446 expr->symbol_name = token->ident; in primary_expression()
447 token = token->next; in primary_expression()
452 struct symbol *sym = lookup_symbol(token->ident, NS_SYMBOL | NS_TYPEDEF); in primary_expression()
453 struct token *next = token->next; in primary_expression()
456 sym = handle_func(token); in primary_expression()
457 if (token->ident == &__builtin_types_compatible_p_ident) { in primary_expression()
458 token = builtin_types_compatible_p_expr(token, &expr); in primary_expression()
461 if (token->ident == &__builtin_offsetof_ident) { in primary_expression()
462 token = builtin_offsetof_expr(token, &expr); in primary_expression()
465 if (token->ident == &_Generic_ident) { in primary_expression()
466 token = generic_selection(token->next, &expr); in primary_expression()
470 expr = alloc_expression(token->pos, EXPR_VALUE); in primary_expression()
473 expr->pos = token->pos; in primary_expression()
475 token = next; in primary_expression()
479 expr = alloc_expression(token->pos, EXPR_SYMBOL); in primary_expression()
488 sparse_error(token->pos, "typename in expression"); in primary_expression()
491 expr->symbol_name = token->ident; in primary_expression()
501 token = next; in primary_expression()
507 expr = alloc_expression(token->pos, EXPR_STRING); in primary_expression()
508 token = get_string_constant(token, expr); in primary_expression()
512 if (token->special == '(') { in primary_expression()
513 expr = alloc_expression(token->pos, EXPR_PREOP); in primary_expression()
515 token = parens_expression(token, &expr->unop, "in expression"); in primary_expression()
518 if (token->special == '[' && lookup_type(token->next)) { in primary_expression()
519 expr = alloc_expression(token->pos, EXPR_TYPE); in primary_expression()
520 token = typename(token->next, &expr->symbol, NULL); in primary_expression()
521 token = expect(token, ']', "in type expression"); in primary_expression()
529 return token; in primary_expression()
532 static struct token *expression_list(struct token *token, struct expression_list **list) in expression_list() argument
534 while (!match_op(token, ')')) { in expression_list()
536 token = assignment_expression(token, &expr); in expression_list()
540 if (!match_op(token, ',')) in expression_list()
542 token = token->next; in expression_list()
544 return token; in expression_list()
551 static struct token *postfix_expression(struct token *token, struct expression **tree, struct expre… in postfix_expression() argument
556 token = primary_expression(token, &expr); in postfix_expression()
558 while (expr && token_type(token) == TOKEN_SPECIAL) { in postfix_expression()
559 switch (token->special) { in postfix_expression()
561 struct expression *deref = alloc_expression(token->pos, EXPR_PREOP); in postfix_expression()
562 struct expression *add = alloc_expression(token->pos, EXPR_BINOP); in postfix_expression()
569 token = parse_expression(token->next, &add->right); in postfix_expression()
570 token = expect(token, ']', "at end of array dereference"); in postfix_expression()
576 struct expression *post = alloc_expression(token->pos, EXPR_POSTOP); in postfix_expression()
577 post->op = token->special; in postfix_expression()
580 token = token->next; in postfix_expression()
585 struct expression *inner = alloc_expression(token->pos, EXPR_PREOP); in postfix_expression()
592 struct expression *deref = alloc_expression(token->pos, EXPR_DEREF); in postfix_expression()
595 token = token->next; in postfix_expression()
596 if (token_type(token) != TOKEN_IDENT) { in postfix_expression()
597 sparse_error(token->pos, "Expected member name"); in postfix_expression()
600 deref->member = token->ident; in postfix_expression()
601 token = token->next; in postfix_expression()
607 struct expression *call = alloc_expression(token->pos, EXPR_CALL); in postfix_expression()
610 token = expression_list(token->next, &call->args); in postfix_expression()
611 token = expect(token, ')', "in function call"); in postfix_expression()
622 return token; in postfix_expression()
625 static struct token *cast_expression(struct token *token, struct expression **tree);
626 static struct token *unary_expression(struct token *token, struct expression **tree);
628 static struct token *type_info_expression(struct token *token, in type_info_expression() argument
631 struct expression *expr = alloc_expression(token->pos, type); in type_info_expression()
632 struct token *p; in type_info_expression()
636 token = token->next; in type_info_expression()
637 if (!match_op(token, '(') || !lookup_type(token->next)) in type_info_expression()
638 return unary_expression(token, &expr->cast_expression); in type_info_expression()
639 p = token; in type_info_expression()
640 token = typename(token->next, &expr->cast_type, NULL); in type_info_expression()
642 if (!match_op(token, ')')) { in type_info_expression()
648 return expect(token, ')', error[type]); in type_info_expression()
651 token = token->next; in type_info_expression()
656 if (match_op(token, '{')) { in type_info_expression()
661 token = initializer(&cast->cast_expression, token); in type_info_expression()
662 token = postfix_expression(token, &expr->cast_expression, cast); in type_info_expression()
664 return token; in type_info_expression()
667 static struct token *unary_expression(struct token *token, struct expression **tree) in unary_expression() argument
669 if (token_type(token) == TOKEN_IDENT) { in unary_expression()
670 struct ident *ident = token->ident; in unary_expression()
685 return type_info_expression(token, tree, type_information[i].type); in unary_expression()
690 if (token_type(token) == TOKEN_SPECIAL) { in unary_expression()
691 if (match_oplist(token->special, in unary_expression()
696 struct token *next; in unary_expression()
698 next = cast_expression(token->next, &unop); in unary_expression()
700 sparse_error(token->pos, "Syntax error in unary expression"); in unary_expression()
704 unary = alloc_expression(token->pos, EXPR_PREOP); in unary_expression()
705 unary->op = token->special; in unary_expression()
711 if (match_oplist(token->special, '+', '-', '~', '!', 0)) { in unary_expression()
714 struct token *next; in unary_expression()
716 next = cast_expression(token->next, &unop); in unary_expression()
718 sparse_error(token->pos, "Syntax error in unary expression"); in unary_expression()
722 unary = alloc_expression(token->pos, EXPR_PREOP); in unary_expression()
723 unary->op = token->special; in unary_expression()
729 if (match_op(token, SPECIAL_LOGICAL_AND) && in unary_expression()
730 token_type(token->next) == TOKEN_IDENT) { in unary_expression()
731 struct expression *label = alloc_expression(token->pos, EXPR_LABEL); in unary_expression()
732 struct symbol *sym = label_symbol(token->next, 1); in unary_expression()
737 check_label_usage(sym, token->pos); in unary_expression()
741 return token->next->next; in unary_expression()
746 return postfix_expression(token, tree, NULL); in unary_expression()
757 static struct token *cast_expression(struct token *token, struct expression **tree) in cast_expression() argument
759 if (match_op(token, '(')) { in cast_expression()
760 struct token *next = token->next; in cast_expression()
767 token = typename(next, &sym, &is_force); in cast_expression()
769 token = expect(token, ')', "at end of cast operator"); in cast_expression()
770 if (match_op(token, '{')) { in cast_expression()
776 token = initializer(&cast->cast_expression, token); in cast_expression()
777 return postfix_expression(token, tree, cast); in cast_expression()
782 token = cast_expression(token, &v); in cast_expression()
784 return token; in cast_expression()
786 return token; in cast_expression()
789 return unary_expression(token, tree); in cast_expression()
807 struct token * next = inner(__token, &left); \
832 static struct token *multiplicative_expression(struct token *token, struct expression **tree) in multiplicative_expression() argument
835 token, tree, EXPR_BINOP, cast_expression, in multiplicative_expression()
840 static struct token *additive_expression(struct token *token, struct expression **tree) in additive_expression() argument
843 token, tree, EXPR_BINOP, multiplicative_expression, in additive_expression()
848 static struct token *shift_expression(struct token *token, struct expression **tree) in shift_expression() argument
851 token, tree, EXPR_BINOP, additive_expression, in shift_expression()
856 static struct token *relational_expression(struct token *token, struct expression **tree) in relational_expression() argument
859 token, tree, EXPR_COMPARE, shift_expression, in relational_expression()
865 static struct token *equality_expression(struct token *token, struct expression **tree) in equality_expression() argument
868 token, tree, EXPR_COMPARE, relational_expression, in equality_expression()
873 static struct token *bitwise_and_expression(struct token *token, struct expression **tree) in bitwise_and_expression() argument
876 token, tree, EXPR_BINOP, equality_expression, in bitwise_and_expression()
881 static struct token *bitwise_xor_expression(struct token *token, struct expression **tree) in bitwise_xor_expression() argument
884 token, tree, EXPR_BINOP, bitwise_and_expression, in bitwise_xor_expression()
889 static struct token *bitwise_or_expression(struct token *token, struct expression **tree) in bitwise_or_expression() argument
892 token, tree, EXPR_BINOP, bitwise_xor_expression, in bitwise_or_expression()
897 static struct token *logical_and_expression(struct token *token, struct expression **tree) in logical_and_expression() argument
900 token, tree, EXPR_LOGICAL, bitwise_or_expression, in logical_and_expression()
905 static struct token *logical_or_expression(struct token *token, struct expression **tree) in logical_or_expression() argument
908 token, tree, EXPR_LOGICAL, logical_and_expression, in logical_or_expression()
913 struct token *conditional_expression(struct token *token, struct expression **tree) in conditional_expression() argument
915 token = logical_or_expression(token, tree); in conditional_expression()
916 if (*tree && match_op(token, '?')) { in conditional_expression()
917 struct expression *expr = alloc_expression(token->pos, EXPR_CONDITIONAL); in conditional_expression()
918 expr->op = token->special; in conditional_expression()
921 token = parse_expression(token->next, &expr->cond_true); in conditional_expression()
922 token = expect(token, ':', "in conditional expression"); in conditional_expression()
923 token = conditional_expression(token, &expr->cond_false); in conditional_expression()
925 return token; in conditional_expression()
928 struct token *assignment_expression(struct token *token, struct expression **tree) in assignment_expression() argument
930 token = conditional_expression(token, tree); in assignment_expression()
931 if (*tree && token_type(token) == TOKEN_SPECIAL) { in assignment_expression()
939 int i, op = token->special; in assignment_expression()
942 struct expression * expr = alloc_expression(token->pos, EXPR_ASSIGNMENT); in assignment_expression()
943 struct token *next = token->next; in assignment_expression()
947 token = assignment_expression(next, &expr->right); in assignment_expression()
948 if (token == next) in assignment_expression()
949 expression_error(expr, "expression expected before '%s'", show_token(token)); in assignment_expression()
950 return token; in assignment_expression()
953 return token; in assignment_expression()
956 static struct token *comma_expression(struct token *token, struct expression **tree) in comma_expression() argument
959 token, tree, EXPR_COMMA, assignment_expression, in comma_expression()
964 struct token *parse_expression(struct token *token, struct expression **tree) in parse_expression() argument
966 return comma_expression(token,tree); in parse_expression()