// mult_expr // mult_expr [+-] add_expr_list // int64_t add_expr() { int64_t val; val = mult_expr(); while (1) { switch(token) { case '+': NextToken(); val = val + mult_expr(); break; case '-': NextToken(); val = val - mult_expr(); break; default: goto j1; } } j1: return val; }
static struct ast_node* sum_expr(void) { struct ast_node *node; struct ast_node *rest_node; node = mult_expr(); if (node == NULL) return NULL; rest_node = rest_sum(node); return rest_node; }
static struct ast_node* rest_sum(struct ast_node *node) { struct ast_node *prev_node; struct ast_node *ret_node; struct ast_node *mult_node; char op; prev_node = node; while (TRUE) { switch(current_token) { case TOKEN_PLUS: op = '+'; break; case TOKEN_MINUS: op = '-'; break; default: goto exit_sum; } consume_token(); mult_node = mult_expr(); if (mult_node == NULL) { error_msg("error: syntax error"); mult_node = (struct ast_node *)ast_node_stub(); } prev_node = (struct ast_node *)ast_node_op(op, prev_node, mult_node); } exit_sum: ret_node = prev_node; return ret_node; }