Expr* term_tail(const char* string, Expr* expr) { Expr* new_expr; switch(string[VAL_STRING]) { case '+': case '-': if(NULL == (new_expr = (Expr*)malloc(sizeof(Expr)))) { exit(1); } if(NULL == (new_expr->data.expr[1] = (Expr*)malloc(sizeof(Expr)))) { exit(1); } new_expr->op = eat_char(string, string[VAL_STRING]); new_expr->data.expr[0] = expr; new_expr->data.expr[1] = term(string, new_expr->data.expr[1]); new_expr = term_tail(string, new_expr); return new_expr; case ')': case 0: return expr; default: error_message(string);return NULL; } }
static exp_node *expression(void){ exp_node *expn = newExpNode(); if(match(TOKEN_LBRA, NO_CONSUME) || match(TOKEN_IDENTIFIER, NO_CONSUME) || match(TOKEN_LITERAL, NO_CONSUME)) if((expn->termn = term()) != NULL) if((expn->termtln = term_tail()) != error) return expn; freeExp(expn); return NULL; }
Expr* parse(const char* string) { Expr* expr; if(string[VAL_STRING] == '(' || isdigit(string[VAL_STRING])) { if(NULL == (expr = (Expr*)malloc(sizeof(Expr)))) { exit(1); } expr = term(string, expr); expr = term_tail(string, expr); return expr; } else { error_message(string);return NULL; } }
static term_tail_node *term_tail(void){ term_tail_node *termtln = newTermTailNode(); if((termtln->addOp = match(TOKEN_ADDOP, CONSUME)) != NULL){ if((termtln->termn = term()) != NULL) if((termtln->termtln = term_tail()) != error) return termtln; } else if(match(TOKEN_RBRA, NO_CONSUME) || match(TOKEN_SCOL, NO_CONSUME) || match(TOKEN_COMPOP, NO_CONSUME)){ freeTermTail(termtln); return NULL; } freeTermTail(termtln); return error; }