diff options
Diffstat (limited to 'expression.c')
| -rw-r--r-- | expression.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/expression.c b/expression.c index 0ca6c19e..0d3f66f7 100644 --- a/expression.c +++ b/expression.c @@ -93,6 +93,21 @@ struct token *primary_expression(struct token *token, struct expression **tree) return token; } +static struct token *expression_list(struct token *token, struct expression_list **list) +{ + while (!match_op(token, ')')) { + struct expression *expr = NULL; + token = assignment_expression(token, &expr); + if (!expr) + break; + add_expression(list, expr); + if (!match_op(token, ',')) + break; + token = token->next; + } + return token; +} + static struct token *postfix_expression(struct token *token, struct expression **tree) { struct expression *expr = NULL; @@ -142,8 +157,8 @@ static struct token *postfix_expression(struct token *token, struct expression * case '(': { /* Function call */ struct expression *call = alloc_expression(token, EXPR_CALL); call->op = '('; - call->left = expr; - token = comma_expression(token->next, &call->right); + call->fn = expr; + token = expression_list(token->next, &call->args); token = expect(token, ')', "in function call"); expr = call; continue; @@ -331,7 +346,7 @@ struct token *assignment_expression(struct token *token, struct expression **tre int i, op = token->special; for (i = 0; i < sizeof(assignments)/sizeof(int); i++) if (assignments[i] == op) { - struct expression * expr = alloc_expression(token, EXPR_BINOP); + struct expression * expr = alloc_expression(token, EXPR_ASSIGNMENT); expr->left = *tree; expr->op = op; *tree = expr; |
