Expr* factor_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] = factor(string, new_expr->data.expr[1]); new_expr = factor_tail(string, new_expr); return new_expr; case '+': case '-': case ')': case 0: return expr; default: error_message(string);return NULL; } }
Expr* term(const char* string, Expr* expr) { if(string[VAL_STRING] == '(' || isdigit(string[VAL_STRING])) { expr = factor(string, expr); expr = factor_tail(string, expr); return expr; } else { error_message(string);return NULL; } }
static term_node *term(void){ term_node *termn = newTermNode(); if(match(TOKEN_LBRA, NO_CONSUME) || match(TOKEN_IDENTIFIER, NO_CONSUME) || match(TOKEN_LITERAL, NO_CONSUME)) if((termn->facn = factor()) != NULL) if((termn->factln = factor_tail()) != error) return termn; freeTerm(termn); return NULL; }
static fac_tail_node *factor_tail(void){ fac_tail_node *factln = newFacTailNode(); if((factln->mulOp = match(TOKEN_MULOP, CONSUME)) != NULL){ if((factln->facn = factor()) != NULL) if((factln->factln = factor_tail()) != error) return factln; } else if(match(TOKEN_SCOL, NO_CONSUME) || match(TOKEN_ADDOP, NO_CONSUME) || match(TOKEN_RBRA, NO_CONSUME) || match(TOKEN_COMPOP, NO_CONSUME)){ freeFacTail(factln); return NULL; } freeFacTail(factln); return error; }