Esempio n. 1
0
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;
    }
}
Esempio n. 2
0
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;
    }
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}